visudoのすすめ
初投稿です。
sudo コマンドはサーバー管理などをしていると日常的に触りがちだけど、もし誤った記述をしてしまうと、システムが sudoを受け付けなくなり、最悪の場合は特権操作が一切行えなくなったりするので visudo を使って可能な限り事故を防ごうというお話。
職場の同僚が1回検証環境でやらかしてた。
こいつはsudoersファイルを安全・確実に編集するうえで便利なツール
visudoとはそもそもなにか
visudoは、Unix系OSにおいてsudoの設定ファイルであるsudoersファイルを編集するための専用コマンド。 vi ってついてるけど環境変数EDITORやVISUALを設定することで、nanoやemacsなど、他のエディタを指定することもできる。
このコマンドを使う一番の目的としては、sudoersファイルの構文エラーをチェックして、もし問題があれば編集者が修正するまで保存を許可しないという安全な編集環境で作業が行えることにある。
これにより、sudoersファイルの記述ミスによってログインできなくなったとかそういう損害を防ぐことができる。
客先の環境とかでやらかすと命にかかわるし気を付けたい。
visudoの基本的な使い方
visudoコマンドの使い方はとてもシンプル
sudo visudo
こんだけ
このコマンドを実行すると、デフォルトのエディタで/etc/sudoersファイルが開かれる。
個別ファイルを作成・編集する際には以下のように引数にパスを指定してあげる。
sudo visudo /etc/sudoers.d/{任意の名前}
viとvisudoの動作の違い、そしてなぜvisudoを使うべきなのか
一般的なテキストエディタ、例えばviやnano、emacsなどを使って直接/etc/sudoersファイルを編集することと、visudoコマンドを使って編集することの違いはいくつかあるっぽいけどあまり知らなかったので軽くまとめてみた
1. 構文チェックの有無
viで直接編集した場合:
vi /etc/sudoersのように直接ファイルを編集し保存した場合、エディタは僕らが記述した内容がsudoersファイルの正しい構文に従っているかどうかを一切チェックしてくれない。
我々がタイポしたりsudoersのルールに反する記述をしてしまったとしても vi とかはその変更をそのままファイルに書き込んでしまう。
この状態でファイルを保存してしまうと、次に誰かがsudoコマンドを実行しようとした際にsudoersファイルを読み解くプログラム(パーサーといったりする)が構文エラーを検出し、sudoコマンドの実行を拒否する可能性がある。
最悪の場合だと「sudo: parse error in /etc/sudoers」といったエラーメッセージが出てきてすべてのユーザーがsudoを使用できなくなるという大惨事になる。
rootユーザーでログインする方法がなければ、リカバリも難しい。
このようなリスクを避けるためにも sudo 設定を変更する際は直接 /etc/sudoers/ を編集するのではなく、特別な要件がない限り /etc/sudoers.d/ ディレクトリ配下に個別の設定ファイルを作成するのが安全。
visudoで編集した場合:
visudoは、編集した内容を一時ファイル(.tmp と末尾につきます)に保存した後、その一時ファイルをsudoパーサーを用いて構文チェックするらしい。 もし構文エラーが検出された場合、visudoはエラーの内容をユーザーに通知し、ファイルの保存は行われない。また、ユーザーはエラーを修正するまで sudoersファイルを本来の場所(/etc/sudoersなど)に保存することはできない。
構文エラーが存在した時の出力例(この場合ユーザー名が抜けている)
/etc/sudoers.d/USAO:1:4: syntax error
ALL=(ALL:ALL) NOPASSWD:ALL
^ What now?
構文チェックをパスしなければファイルが保存できない仕組みのため、システムに影響を与えるような致命的な設定ミスが反映されるリスクを大きく減らすことができる。
2. 排他ロック
viで直接編集した場合:
複数の管理者が同時に/etc/sudoersファイルを編集しようとした場合、viなどの一般的なエディタは通常排他ロックの機構を持たない。これにより、一方の管理者が行った変更がもう一方の管理者の変更によって上書きされてしまう、あるいはファイルが破損してしまうという競合状態が発生する可能性が出てくる。 複数人で同じサーバーに入っているといった状況においては特に注意したい。
visudoで編集した場合:
visudoはsudoersファイルの編集を開始する際にロックファイル(.tmp ファイル)を作成します。 USAO というユーザーを作成する例で見てみる。
ロックファイルの例
/etc/sudoers.d/.tmp.USAO
これにより、他のユーザーが同時にvisudoを実行してsudoersファイルを編集しようとするのを防ぎます。 ロックファイルが存在する間、他のvisudoプロセスはすでにファイルが編集されていることを通知して終了します。
他人が編集中のファイルを編集しようとした場合↓
Error: /etc/sudoers.d/USAO is currently being edited by another user.
編集が完了しファイルが正常に保存されるとロックファイルは自動的に削除される。 この排他ロックの仕組みにより、複数の管理者による同時編集が原因でファイルが破損したり変更が失われたりするリスクが防がれているということらしい。
エディタの変更
ちなみにもしvi以外のエディタを使いたい場合は、EDITORまたはVISUAL環境変数を設定する。例えばnanoを使いたい場合は、以下のようにすればおk。
export EDITOR=nano
これを~/.bashrcや~/.profileに記述しておけば、常に指定したエディタが使われるようになる。使い慣れたエディタを指定しよう。
visudoでエラーが出たら
ちなみに visudo でファイルを保存しようとした際に、構文エラーが検出されると、以下のようなメッセージが表示される。
/etc/sudoers.d/USAO:1:4: syntax error
ALL=(ALL:ALL) NOPASSWD:ALL
^ What now?
このメッセージが表示されたら以下 3 種類の選択肢がある。
e(edit): 編集を続行しエラーを修正する。x(exit): 変更を保存せずに終了する。元のsudoersファイルから内容はは変更されない。Q(quit): エラーを無視して強制終了する。ただ、基本的に使用しない(してはいけない)。 強制終了するとsudoersファイルが破損した状態になる可能性がある。
編集時にこのメッセージが見えた際は、エラーメッセージをもとにエディタで該当箇所に移動し、構文を確認・修正するようにしよう。
まとめ
sudoersファイルは、Linux/Unixシステムにおける特権操作のセキュリティを左右する、とても重要な設定ファイル。 その性質上、誤った記述はシステムやサーバー管理に甚大な影響を及ぼす可能性がある。
visudoコマンドは、このsudoersファイルを安全に編集するためのもの。 構文チェック、排他制御といった強力な機能を備えることで、ヒューマンエラーによる設定ミスや複数ユーザーによる競合を防ぐことができてえらい。
みんなも vi で直に編集は危険だからやめようね。