【Linux】SGID
SGID(Set Group ID)とは
SGID (Set Group ID) とは、ファイルが実行されるときに、そのファイルのグループの権限で実行されるようにする特殊なファイルアクセス権です。また、ディレクトリに設定されると、新しく作成されるファイルやディレクトリが親ディレクトリのグループを継承するようになります。
wallコマンドのアクセス権
wall コマンドは、全ユーザーに対してメッセージを送信するためのコマンドです。このコマンドもSGIDビットが設定されています。
ファイル | アクセス権 |
---|---|
/usr/bin/wall | -rwxr-sr-x |
wallコマンドのアクセス権の確認
user01@ubuntu-vm:~$ which wall
/usr/bin/wall
user01@ubuntu-vm:~$ ls -l /usr/bin/wall
-rwxr-xr-x 1 root root 22912 4月 10 00:32 /usr/bin/wall
一般ユーザーがwallコマンドを実行して全ユーザーにメッセージを送信できるのは、wall コマンドがSGIDビットを持っているためです。SGIDビットが設定されていることで、wall コマンドが実行されると、そのコマンドはファイルのグループ権限で実行されます。これにより、適切なグループ権限を利用してメッセージを全ユーザーに送信することができます。
SGIDの設定方法
SGIDを設定するには、下表のように設定します。以下のコマンドを使用します。
ファイル/ディレクトリ | 数値モードでのSGID設定 | 記号モードでのSGID設定 |
---|---|---|
ファイルのSGID設定 | chmod 2755 filename | chmod g+s filename |
ディレクトリのSGID設定 | chmod 2755 directory | chmod g+s directory |
ファイルのSGID解除 | chmod 0755 filename | chmod g-s filename |
ディレクトリのSGID解除 | chmod 0755 directory | chmod g-s directory |
数値モードでのSGID設定
- 2xxx の形式でSGIDビットを設定します。たとえば、「
chmod 2755 filename
」のように、先頭の2
はSGIDビットを設定することを示します。残りの3桁は通常のファイル権限(所有者、グループ、その他)を表します。 - 「
chmod 2755 directory
」は、ディレクトリにSGIDビットを設定し、ディレクトリ内のファイルとディレクトリが親ディレクトリのグループIDを継承するようにします。
記号モードでのSGID設定
- 「
chmod g+s filename
」の形式でSGIDビットを設定します。g+s
はグループの実行権限にSGIDビットを追加することを意味します。 - 「
chmod g+s directory
」は、ディレクトリにSGIDビットを設定します。
SGIDビットの解除
- SGIDビットを解除するには、数値モードでは先頭の
2
を削除し、記号モードではs
を削除します。 - たとえば、「
chmod 0755 filename
」または「chmod g-s filename
」でファイルのSGIDビットを解除します。 - 同様に、「
chmod 0755 directory
」または「chmod g-s directory
」でディレクトリのSGIDビットを解除します。
共有ディレクトリの作成
SGIDは、ディレクトリに付与することで、グループの共有ディレクトリを作成することができます。この設定により、新しく作成されるファイルやディレクトリは親ディレクトリのグループを継承し、グループ内のメンバーがアクセスしやすくなります
ディレクトリ作成
mkdir /shared
グループを設定
chgrp devs /shared
SGIDビットを設定
chmod g+s /shared
パーミッションを設定
chmod 2770 /shared
これにより、「/shared
」ディレクトリ内で作成されるすべてのファイルとディレクトリは 「devs
」グループに自動的に属するようになります。
例)共有ディレクトリの作成
ここで、具体的に共有ディレクトリを作成してみます。
現在、user01でログインしています。user01の権限で共有ディレクトリ「sgid_dir」を作成したあと、rootユーザーに切り替えて、その中にファイルを作成します。そして、そのファイルのグループ情報を確認します。
まず、以下のコマンドを実行して、「sgid_dir」を作成して、SGIDを付与します。作成したディレクトリのディレクトリ情報を確認します。
user01@ubuntu-vm:~$ mkdir /tmp/sgid_dir
user01@ubuntu-vm:~$ chmod 2775 /tmp/sgid_dir # 作成したディレクトリにSGIDを付与する
user01@ubuntu-vm:~$ ls -ld /tmp/sgid_dir
drwxrwsr-x 2 user01 user01 4096 6月 12 23:51 /tmp/sgid_dir
「sgid_dir」ディレクトリのアクセス権にsgidが付与されており、所有グループが「user01」であることが分ります。
drwxrwsr-x 2 user01 user01 4096 6月 12 23:51 /tmp/sgid_dir
rootユーザーに切り替えて、「root」ファイルを作成します。そして、そのファイルのグループ情報を確認します。
次のコマンドを実行します。
user01@ubuntu-vm:~$ su -
パスワード:
root@ubuntu-vm:~# touch /tmp/sgid_dir/root
root@ubuntu-vm:~# ls -l /tmp/sgid_dir/root
-rw-r--r-- 1 root user01 0 6月 13 00:14 /tmp/sgid_dir/root
「root」ファイルのグループが共有ディレクトリと同じグループ「user01」であることが確認できます。
-rw-r--r-- 1 root user01 0 6月 13 00:14 /tmp/sgid_dir/root