【Linux】SGID

SGID(Set Group ID)とは

 SGID (Set Group ID) とは、ファイルが実行されるときに、そのファイルのグループの権限で実行されるようにする特殊なファイルアクセス権です。また、ディレクトリに設定されると、新しく作成されるファイルやディレクトリが親ディレクトリのグループを継承するようになります。

wallコマンドのアクセス権

 wall コマンドは、全ユーザーに対してメッセージを送信するためのコマンドです。このコマンドもSGIDビットが設定されています。

ファイルアクセス権
/usr/bin/wall-rwxr-sr-x
wallコマンドのアクセス権

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 filenamechmod g+s filename
ディレクトリのSGID設定chmod 2755 directorychmod g+s directory
ファイルのSGID解除chmod 0755 filenamechmod g-s filename
ディレクトリのSGID解除chmod 0755 directorychmod g-s directory
SGIDの設定方法

数値モードでの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