Infra Engineer

特殊なパーミッションについて
2022.07.26
Lv1

特殊なパーミッションについて

本記事の対象者

LPIC level1習得を目指す初学者の方
コマンドの基本的な用途について、要点を絞って解説します。


今回の内容

今回は、Linuxの特殊なファイルパーミッションについて解説します。


・特殊なファイルパーミッション

・SUID
・SGID
・スティッキービット
・まとめ
・確認問題

特殊なファイルパーミッション

ファイルパーミッションについて」で解説した基本のファイルパーミッション以外に、Linuxには以下のような特殊なパーミッションがあります。

名称 記号表記 数値表記 ファイルに適用した場合 ディレクトリに適用した場合 設定されているファイルやディレクトリの例
SUID s(所有者欄) 4000 すべてのユーザが、そのファイルの所有者の権限で実行できる。 設定できない。 /usr/bin/su
/usr/bin/passwd
SGID s(所有グループ欄) 2000 すべてのユーザが、そのファイルの所有グループの権限で実行できる。 適用したディレクトリ配下に新たに作成されるファイルやディレクトリの所有グループが、このディレクトリと同じになる。 /usr/bin/write
スティッキービット t(その他ユーザ欄) 1000 設定しない。(今ではもう使われない) 適用したディレクトリ配下のファイルの名前変更と削除は、そのファイルの所有者のみが行える。(ディレクトリへの書き込み権限があっても、所有者でないなら不可) /tmp/

次からひとつひとつ見ていきます。


SUID

SUIDは、ファイルに適用するパーミッションです。
適用したファイルは、誰でもそのファイルの所有者の権限で実行できます。

Linuxでは、ユーザにUIDと呼ばれる番号が振られていますが、一時的に別のユーザのUIDをセットできる機能のことをSUID(Set User ID)と言います。
「ファイルの所有者の権限で実行できる」とは、「一時的にファイル所有者のUIDをセットする」ということです。

SUIDがどのように使用されているのかを見てましょう。

Linuxでパスワードが保存されている「/etc/shadow」というファイルがあります。
まずはこのファイルのパーミッションを確認します。

[root@localhost ~]# ls -l /etc/shadow
----------. 1 root root 1495  6月 18 19:26 /etc/shadow

※/etc/shadowのパーミッションは、ディストリビューションによって異なります。

「その他のユーザ」のパーミッションが「—」なことから、一般ユーザーは読み取りも書き込みもできないことが分かります。
しかし、「passwd」コマンドで一般ユーザーが自らのパスワードを変更した際、この「/etc/shadow」に反映されます。
つまり、書き込み権限がないはずの「/etc/shadow」に書き込めていることになります。
この謎を解明するには「passwd」コマンドの実行ファイルのパーミッションを見る必要があります。

