kazmax - Linux で自宅サーバー

SGID(Set Group ID) - 特殊なアクセス権

SGID(Set Group ID)という特殊なアクセス権があります。このページでは、SGID(Set Group ID)について説明します。

Last Update : 2013年07月26日

SGID(Set Group ID) - 特殊なアクセス権 項目

  1. SGID(Set Group ID)とは
  2. SGID(Set Group ID)を設定する
  3. SGID(Set Group ID)を確認する
  4. 使用例

1. SGID(Set Group ID)とは

SGID(Set Group ID)とは、実行権のあるファイルに設定される特殊なアクセス権です。また、SUIDと異なり、ディレクトリにも設定されます。

実行ファイルにSGID(Set Group ID)が設定されている場合は、その実行ファイルを実行すると、実行ファイルの所有グループの権限でファイルが実行されます。

ディレクトリにSGID(Set Group ID)が設定されている場合は、そのディレクトリ配下に作成されたファイル・ディレクトリの所有グループが、SGID(Set Group ID)を設定されたディレクトリの所有グループと同じものになります。

2. SGID(Set Group ID)を設定する

SGID(Set Group ID)を設定するには、chmodコマンドで以下のように指定します。

chmod g+s file

数値モードでアクセス権を設定する場合には、数値に2000を足します。 例えばアクセス権が755の実行ファイルにSGID(Set Group ID)を追加したい場合の数値表記は、「2755」となります。

chmod 2755 file

memo

ディレクトリにSGID(Set Group ID)を設定する場合もオプションは同じです。

3. SGID(Set Group ID)を確認する

SGID(Set Group ID)を確認するには、「ls -l」コマンドで確認する事ができます。

# touch file
# chmod 2755 file
# ls -l file
-rwxr-sr-x 1 root group2 0  7月 26 08:24 file 

パーミッションのグループの部分が、「r-s」となっています。実行権の部分は、通常「x」ですが、ここが「s」になっているとSGID(Set Group ID)が設定されている事を意味します。

4. 使用例

実際に、SGID(Set Group ID)を設定して、動作を確認してみます。実行ファイルに設定した場合と、ディレクトリに設定した場合の両方をテストします。

実行ファイルに設定した場合

rootユーザーで。

# id
uid=0(root) gid=0(root) 所属グループ=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

# cp /bin/touch .     ← touchコマンドをコピー
# chgrp group1 touch  ← グループをgroup1にする
# chmod g+s touch     ← SGIDを設定
# ls -l touch
-rwxr-sr-x 1 root group1 42284  7月 26 08:28 touch ← SGIDが設定されている

# ./touch test.txt

# ls -l test.txt
-rw-r--r-- 1 root group1 0  7月 26 08:30 test.txt ← 所有グループがgroup1になった

memo

rootアカウントでコマンドを実行しているので、本来ならそのコマンドによってできたファイルのグループはrootになる。 touchコマンドにSGIDが設定されている為、コマンドがroot:group1として実行され、作成されたファイルのグループがgroup1となった。

ディレクトリに設定した場合

ディレクトリにSGIDを設定した場合は、その配下に作成したファイル・ディレクトリが、SGIDが設定されているディレクトリの所有グループになります。

# mkdir dir        ← ディレクトリ作成
# chgrp group1 dir ← 所有グループをgroup1にする
# chmod g+s dir    ← SGIDを設定

# ls -ld dir
drwxr-sr-x 2 root group1 4096  7月 26 08:33 dir  ← グループがgroup1のSGID設定されたディレクトリ

# touch dir/test.txt     ← rootアカウントで、dirディレクトリ配下へファイル作成
# mkdir dir/test_dir     ← rootアカウントで、dirディレクトリ配下へディレクトリ作成
# ls -l dir
合計 12
-rw-r--r-- 1 root group1    0  7月 26 08:33 test.txt     ← グループがgroup1になっている
drwxr-sr-x 2 root group1 4096  7月 26 08:34 test_dir     ← グループがgroup1になっている

memo

SGID設定されたディレクトリ配下に作成したディレクトリにも、SGIDが設定されます。セキュリティ問題とかありそうで使いどころに悩みます。

Linux 基礎知識 関連記事