web-dev-qa-db-ja.com

複数のユーザーが同じファイルのchmod()にアクセスできるようにするにはどうすればよいですか?

複数のユーザーが同じファイルをchmodするアプリケーションを実行しているシステムがあります。 setaclを使用して、ファイルのユーザー所有者として両方のユーザーを追加しようとしましたが、機能しません。 chmodシステムコールが失敗したため、アプリケーションはエラーになります。

例を参照してください:

[jacob@macbook-debian ~/Projects/test] getfacl bin/testfile
# file: bin/testfile
# owner: root
# group: root
user::rwx
user:jacob:rwx
user:jason:rwx
group::r-x
group:www-data:rwx
mask::rwx
other::r-x


[jacob@macbook-debian ~/Projects/test] chmod 0755 bin/testfile
chmod: changing permissions of 'bin/testfile': Operation not permitted
3
Jacob Brown

Linux ACLでは、ユーザーを追加するときに、ファイルの所有者としてユーザーを追加しません。そのファイルを開いたり、変更したり、書き込んだりするのは特権です。
chownまたはchmodを呼び出すと、有効なユーザーIDは次のようになります。 jacobそしてそれはownerの値と照合されます。それが一致しない場合、コマンドは失敗します。

man 2 chmodから。

呼び出し側プロセスの有効なUIDは、ファイルの所有者と一致する必要があります。または、プロセスに特権が必要です(Linux:CAP_FOWNER機能が必要です)。

別の方法は、呼び出し元のプロセス/バイナリchmodに説明されているように機能を設定することです。しかし、誰もがこのコマンドを使用して権限を変更できるため、これは大きなセキュリティ問題を引き起こします。
ここ は、ユーザーの機能アクセスをより細かくしたスレッドですが、それほど単純ではないようです。

ユースケースの制約に応じて、ユーザーがSudoを使用するためのchmodルールを追加するか、ユーザーがchmodを実行する必要がある理由を評価することができます。彼らが所有していないファイル。たぶん、ファイルの作成中にumaskを使用するだけで十分です。

ユーザーがディレクトリへの書き込み権限を持つグループに属している場合は、問題のファイルをコピーし、元のファイルを削除して、そのコピーを元の名前に移動することもできます。これにより、ユーザーはコピーされたファイルを所有し、chmodを実行できるようになります。

[user@localhost testdir]$ ll
total 12K
drwxrwxr-x  2 root user 4.0K Jul 14 11:49 .
drwxr-xr-x  3 user user 4.0K Jul 14 11:47 ..
-rw-rw----+ 1 root user    5 Jul 14 11:41 testfile
[user@localhost testdir]$ getfacl testfile 
# file: testfile
# owner: root
# group: user
user::rw-
user:user:rw-
group::rw-
group:user:rw-
mask::rw-
other::---

[user@localhost testdir]$ chmod 777 testfile
chmod: changing permissions of 'testfile': Operation not permitted
[user@localhost testdir]$ cp -a testfile testfile.copy
[user@localhost testdir]$ getfacl *
# file: testfile
# owner: root
# group: user
user::rw-
user:user:rw-
group::rw-
group:user:rw-
mask::rw-
other::---

# file: testfile.copy
# owner: user
# group: user
user::rw-
user:user:rw-
group::rw-
group:user:rw-
mask::rw-
other::---

[user@localhost testdir]$ mv testfile.copy testfile
[user@localhost testdir]$ ll
total 12K
drwxrwxr-x  2 root user 4.0K Jul 14 11:50 .
drwxr-xr-x  3 user user 4.0K Jul 14 11:47 ..
-rw-rw----+ 1 user user    5 Jul 14 11:41 testfile

[user@localhost testdir]$ chmod 777 testfile
[user@localhost testdir]$ ll
total 12K
drwxrwxr-x  2 root user 4.0K Jul 14 11:50 .
drwxr-xr-x  3 user user 4.0K Jul 14 11:47 ..
-rwxrwxrwx+ 1 user user    5 Jul 14 11:41 testfile
5
Thomas