複数のユーザーが共有するデータを含むディレクトリがあります。ディレクトリとその下のすべてのコンテンツへのアクセスは、そのユーザーに追加されるディレクトリグループによって制御されます。したがって、「固定グループ」chmod g+s
フォルダセットを作成しました。ディレクトリには、ディレクトリとファイルのツリー構造が含まれており、ファイルの総数は数百万になります。ファイルがかなり小さく、50MBを超えるとは予想されません。
私の問題は、ファイルまたはディレクトリの所有者がまだそれを作成したユーザーであることです。したがって、アクセス グループからユーザーを削除する必要があっても、そのユーザーのアクセス権を完全に削除するわけではありません。
だから:
すべてのファイルとサブディレクトリの所有者が同じであることを確認するために、他に欠けているオプションはありますか?
cron-jobを使用してディレクトリ全体を定期的に検索できることをお勧めしますが、これは本質的にワンタイムpr-fileコマンドと比較して非効率的です。
私が一つ見つけたはいINotifyを使用していますが、スクリプトが必要なため、メンテナンスが必要なようです。
ACLが所有権を強制するのに役立つことを確認できませんでした。
これを行うより賢い方法はありますか?
私が望むのは、ユーザーにグループを追加して共有できるディレクトリを持つことです。このディレクトリに作成されたすべてのエントリは、親ディレクトリの権限スキームを継承します。私が試してみるよりも良い方法があれば、私はすべて耳を傾けます。
答え1
setuid
デフォルトの所有者を「自動」に設定するには、同様の動作が必要ですsetgid
。ただし、FreeBSDではこれを設定できますが、他のUNIXおよびLinuxシステムではこれを無視しますu+s
。ただし、お客様の場合は他の解決策があるかもしれません。
私が望むのは、ユーザーにグループを追加して共有できるディレクトリを持つことです。このディレクトリに作成されたすべてのエントリは、親ディレクトリの権限スキームを継承します。私が試してみるよりも良い方法があれば、私はすべて耳を傾けます。
したがって、基本的に私が理解しているように、グループメカニズムを使用してディレクトリへのアクセスを制御したいと思います。ただし、ディレクトリ構造全体の権限を制限する必要はありません。実際には、ディレクトリ--x
実行ビットがあなたに必要なものかもしれません。たとえば、見てみましょう。もしそうなら...
- ディレクトリアクセスを制御するグループ
group_dir
はですourgroup
。 - グループに属する人だけが
ourgroup
アクセスできますgroup_dir
。 user1
そしてuser2
に属していますourgroup
。- デフォルトのumaskは0022です。
...次の設定を検討してください。
drwxrws--- root:ourgroup |- group_dir/
drwxr-sr-x user1:ourgroup |---- group_dir/user1_submission/
drwxr-sr-x user2:ourgroup |---- group_dir/user2_submission/
-rw-r--r-- user2:ourgroup |-------- group_dir/user2_submission/README
ここでは、各プロジェクトが所有者によって作成されると仮定します。
これで、この設定では次のようになります。
- 誰もが任意のディレクトリを自由に閲覧できます
ourgroup
。グループに所属する人は誰でもgroup_dir
内部のどこからでもファイルを作成、移動、削除できます(より深いところは不可能)。 - そこにいない人は
ourgroup
そこからブロックされるので、group_dir
その下にあるどんな作業も実行できません。たとえば、user3
(のメンバーではない)は、ファイル自体に対する権限がある場合でも読み取ることはourgroup
できません。group_dir/user2_submission/README
r--
しかし、この場合には小さな問題があります。一般的なumaskのため、ユーザーが作成したプロジェクトをグループの他のメンバーが操作できません。これがACLが機能する場所です。デフォルト権限を設定すると、umaskの値に関係なくすべてが機能するようにできます。
$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/
この呼び出しは以下を設定します。
rw(x)
所有者の基本権限です。rw(x)
グループの基本権限です。- 他のユーザーにはデフォルトで権限がありません。以降から参考にしてください他の人とにかくアクセスできず
group_dir
、現在より低い権限を持っていることは重要ではありません。
プロジェクトを作成すると、次のようになりますuser2
。
$ touch group_dir/user2_submission/AUTHORS
$ ls -l group_dir/user2_submission/AUTHORS
rw-rw---- user2:ourgroup group_dir/user2_submission/AUTHORS
このACLを使用して古い構造を再構築できます。
drwxrws---+ root:ourgroup |- group_dir/
drwxrws---+ user1:ourgroup |---- group_dir/user1_submission/
drwxrws---+ user2:ourgroup |---- group_dir/user2_submission/
-rw-rw----+ user2:ourgroup |-------- group_dir/user2_submission/README
同様に、すべてのアイテムは所有者によって作成されます。
また、ディレクトリを使用しているユーザーにより強力な機能/セキュリティを提供したい場合は、固定ビットを検討することができます。たとえば、次のようにするとuser1
削除が防止されます(user2_submission
彼が持っている-w-
権限のためgroup_dir
)。
$ chmod +t group_dir/
今、ディレクトリをuser1
削除しようとするとuser2
素晴らしいですOperation not permitted
。group_dir
user1@host $ rm -r user2_submission
Operation not permitted
user1@host $ > user2_submission/README
user1@host $ file user2_submission/README
user2_submission/README: empty (uh-oh)
考慮すべきもう一つのことは、私たちが使用するACL設定です。基本権限。したがって、プロジェクトの所有者はそれに関連する権限を変更できます。たとえば、user2
完璧に動作します...
$ chown g= user2_submission/ -R
or
$ chgrp nobody user2_submission -R
...だから彼の完全なコミットディレクトリはグループのどれも使用できません。
ただし、最初はグループの全員に完全なアクセス権を付与しようとしたため、rws
これらのユーザーを信頼し、彼らが悪意のある作業を実行することを期待していないとします。
答え2
これを行うより賢い方法があります。 set-gidを使って基本ACL明らかにaclサポートファイルシステムが必要です。共有したいディレクトリがあり、/var/grpdir
グループメンバーがsharing
そのディレクトリにアクセスできる必要があるとします。
chown root:sharing /var/grpdir
chmod 2770 /var/grpdir #other can't read or traverse into the directory, set-gid is set
setfacl -d -m u::rwX,g::rwX,o::0 /var/grpdir
デフォルトACLは、デフォルトACLを使用してディレクトリ内に作成されたサブディレクトリに継承されます。つまり、生成されたすべてのファイルには、/var/grpdir
ディレクトリのsetgidビットを通じてグループが設定されるという意味です。sharing
また、特定のユーザーまたはグループにACLを指定しないため、デフォルトのLinuxスタイル権限をオーバーライドするデフォルトのACLを継承します。これは、すべてのファイルが<user>:sharing
所有権と権限で作成されることを意味しますrw-rw----
。ディレクトリは、デフォルトのACLが上位()と同じに設定され、/var/grpdir
ユーザーとグループに対して実行可能なビットが設定されていることを除いて同じです。グループからユーザーを削除すると、sharing
そのユーザーはディレクトリ(またはディレクトリを所有していてもディレクトリ内のファイル)にアクセスできなくなります。
定期的に権限を変更するためにcronjobを使用するのとは異なり、権限は新しく作成されたファイルとディレクトリに自動的に更新されるため、常に同期されます。この解決策は軽いです。デーモンは必要なく、権限を一度に変更するときにIOスパイクはありません。
答え3
私はこれを行う良い方法を知りません。これを達成するための技術的に最も簡単な方法は、FUSEファイルシステムを使用することです。もちろん、まだ誰もやっていないなら、やるべきことがたくさん残っています。
代替:
Sambaを使用してください。 Sambaには
force user
パラメータがあります。ディレクトリをローカルにエクスポートしてローカルにマウントできます。より速くアクセスすることはできませんが、ループバックネットワークのみが含まれているため、許可できます。FAT32のようなLinux以外のファイルシステムを使用してください。これをインストールするには、ユーザーが構成する必要があります。アクセス権は親ディレクトリで処理する必要があります。
答え4
あなたはそれを使用することができますイノティファイツール以下のように単純なbashスクリプトを作成します。 Inotifyはこのディレクトリを注意深く観察します。ネットワークこのようなことがあるたびに何とかしてください。 ディレクトリの作成Webディレクトリで発生します。多くのイベントが存在します。 Googleで試してみてください。場所
while inotifywait -m -e CREATE web; do echo "A new directory has been created"; done