環境
Ubuntu20.4
パーミッション
ユーザーのパスワードを管理しているファイル(/etc/shadow)のパーミッションを表示すると、次のように表示されます。
$ls -l /etc/shadow
-rw-r----- 1 root shadow
このファイルの所有者はrootで、グループがshadowになっています。所有者の権限が、rwであるため、rootはこのファイルに読み書きすることができます。グループの権限がrであるため、shadowグループはこのファイルを読み込むことはできるが、書き込むことはできません。その他のユーザーには権限が設定されていないため、読み込むことも書き込むこともできません。
現に、自分は、vagrantユーザーでログインしているのですが、つぎのコマンドを実行するとエラーになります。
$cat /etc/shadow
$vi /etc/shadow
SetUID
/usr/bin/passwdのパーミッションを表示すると、次のように表示されます。passwdはパスワードを設定するためのコマンドです。
$ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root
パーミッションを確認すると、root以外のユーザーにも実行権限がありますが、パスワードを書き込む、shadowファイルに、読み込み書き込み権限がありませんでした。しかし、rootユーザーでない自分でも、passwdコマンドを実行して、hadowファイルを書き換えることができてしまいます。
なぜでしょうか?
passwdの所有者のパーミッションの実行権限の設定にsがついていることが原因です。このsのことを、SetUIDと呼びます。SetUIDが設定されているプログラムのことを、SetUIDされたプログラムといういい方もします。
SetUIDがついていると、所有者以外のユーザーであっても、所有者が持っている権限と同じ権限で実行できるようになります。つまり、root以外のユーザーが実行しても、shadowファイルの読み書きができるようになるということです。
sudo
sudoを使うと、どのユーザーでもroot権限でコマンドが実行できるようになります。これは、sudoコマンドにSetUIDが設定されているためです。sudoのパーミッションを確認します。
$ls -l /usr/bin/sudo
-rwsr-xr-x 1 root root
確かに、SetUIDが設定されています。
このように、SetUIDが設定されているプログラムは、passwd、sudoコマンド以外にもいくつかあります。SetUIDが設定されているプログラムは、次のコマンドで調べることができます。
sudo find / -type f -perm -u+s -ls
SetUIDが設定されていると、他ユーザーでもsudoなしで実行できる便利さがある反面、悪意のあるユーザーにログインされた場合、実行されてはいけないコマンドが実行されてしまうといった脅威が発生することになります。セキュリティ的には要注意な設定です。