みなさま、お久しぶりの、技術の無駄遣いシリーズです。
なぜスクリーンセーバー?!
うちの会社はセキュリティにも力を入れているのですが、社内のルールに、パスワードによって保護されたスクリーンセーバーを設定する、というのがあります。
ちょっと席を離れたときなどに、他の人に端末の画面を見られるリスクと、操作されるリスクを軽減することが目的だと思われます。
Windowsの場合、スクリーンセーバーの設定に「再開時にログオン画面に戻る」というのがあるので、これを設定しておけば実現できます。
しかし、うちのチームで管理しているパソコンの中にLinuxを入れたデスクトップマシンがあり、しかも、それはGUIを持っていないものでした。
なんとか、社内のセキュリティ要件を満たすべく、いろいろと調べてみました。
やるべきことは?
まず、要件を整理しましょう。やりたいことは、
- 一定時間が経過したら、スクリーンセーバーを表示してほしい
- スクリーンセーバー表示後に端末を操作した場合、パスワード入力をさせてほしい
この2点です。
スクリーンセーバーの目的は、CRT画面の焼き付きを防止することではなく、画面を見られないようにすることですので、現在の画面が見えるようなタイプのスクリーンセーバーはNGです。
スクリーンセーバーを探す
実は、探さなくてもLinuxのコンソールには既にスクリーンセーバーが用意されています。
単位は分です。
setterm -blank 10
で10分後に画面が真っ黒になるようなスクリーンセーバーが発動します。
しかし、これ、復帰したときに元の画面が丸見えなんですよね。
これでは、要件を満たしません。
ちょっとググってみると、なんかすごいのがありました。
ソースがいろいろありますが、pipes.shだけ持ってくれば動くようです。
適当に実行権限を付けて/usr/binあたりに置いておきます。
しかし、これは、スクリーンセーバーが動くだけのプログラムで、時間が経過したら起動するようなものではありません。
これについては、後で考えます。
一定時間経過後にログアウトさせる
bashにはTMOUTという環境変数があります。
単位は秒です。
ここで設定した時間が過ぎると、ログアウトされます。
/etc/profileあたりに書いておきましょう。
ついでに、readonlyで変更できないようにしておきます。
TMOUT=600
readonly TMOUT
export TMOUT
ログアウト時にスクリーンセーバーを動かす
さて、スクリーンセーバーの起動ですが、ログアウト時に実行させると、パスワード付きスクリーンセーバーになって都合がよさそうです。
ログアウト時にはEXITというシグナルが発呼されます。
これをトラップすることにしましょう。
trap /usr/bin/pipes.sh EXIT
タイムアウトを5秒に設定したら、こんな感じになりました。
いい感じです。
コンソール以外では動かないようにする
sshでつないだときとかターミナル側でもパイプが暴れまくってうざいので、コンソールでだけ動くようにしておきます。
最終形はこんな感じです。
if /usr/bin/tty | grep /dev/tty > /dev/null; then
TMOUT=600
readonly TMOUT
export TMOUT
trap /usr/bin/pipes.sh EXIT
fi
さいごに
セキュリティを担保したいだけなら無理にスクリーンセーバーっぽいのを動かさなくても、ログアウト時に画面をクリアするだけでいいような気もしてきました。
なんか、無駄なことをしたような気がします。
それより、コマンド実行中はタイムアウトされないので、vi開きっぱなしとかはしないようにしないといけませんねぇ。
*本記事は @qualitia_cdevの中の一人、@hirachanさんに書いていただきました。