生成されたファイルを他の人が読めないようにすることは可能ですか?

生成されたファイルを他の人が読めないようにすることは可能ですか?

ユーザーuid = 1000およびguids = 1000,33,277がフォルダにファイルを作成できるとします/files/。このユーザーが他の人がファイルを読み取ることを許可しないようにする方法はありますか(少なくともグループ1000、33、または277を除く)。

生成されたファイルについては、/files/user1000.file次のように具体的に質問できます。

このような結果を避ける方法はありますか?ls /files/user1000.file -al

-rw-rw-r-- 1 1000 1000 6 May 15 17:21 user1000.file

そしてこれを次に変えてください:

-rw-rw---- 1 1000 1000 6 May 15 17:21 user1000.file

たぶん使用しますかumask?私はsetgidのようなものがあることを知っているので、drw-rws---方法があると楽観的です。

私はそれがユーザーがこれを行うことに決めたかどうかにかかっていると思いますchmod o+rw user1000.file

答え1

問題には、わずかに異なるシナリオを扱う2つの可能な解決策があります。

最初は使用しますumask。これマスクカーネルにアクセスビットを通知する値です。明らか新しく作成されたファイルでは(これは主にopen(2)システムコールに影響します。新しく作成されたファイルをcreat(2)明示的に呼び出すことで、umask値を使用してアクセスビットを「禁止」に設定できます)。chmod(2)したがって、umaskをに設定すると、0ファイルを生成したプログラムによって要求されたすべてのアクセスビットが設定されます。に設定すると、04777すべてのビットがクリアされます。

ほとんどの場合、デフォルトのumask値はです022。これは、グループと他のすべての人に対する書き込み権限がクリアされることを意味します。

したがって、問題を解決するには、umask値をに設定すると、生成されたすべての027ファイルがグループの書き込みアクセス権を削除し、他のファイルのすべてのビットを消去できます。

$ umask
022
$ touch testfile.022
$ ls -l testfile.022
-rw-r--r-- 1 user user 0 May 15 18:56 testfile.022
$ umask 027
$ touch testfile.027
$ ls -l testfile.027
-rw-r----- 1 user user 0 May 15 18:57 testfile.027

umask起動するすべてのシェルでこれを設定するには、シェルの起動ファイルの1つ(または~/.profile起動~/.bashrcに適した場所)に適切な呼び出しを入れます。

別のアプローチは、これらのビットをクリアしたいディレクトリでデフォルトのアクセス制御リスト(ACL)を使用することです。まず、ディレクトリレベルでより粒度を追加しumask、次にすべての人に適用されます(グローバル値を変更する必要はありませんumask)。

$ umask
022
$ mkdir acldir
$ cd acldir
$ getfacl .
# file .
# owner: user
# group: user
user::rwx
group::r-x
other::r-x
$ ls -la
total 12
drwxr-xr-x  2 user user    6 May 15 19:11 .
drwxr-xr-x 83 user user 8192 May 15:19:08 ..
$ touch testfile.noacl
$ ls -l testfile.noacl
-rw-r--r-- 1 user user 0 May 15 19:14 testfile.noacl
$ setfacl    -m 'user::rwx,group::r-x,other::---' .
$ setfacl -d -m 'user::rwx,group::r-x,other::---' .
# file: .
# owner: user
# group: user
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:other::---
$ touch testfile.acl
$ ls -l testfile.acl
-rw-r----- 1 user user 0 May 15 19:16 testfile.acl

ご覧のとおり、デフォルトのACLを使用すると、testfile.aclumask値がに設定されていても他のアクセスビットはクリアされます022

ACLの詳細については、以下を確認してください。アクセス制御リスト(5)マンページ。

編集する:ファイル所有者がファイルで明示的に作業するのを防ぐために、chown(2)標準に準拠する方法では不可能だと思います(POSIXに関する限り)。 )。システムコールを傍受してフィルタリングできますが、追加の設定が必要な複数のセキュリティフレームワークがあります。そのうちのいくつかは次のとおりです。

  • SELinux(まだ使用していませんが、かなり一般的に使用可能です。たとえば、RedHatでデフォルトで使用されています)
  • RSBAC(重い構成コストは安価ですが、特定のユーザーが実行できるタスクと実行できないタスクを非常にきめ細かく制御できます。
  • AppArmor(Ubuntuがこれを使うと思います)

答え2

はい、とても簡単にできます。umaskデフォルト値を設定するだけです~/.profile(または/etc/profileすべてのユーザーのデフォルト値を変更したい場合)。

umask 0007

これにより、必要に応じて新しいファイルが作成されます。

$ touch user1000.file
$ ls -l user1000.file 
-rw-rw---- 1 terdon terdon 0 May 15 18:56 user1000.file

これについての詳細はumask一般的に素晴らしいです、アーチウィキページこのトピックについて。

関連情報