[root@localhost ~]# which passwd
/usr/bin/passwd
[root@localhost ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856  4月  1  2020 /usr/bin/passwd

所有者のパーミッションが「rws」になっています。
この「s」がSUIDのパーミッションが設定されていることを表します。
つまり、passwdコマンドは「実行時に所有者の権限で実行できる」ことになります。
passwdコマンドの所有者は「root」です。
よって、passwdコマンドを実行する際は、どのユーザもroot権限で実行できることになります。

これを踏まえてあらためて「/etc/shadow」のパーミッションについて考えます。
rootユーザは設定されているパーミッションに関係なく、すべてのファイルを操作する権限を持つため、このファイルに書き込めます。
つまり、passwdコマンドを通じてパスワードを「/etc/shadow」に書き込む際には誰でもroot権限になっているため、結果的に一般ユーザでも書き込めているということです。


SGID

SGIDは、ファイルに適用した場合、SUIDのグループバージョンです。

[sak@localhost example]$ ls -l /usr/bin/write
-rwxr-sr-x. 1 root tty 19544 10月  1  2020 /usr/bin/write

所有グループ欄に「s」が記載されており、これがSGIDの設定を意味します。

SGIDは、ディレクトリに設定することもできます。

[root@localhost sak]# pwd
/home/sak
[root@localhost sak]# ls -l
合計 0
drwxrwxr-x. 3 sak sak 40  6月 23 13:15 example
[root@localhost sak]# chmod g+s example/
[root@localhost sak]# ls -l
合計 0
drwxrwsr-x. 3 sak sak 40  6月 23 13:15 example #グループパーミッションがx→sに
[root@localhost sak]# cd example/
[root@localhost example]# touch SGID_example.txt
[root@localhost example]# ls -l
合計 0
-rw-r--r--. 1 root sak 0  6月 23 13:46 SGID_example.txt
drwxrwxr-x. 2 sak  sak 6  6月 23 13:15 example
-rw-rw-r--. 1 sak  sak 0  6月 23 13:15 example.txt
[root@localhost example]# mkdir SGID_exampleDir
[root@localhost example]# ls -l
合計 0
-rw-r--r--. 1 root sak 0  6月 23 13:46 SGID_example.txt
drwxr-sr-x. 2 root sak 6  6月 23 13:46 SGID_exampleDir
drwxrwxr-x. 2 sak  sak 6  6月 23 13:15 example
-rw-rw-r--. 1 sak  sak 0  6月 23 13:15 example.txt

rootユーザで、sakユーザのホームディレクトリに存在する「example」ディレクトリにSGIDを付与します。
chmodコマンドについては別記事で解説しますので現時点で理解する必要はありません。パーミッションの変更ができるコマンドです。
「example」ディレクトリのパーミッションの所有グループ欄に「s」がついたことから、SGIDが設定されたことが分かります。
この状態で、「example」ディレクトリの中に新しくファイルやディレクトリを作成しました。
すると、それらの所有グループが「sak」になっているのが分かります。
ディレクトリにSGIDを設定すると、そのディレクトリ配下に新しく作成するファイルやディレクトリの所有グループが、設定したディレクトリと同じになるのです。

※なお、元々存在するファイルやディレクトリの所有グループが書き換わることはありません。


スティッキービット

スティッキービットは、ディレクトリに設定する特殊なパーミッションです。
適用したディレクトリ配下のファイルやディレクトリは、適用されているパーミッションに関係なく、所有者しか名前変更と削除ができなくなります。

はじめからこれが設定されているディレクトリの例としては「/tmp」があります。

[root@localhost /]# ls -l | grep tmp
drwxrwxrwt.  29 root root 4096  6月 23 14:26 tmp

パーミッションのその他ユーザ欄に「t」が記載されており、これがスティッキービットの設定を意味します。
「/tmp」ディレクトリは、一時ファイルを置くディレクトリで、プログラムが動作する際に一時的に利用するファイルを保存しておくなどの用途があります。
スティッキービットが設定されていることで、所有者以外のユーザがファイルを削除してしまわないようになっています。
しかし、基本的にはプログラムが使用することが想定されているディレクトリですので、実際どのように動作するのかは、別の例で説明します。

[root@localhost home]# ls -l
合計 0
drwx------. 6 sak  sak  143  6月 23 13:45 sak
drwxrwxrwt. 2 root root   6  6月 23 14:34 share
drwx------. 5 sie  sie  191  6月 18 19:07 sie

「share」というディレクトリを作成しました。
このディレクトリのパーミッションは「1777」に設定されています。
すべてのユーザが、読み取り書き込み実行可能で、スティッキービットが設定されている状態です。

[root@localhost home]# cd share/
[root@localhost share]# touch rootfile
[root@localhost share]# chmod 777 rootfile
[root@localhost share]# ls -l
合計 0
-rwxrwxrwx. 1 root root 0  6月 23 14:38 rootfile

「share」ディレクトリの中に、「rootfile」というファイルを作成し、パーミッションを「777」に設定します。
本来なら、これでroot以外のユーザでも、このファイルを削除したり名前を変更したりできるはずです。

[sak@localhost share]$ who am i
sak      pts/1        2022-06-23 14:41 (192.168.56.1)
[sak@localhost share]$ pwd
/home/share
[sak@localhost share]$ ls -l
合計 0
-rwxrwxrwx. 1 root root 0  6月 23 14:38 rootfile
[sak@localhost share]$ mv rootfile myfile
mv: `rootfile' から `myfile' へ移動できません: 許可されていない操作です
[sak@localhost share]$ rm rootfile
rm: `rootfile' を削除できません: 許可されていない操作です

sakユーザにログインして、「rootfile」の名前変更や削除をしようとすると拒否されます。
これは、「rootfile」が入っている「share」ディレクトリにスティッキービットが設定されているからです。

スティッキービットは、「複数のユーザが自由にファイルやディレクトリを作成できるが、勝手に他人のディレクトリやファイルの名前を変更したり削除したりできないようにする」という要件を満たしたい共有ディレクトリなどに設定するものです。


まとめ

今回は、Linuxの特殊なパーミッションについて解説しました。
LPICの試験では、これらをどうやって設定するのかに焦点が当てられることが多いです。

最後に確認問題を載せますが、こちらはchmodコマンドの知識も必要ですので、先に以下の記事をご覧になることを推奨します。
パーミッションの変更~chmodコマンド~


確認問題

問題

以下のようにディレクトリが作成されている。
「sak」ディレクトリ内に作成した新しいファイルの所有グループが、「sak」になるようにするコマンドはどれか。 (2つ選択)

drwxrwxr-x 2 root sak 4096 June 23 16:13 sak

A) chmod g+s sak
B) chgrp sak sak
C) chmod 1775 sak
D) chmod 2775 sak
E) chmod 4775 sak

解答
答え:A、D

「sak」ディレクトリ内に作成した新しいファイルの所有グループが、「sak」になるようにする
この要件を満たすには、sakディレクトリにSGIDを設定する必要があります。
A) ⇒ 正解です。所有グループに「s」を与えることでSGIDが設定されています。
B) ⇒ sakディレクトリの所有グループを変更しても、要件は満たせません。また、元々sakディレクトリの所有グループはsakです。
C) ⇒ 1000はスティッキービットの設定です。
D) ⇒ 正解です。2000はSGIDの設定です。
E) ⇒ 4000はSUIDの設定です。