SUIDとは「Set User ID」の略で、誰がそのファイルを実行しても、セットされたユーザで実行されるという状態だ。
このページではSUIDのもう少し細かい説明と、使い方についてお伝えした。参考にしていただければと思う。
SUIDとは?
Linuxパーミッションには幾つか特殊なパーミッション属性が存在している。
その一つが「SUID」(Set User ID)だ。
Set User IDとは「誰がそのファイルを実行しても、セットされたユーザで実行される」という状態だ。
例えば、passwdコマンドなどは所有者がrootになっておりSUIDが指定されている。この場合どのユーザがpasswdコマンドを実行しても必ずrootユーザが実行した状態となる。
一般的にSUIDは扱いに注意が必要なものとなっている。SUIDでrootユーザを指定してある場合、なんの認証もなしにroot権限でそのコマンドを実行できてしまうからだ。
所有者がrootでSUIDがセットされているコマンドは言わば例外的、特権的な動きをすることに注意しておこう。そのため無闇にSUIDをセットすることは避けよう。
SUIDを具体的に見てみよう
試しにpasswdコマンドを「ls -l」でパーミッション情報を表示してみよう。普通のパーミッションとは少しだけ異なる情報が記載されるはずだ
$ ls -l /usr/bin/passwd
1 |
-r-s--x--x 1 root root 26520 5月 25 2014 /usr/bin/passwd* |
「r」が読み込み許可のフラグ、「x」が実行許可のフラグとなっている。そのほか「s」というフラグがたっているのが確認できる。
フラグがたっている位置は所有者の権限を設定する位置となっている。所有者権限のところに「s」があるとそれはSUIDを示している。
実行権限のあるSUIDは「s」、実行権限が付与されていないのならば「S」と表記される。
今回所有者はrootなので誰がこのコマンドを実行してもroot権限でこのコマンドが実行されることとなる。
そのため一般ユーザで実行しても、パスワードの設定ファイルにpasswdコマンドを使用して設定を書き換えることが許される。特にこれといった認証は行われない。つまり特権として実行されることとなる。
そのため安易にSUIDを割り振ると意図しない権限の昇格が発生してしまうので、気をつけよう。
試しにSUIDを剥奪してみる。
ではSUIDがないとどうなるのかも実験してみよう。passwdコマンドはクリティカルなコマンドだ。あくまで実験なので自信がない方は実際の操作は控えて、こういう現象がおこるということを確認するだけでいいだろう。
$ su
# chmod 511 /usr/bin/passwd
# exit
$ passwd
上のようにエラーが発生する。
元に戻す
# chmod 4511 /usr/bin/passwd
SUIDを指定するには?
上の実験でも出てきたが、chmodコマンドでパーミッション数値に4000を足しあわせた数値を指定することでSUIDを指定できる。
# chmod 4511 /usr/bin/passwd
といった具合だ。
剥奪する時は単に4000を引き算すればよい。
もしくは以下の方法でも剥奪や付与が可能となっている。
SUID権限の付与
# chmod u+s /usr/bin/passwd
SUID権限の剥奪
# chmod u-s /usr/bin/passwd
find コマンドでSUIDに設定されている実行ファイルの列挙
$ find / -perm -4000
などとするとSUIDなファイルを列挙してくれる、基本的には実行ファイルに付与される権限なので
$ find /bin -perm -4000
$ find /sbin -perm -4000
$ find /usr/bin -perm -4000
$ find /usr/sbin -perm -4000
などとbinの下などを指定した方が綺麗な結果が反ってくるだろう。
まとめ
このページではSUIDについてお伝えしてきた。
パーミッションを勉強しはじめの頃に設定することはないだろうが、どういった機能かというのと、判別方法は知っておこう。
コメント