Linuxでは,ユーザーを「UID」と呼ぶID番号で管理しています。「SetUID」とは,アクセスしているユーザーを,一時的に別のUIDのユーザーに変更できる機能です。
Linuxを含むUNIX系OSでは,管理者のrootにしかできないことがいくつもあります。SetUIDは,一般ユーザーがrootにしかできない作業を行うときに,rootのパスワードを教えることなく,利用できるようにした便利な機能です。Linuxではよく使われています。
起動しているプロセスには,UIDとGID(グループのID)が設定されています。例えば,シェル・プログラムのプロセスは,ログインした際のユーザーのUIDとGIDになっているはずです。シェル上で新たにプロセスを生成すると,そのプロセスのUIDとGIDは,シェルのUIDとGIDを引き継ぎます。このUIDとGIDは,ファイルのアクセス権限に影響します。例えば,パスワードを格納している/etc/shadowファイルのパーミッションは,管理者であるrootユーザーにのみ,読み出しを許可しています。そのため,一般ユーザーがcatコマンドを使って/etc/shadowにアクセスしようとしても,エラーになります。ところが,/usr/bin/passwdプログラムを使うと,一般ユーザーでもパスワードを変更できます。これは,/usr/bin/passwdにSetUIDが設定されているためです。
/usr/bin/passwdのパーミッションを確認すると,所有者は「root」,所有者の実行権限が「s」になっています。この「s」が,SetUIDを設定していることを表します。SetUIDを設定していると,そのプログラムのプロセスのUIDは,所有者になります。つまり,/usr/bin/passwdプログラムの所有者はrootなので,passwdプロセスのUIDはrootになり,本来rootしかアクセスできない/etc/shadowファイルに書き込めるのです(図1)。
SetUIDを付与するには,chmodコマンドを使います。例えば,「samplepgm」というプラグラムに,SetUIDを設定する場合は
$ chmod u+s samplepgm
と実行します。