web-dev-qa-db-ja.com

ディレクトリ内のすべての新しいファイルをグループがアクセスできるようにする

2人のユーザーAliceとBob、グループGROUPNAMEとフォルダーfooがあるとします。両方のユーザーがGROUPNAMEのメンバーです(Linuxとext3を使用)。

ユーザーAliceとしてファイルをfooの下に保存すると、権限は-rw-r--r-- Alice Aliceになります。ただし、fooのいくつかのサブディレクトリに保存されているすべてのファイルに-rwxrwx--- Alice GROUPNAME(所有者Alice、グループGROUPNAME)の権限があることを達成することはできますか?

132
student

ディレクトリsetgidumaskにすることにより、割り当てられた許可ビットを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はプロセス属性であり、そのプロセスとその子によって作成されたすべてのファイルに適用されることに注意してください(これは、umaskfork()時に親で有効に継承します) 。ユーザーは、これを_~/.profile_で設定する必要がある場合があり、ディレクトリに関係のない、異なる権限が必要なものに注意する必要がある場合があります。 modules は、さまざまなことを行うときにさまざまな設定が必要な場合に役立ちます。

POSIX ACLを使用できる場合は、もう少し良い方法で制御できます。アクセス許可マスクとグループの両方を指定して、それらを慎重に伝播させることができるはずです。ただし、POSIX ACLのサポートは多少異なります。

96
geekosaur

可能な限り、 アクセス制御リスト(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
24
Faheem Mitha