Red Hat Linuxはユーザープライベートグループ(UPG)体系を使用してUNIXのグループを使いやすくしています。UPG体系は、標準的なUNIXのグループ処理を変更したり何かを追加したりするものではありません。グループ処理に関する新しい取り決めを提供するのみです。デフォルトでは、新しいユーザーを作成した場合、そのユーザーは必ず固有のグループに属します。UPG体系は以下のように機能します。
各ユーザーはプライマリグループに属し、それぞれのユーザーのみがそのグループのメンバーとなります。
伝統的に、UNIXシステムではumaskは022なので、あるユーザーのファイルをそのユーザーのプライマリグループの他のメンバーや他のユーザーが修正することはできません。UPG体系では、すべてのユーザーが独自のプライベートグループを持つので、この「グループ保護機能」は必要ありません。umask 002によって、ユーザーが他のユーザーのプライベートファイルを修正することができなくなります。umaskの設定は/etc/profileで行われます。
ディレクトリにsetgidビットを設定(chmod g+s directoryによって)すると、そのディレクトリの中に作成されるファイルのグループとして、ディレクトリのグループが設定されることになります。
ほとんどのIT組織は、主要プロジェクトごとにグループを作成し、そのグループのファイルにアクセスする必要のある人をグループに割り当てることを好みます。このような伝統的な体系では、誰かがファイルを作成した場合に、作成者の属するプライマリグループがそのファイルの所有者になるため、ファイルの管理が困難でした。1人の人間が複数のプロジェクトに従事する場合、正しいファイルを正しいグループと関連付けるのは難しくなります。UPG体系では、グループはsetgidビットセットを持つディレクトリで作成されたファイルに自動的に割り当てられるため、ディレクトリを共有するグループプロジェクトの管理が非常に簡単になります。
たとえば、develという大きなプロジェクトがあり、大勢の人がdevelディレクトリ内のdevelファイルを編集しているとします。develという名前のグループを作成し、develディレクトリをdevelグループにchgrpし、develグループに関係するすべてのユーザーをdevelグループに追加します。
redhat-config-usersを使ってグループにユーザーに追加します(オフィシャル Red Hat Linuxカスタマイズガイドを参照)。コマンドラインを使いたいときは、/usr/sbin/groupadd groupnameコマンドを使用してグループを作成します。/usr/bin/gpasswd -a loginname groupnameコマンドは、グループにユーザーloginnameを追加します(オプションの詳細については、groupaddとgpasswdmanページを参照してください)。/etc/groupファイルには、システムに対するグループ情報が記載されています。
develグループを作成してユーザーを追加し、develディレクトリに対するグループをdevelグループに変更し、develディレクトリにsetgidビットを設定すると、すべてのdevelユーザーはdevelファイルを編集したり、このディレクトリ内に新しいファイルを作成したりすることができるようになります。作成されるファイルは常にdevelグループを保持するため、常に他のdevelプロジェクトのユーザーもそれらのファイルの編集を行うことができます。
また、このようなプロジェクトがいくつかあり、複数のプロジェクトに従事するユーザーがいる場合、それらのユーザーがプロジェクト間を移動する際に、umaskまたはグループを変更する必要がなくなります。各プロジェクトのメインディレクトリのsetgidビットが適切に設定されていれば、そのディレクトリで作成されるすべてのファイルに対して適切なグループが「選択」されます。
各ユーザーのホームディレクトリは、そのユーザーと、ユーザーのプライベートグループによって所有されるので、ホームディレクトリにsetgidビットを設定しておくのが安全です。ただし、デフォルトではファイルがユーザーのプライマリグループによって作成されるので、setgidビットは冗長になります。
UPGはRed Hat Linuxにとって新しいものではありませんが、多くの人は依然として、なぜUPGが必要なのかといった疑問を持っています。UPGを使用しないシステム上で次のシナリオを考えてみましょう。
/usr/lib/emacs/site-lispディレクトリに含まれるファイル群について作業する人のグループがあるとします。そのうちの何人かは信頼でき、ディレクトリに変更を加えても大丈夫ですが、すべての人がそうではないとします。
そこでまず次のように入力してemacsグループを作成します。
/usr/sbin/groupadd emacs |
次に、以下のように入力します。
chown -R root.emacs /usr/lib/emacs/site-lisp |
ディレクトリの内容をemacsグループに関連付け、次のようにグループに対応するユーザーを追加します。
/usr/bin/gpasswd -a <username> emacs |
このディレクトリ内に実際にファイルを作成する権限をユーザーに与えるには、次のように入力します。
chmod 775 /usr/lib/emacs/site-lisp |
ただし、ユーザーが新しいファイルを作成すると、そのファイルのグループとしてユーザーのデフォルトグループが割り当てられます(通常はusers)。これを回避するには、次を入力します。
chmod 2775 /usr/lib/emacs/site-lisp |
ただし、emacsグループに属する他のユーザーが編集できるようにするには、新しいファイルのモードを664とする必要があります。そうするには、デフォルトのumask 002を作成します。
これでほとんどがうまくいきます。しかし、デフォルトのグループがusersである場合には、ホームディレクトリ内に作成するすべてのファイルに対して、usersに属するすべての人(通常はすべての人)が書き込み権限を持つことになってしまいます。
これを修正するために、各ユーザーに「プライベートグループ」をデフォルトグループとして持たせます。
これで、デフォルトのumask 002を作成してすべての人にプライベートグループを与えることによって、ユーザーが利用できるグループを簡単にセットアップすることができ、ユーザーがグループの共有ディレクトリにファイルの書き込みを行うたびに追加作業をする必要はなくなります。単純にグループを作成し、ユーザーを追加し、グループのディレクトリについて上記のchownとchmodを実行すればよいのです。