先日、痛恨のオペミス(本番環境で間違えて poweroff 実行)をしてしまい、対策を講じることにしました。

sudo の設定

他サイトでも紹介されていますが、sudorebootshutdown などのコマンドを実行できなくする設定です。

Fedora では /etc/sudoers を直接編集するのではなく、/etc/sudoers.d/ 以下に新規にファイルを作る方が良いでしょう。 /etc/sudoers.d/ 以下のファイルであっても、構文エラーがあると sudo できなくなるので、必ず、編集後に構文チェックをしてくれる機能の付いた visudo を使って編集します。

/etc/sudoers.d/alice を以下のように設定します(ファイル名は何でもいいです)。

Cmnd_Alias  SHUTDOWN = /sbin/shutdown,/sbin/halt,/sbin/reboot,/sbin/poweroff
alice       ALL=(ALL) NOPASSWD: ALL, !SHUTDOWN

この例では、ユーザ aliceSHUTDOWN に書いた 4つのコマンドは禁止、それ以外はパスワードなしで実行 OK という設定です。私の探し方が悪いのかもしれませんが、ネットでは SHUTDOWN 禁止の設定例はたくさん見つかるのですが、同時に「それ以外」は OK にする設定が見つからないです。これで所望の設定になりました。

禁止した 4つのコマンドは、sudo -s でシェルを取得した後に実行します。

勘違いによるオペミスの防止

rebootshutdown にガードを付けます。

元々、今回のきっかけの対策になったオペミスが、テスト環境だと思って poweroff したところ、実際は本番環境だった、とかなので、前述の対策だけでは防ぎきれません。幸いなことに、私のサーバでは、再起動してよい条件が明確なので、ガードを書くことができました。

再起動と poweroff が入り乱れてなんか訳分からん感じですが、本番環境は基本無停止(カーネルアップデート等、必要な場合に再起動のみ)、 テスト環境は必要時以外電源オフなので、こんな文章になってしまい、申し訳ありません。

本番環境の /root/.bashrc にエイリアスを追加します。

alias guard='/path/to/condition'
alias halt='guard && halt'
alias poweroff='guard && poweroff'
alias reboot='guard && reboot'
alias shutdown='guard && shutdown'

/path/to/condition はガード条件で、再起動や電源断などが可能な場合は、終了コード 0 を返すようなコマンドです。この部分は各自適切なものをご用意ください。 この設定であれば、再起動可能な条件が整っていない状態で、テスト環境だと思い込んで、本番環境で reboot しようが poweroff しようが、ガードが防いでくれます。

元々、/root/.bashrc には rm などにエイリアスが定義されていて、確認する設定(-i オプション)になっていますので、今回の対策は、それに倣ったものです。

まとめ

オペミスを防ぐ、ちょっとしたアイデアの紹介でした。オペミスには気をつけましょう、では限界があるので、オペミスが起きない設定にしておけば安心です。