2人のユーザーAliceとBob、グループGROUPNAMEとフォルダーfoo
があるとします。両方のユーザーがGROUPNAMEのメンバーです(Linuxとext3を使用)。
ユーザーAliceとしてファイルをfoo
の下に保存すると、権限は-rw-r--r-- Alice Alice
になります。ただし、foo
のいくつかのサブディレクトリに保存されているすべてのファイルに-rwxrwx--- Alice GROUPNAME
(所有者Alice、グループGROUPNAME)の権限があることを達成することはできますか?
ディレクトリsetgidをumask
にすることにより、割り当てられた許可ビットをGROUPNAME
とグループで制御できます。
_$ umask 002 # allow group write; everyone must do this
$ chgrp GROUPNAME . # set directory group to GROUPNAME
$ chmod g+s . # files created in directory will be in group GROUPNAME
_
すべてのサブディレクトリに対してchgrp
/chmod
を実行する必要があることに注意してください。自動的には伝播しません(つまり、setgidディレクトリの下に存在するディレクトリもその後作成されるディレクトリもsetgidになります、後者はグループGROUPNAME
に含まれます)。
また、umask
はプロセス属性であり、そのプロセスとその子によって作成されたすべてのファイルに適用されることに注意してください(これは、umask
をfork()
時に親で有効に継承します) 。ユーザーは、これを_~/.profile
_で設定する必要がある場合があり、ディレクトリに関係のない、異なる権限が必要なものに注意する必要がある場合があります。 modules は、さまざまなことを行うときにさまざまな設定が必要な場合に役立ちます。
POSIX ACLを使用できる場合は、もう少し良い方法で制御できます。アクセス許可マスクとグループの両方を指定して、それらを慎重に伝播させることができるはずです。ただし、POSIX ACLのサポートは多少異なります。
可能な限り、 アクセス制御リスト(ACL) を使用してください。
Linuxでは、使用しているファイルシステムがACLをサポートしていることを確認してください(ほとんどのUNIXファイルシステムがサポートしています)。 ACLを有効にするには、マウントオプションを変更する必要がある場合があります。ext2/ ext3/ext4では、acl
マウントオプションを明示的に指定する必要があるため、/etc/fstab
のエントリは/dev/sda1 / ext4 errors=remount-ro,acl 0 1
のようになります。 mount -o remount,acl /
を実行して、再起動せずにACLをアクティブにします。また、ACLコマンドラインツールgetfacl
およびsetfacl
もインストールします。これらは通常、acl
というパッケージで提供されます。
ワンタイムセットアップが終了したので、ディレクトリのACLを変更して、グループに書き込み権限を与え、これらの権限を新しく作成されたファイルに継承させます。 Linuxの場合:
setfacl -d -m group:GROUPNAME:rwx /path/to/directory
setfacl -m group:GROUPNAME:rwx /path/to/directory
ACLがオプションでない場合は、ディレクトリをグループGROUPNAME
が所有するようにし、その権限を2775または2770に設定します:chmod g+rwxs /path/to/directory
。ここでのs
はsetgidビットを意味します。ディレクトリの場合、このディレクトリで作成されたファイルは、そのディレクトリを所有するグループに属します。
また、AliceとBobの mask を設定して、すべてのファイルをデフォルトでグループ書き込み可能にする必要があります。ほとんどのシステムのデフォルトのumaskは022です。つまり、ファイルは、グループおよびその他による書き込み以外のすべての権限を持つことができます。これを002に変更します。これは、他のユーザーによる書き込み権限のみを禁止することを意味します。通常は、その設定を~/.profile
に入れます。
umask 002 # or 007 to have files not readable by others
この質問はLinux acl
に適しています。あなたはあなたのOSを述べていないので、以下ではLinuxを想定します。以下はセッションの例です。
私は本当に良いacl
チュートリアルを知りませんが、あなたは http://www.vanemery.com/Linux/ACL/linux-acl.html よりも悪いことをすることができます
デフォルトのacl
はローカルのumaskのように動作することに注意してください。少なくともLinuxではumaskがグローバルに適用されるため、これがローカルumaskの効果を得る唯一の方法です。何らかの理由で、これはほとんど知られていない機能です。ネットはローカルのumaskオーバーライドについて質問する人でいっぱいですが、ほとんど誰もacl
の使用を考えているようには見えません。
また、acl
サポートを使用して、作業中のパーティションをマウントする必要があることにも注意してください。
/dev/mapper/debian-acl /mnt/acl ext3 defaults,acl 0 2
セッションは次のとおりです。
/mnt/acl$ mkdir foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: faheem
user::rwx
group::r-x
other::r-x
foo
のグループをstaff
に設定し、foo
のグループとユーザーのACLをrwx
に設定します。
/mnt/acl$ chgrp staff foo
/mnt/acl$ setfacl -R -m u::rwx,g::rwx foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
ユーザーとグループのデフォルトACLをrwx
にも設定します。これは、ファイルとディレクトリがfoo
から継承する権限を定義します。したがって、fooの下に作成されたすべてのファイルとディレクトリには、グループ権限rw
が付与されます。
/mnt/acl$ setfacl -d --set u::rwx,g::rwx,o::- foo
/mnt/acl$ getfacl foo
# file: foo
# owner: faheem
# group: staff
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::---
次に、foo
にユーザーfaheem
およびjohn
としていくつかのファイルを作成します。
/mnt/acl$ cd foo
/mnt/acl/foo$ touch bar
# switch to user john for this next command.
/mnt/acl/foo$ touch baz
ファイルを一覧表示します。 faheem
が所有するファイルとjohn
が所有するファイルの両方が、グループ権限rw
で作成されていることに注意してください。
/mnt/acl/foo$ ls -la
total 3
drwxrwxr-x+ 2 faheem staff 1024 May 9 01:22 .
drwxr-xr-x 4 faheem faheem 1024 May 9 01:20 ..
-rw-rw---- 1 faheem faheem 0 May 9 01:20 bar
-rw-rw---- 1 john john 0 May 9 01:22 baz