一般ユーザーが何かをするために昇格されたアクセスを必要とするケースはたくさんあります。システム管理者は、ユーザーが保護されたファイルにアクセスするたびに root パスワードを入力するために常にそこにいるわけではないため、この動作を許可するための特別なファイルパーミッションビットがあります。Set User ID (SUID) は、ユーザーがプログラムを自分自身としてではなく、プログラムファイルの所有者として実行することを可能にします。
例を見てみましょう。
パスワードを変更したいとします。簡単ですよね? passwd コマンドを使うだけです。
passwd
passwd コマンドは何をしているのでしょうか?いくつかのファイルを変更していますが、最も重要なのは /etc/shadow ファイルを変更していることです。そのファイルを少し見てみましょう。
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1134 Dec 1 11:45 /etc/shadow
あれ、ちょっと待ってください、このファイルは root が所有しているのですか?root が所有するファイルを変更できるのはどうしてでしょうか?
今度は、実行したコマンドの別のパーミッションセットを見てみましょう。
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 Dec 1 11:45 /usr/bin/passwd
ここに新しいパーミッションビット s があることに気づくでしょう。このパーミッションビットは SUID です。ファイルにこのパーミッションが設定されている場合、プログラムを起動したユーザーは、ファイル所有者のパーミッションと実行パーミッション(この場合は root)も取得できます。つまり、ユーザーが passwd コマンドを実行している間は、root として実行していることになります。
そのため、passwd コマンドを実行すると、/etc/shadow のような保護されたファイルにアクセスできるのです。このビットを削除すると、/etc/shadow を変更できなくなり、したがってパスワードを変更できなくなることがわかるでしょう。
SUID の変更
通常のパーミッションと同様に、SUID パーミッションを変更する方法は 2 つあります。
シンボリックな方法:
sudo chmod u+s myfile
数値的な方法:
sudo chmod 4755 myfile
ご覧のとおり、SUID は 4 で表され、パーミッションセットの前に付加されます。SUID が大文字の S で表されているのを見かけるかもしれません。これは、同じことを意味しますが、実行パーミッションがないことを意味します。