ユーザによる Unix のシャットダウンコマンド

Unix とシャットダウン

Unix 上でのシャットダウンコマンドは一般ユーザで走らせられないようになっている。しかし、本学では複数の OS を導入している関係上、ユーザが自分が占有しているマシンは自分でシャットダウン出来ることが必要であった。通常、このような場合には、SUID (Super User ID)を用いるのだが不用意な SUID は危険を伴う。また、本学の運用と関係で、実習機以外では実行されても困ると言う場合もあった。
要請
1. 一般ユーザが実行可能で、なるべく安全であること
2. 特別なユーザ (ex. shutdown ユーザなど) は作らない
3. 実習機以外のマシン上では実行できないこと
4. ウィンドウシステムからは落とせないこと
手法
実現方法は意外に単純である。ユーザが実行するプログラムは、ユーザがコンソールユーザか否かを調べ、更にウィンドウシステム上ではないことを確認して、別プログラムを呼び出す。この時に、このユーザプログラムのパーミッションは以下のようにする。

-rwxr-sr-x   1 root     godown           654 10月 19日 1998年 godown

つまり、godown というグループに SGID を立てておくのである。これによって、godown プログラムは godown グループに所属するプログラムを呼び出すことが出来るわけである。

-rwsr-x---   1 root     godown           389 10月 19日 1998年 godown_sub

実際に呼び出されるのは、上記の godown_sub であり、godown_sub プログラムは SUID ビットが立っているので、root 権限のプログラムを実行することが出来る。更には、この godown_sub を呼び出す際に絶対パスを指定し、そのパス以外では実行できないようにすることで、実習機以外のディレクトリ構成のマシンでは実行することができないようになっている(もちろん、uname などの結果を調べて落とす落とさないを決定することも出来る)。ちなみに、godown_sub からは、Solaris などの shutdown は呼び出せないので(Solaris のシャットダウンコマンドはスクリプトであまり良いとは言えない)、/usr/ucb/shutdown を呼び出している(init コマンドもあまり好きではない)。

なお、一般にシェルスクリプトは環境変数などの汚染にぜい弱であるので、perl を用いてプログラムは作成されている。

ウィンドウシステムのチェックなどは自分の環境に合わせて変更した方が良いだろう。

プログラム
godown
godown_sub