🐧 Linux 総合学習プラットフォーム
セキュリティ/権限強化 ・ 中級

sudoersの安全な設計(visudo)

sudoは強力なぶん、設定を誤ると管理者権限が漏れたり、逆にsudoが誰も使えなくなったりします。設定ファイル /etc/sudoers は専用エディタ visudo で編集するのが鉄則です。この記事では、文法チェックの仕組み、sudoers.d による分割管理、特定コマンドだけを許可する書き方、NOPASSWDの利便と危険までを順に見ていきます。

sudoは、一般ユーザーに管理者権限を一時的に貸し出す仕組みだ。誰に何を貸すかを決めているのが /etc/sudoers というファイルで、ここが甘いとサーバー全体の安全が揺らぐ。

🔗
たとえsudoersはビルの入館証発行台帳のようなものだ。誰にどの部屋の鍵を渡すか、いつでも鍵を渡すのか受付確認が要るのかを、この台帳一枚が決めている。書き方を間違えると、正規の社員まで締め出してしまう。

厄介なのは、このファイルは書式が少しでも崩れると、sudoコマンド自体が動かなくなる点だ。管理者権限を得る手段が管理者権限がないと直せない、という詰みの状態に陥りかねない。

つまずき/etc/sudoers を nano や vim で直接編集するのは避ける。文法エラーがあってもそのまま保存できてしまい、次にsudoを使おうとした瞬間に誰もsudoできなくなる恐れがある。

🔒 visudoという専用の入り口

この事故を防ぐために用意されているのが visudo コマンドだ。visudoは単なるエディタ起動コマンドではなく、保存時に自動で文法チェックを行う安全装置を兼ねている。

visudoを実行すると、環境変数で指定されたエディタ(多くはvi系)で /etc/sudoers が開く。編集して保存しようとすると、文法エラーがないか検査され、問題があれば警告が出て再編集を促される。ここでエラーを無視して強制終了しない限り、壊れた状態のファイルが確定してしまうことはない。

💡
ポイントsudoersの編集は必ずvisudoを使う。理由は「保存前に文法チェックが走る」ただ一点に尽きる。直接編集はミスが即座に牙をむく。
編集してvisudo 保存文法チェックOKなら反映NGなら再編集へsudoは動き続けるエラーがあれば警告して再編集を促す

エディタが好みでない場合は、EDITOR環境変数を変更してからvisudoを起動すれば、使い慣れたエディタで編集しつつチェック機構だけ活用できる。

📂 sudoers.dで分割管理する

小規模な環境なら sudoers 本体に直接ルールを書いても困らないが、複数人・複数チームで運用すると、1つの巨大ファイルは事故のもとになる。

そこで /etc/sudoers.d/ というディレクトリを使う。ここに置いたファイルは自動的にsudoersの一部として読み込まれる仕組みになっている(多くのディストリビューションで標準有効)。チームごと・目的ごとにファイルを分ければ、誰の設定がどこにあるか一目で分かり、変更の影響範囲も限定できる。

例えば運用担当者用のルールを別ファイルに切り出す場合。 $ sudo visudo -f /etc/sudoers.d/ops-team このファイルもvisudo経由なので、単体でも文法チェックが働く。

sudoers.d内のファイルは、頭にアルファベット順で読み込まれることが多い。後から読まれたルールが前のルールを上書きする場合があるため、命名は 10-base、20-ops のように番号を振ると順序を制御しやすい。

🎯 特定コマンドだけを許可する

sudoersの本体はシンプルに言えば「誰が」「どのホストで」「誰の権限で」「何を」実行してよいかを1行で書くルールの集まりだ。全権限を渡すのではなく、必要なコマンドだけに絞るのが最小権限の実践になる。

例えば、Webサーバーの再起動だけを特定ユーザーに許可したいなら、次のように書く。

nginxの再起動だけをuserに許可する例。 user ALL=(root) /usr/bin/systemctl restart nginx この1行だけを許可されたuserは、sudo systemctl restart nginxしか実行できず、他のsudoコマンドは拒否される。
💡
ポイントsudoersのルールは「ALL=(root) コマンドのフルパス」の形で絞り込む。コマンドをフルパスで指定するのは、PATHをすり替えて別の実行ファイルを起動させる攻撃を防ぐためだ。
つまずきコマンドを ALL や /usr/bin/* のようにワイルドカードで広く許可すると、そのワイルドカードに一致する別のコマンドまで実行できてしまう場合がある。絞り込みは可能な限り具体的なパスと引数で行う。

🔓 NOPASSWDの利便と危険

通常、sudoコマンドを実行するたびに自分のパスワードを求められる。これはなりすまし対策として重要だが、自動化スクリプトや監視ジョブでは、パスワード入力待ちがそのまま処理停止を招いてしまう。

この待ち時間を省くのがNOPASSWDというオプションだ。ルールの中でコマンドの前にNOPASSWD:を付けると、そのコマンドに限りパスワードなしでsudoが通る。

特定コマンドをパスワードなしで許可する例。 user ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx 自動化スクリプトからこのコマンドだけを無人で実行できるようになる。
🔗
たとえNOPASSWDは、特定の1つの部屋だけ「顔パス」にするようなものだ。便利だが、顔パスの範囲を広げすぎると、他人になりすまされたときの被害も一気に広がる。
つまずきNOPASSWD: ALL のように全コマンドをパスワード不要にするのは強く避けたい。端末を離席した隙や、アカウントを乗っ取られた瞬間に、確認なしで何でもできる状態になってしまう。
絞り込んだ許可ALL=(root)/usr/bin/systemctlrestart nginx被害範囲は限定的NOPASSWD: ALL全コマンドが無確認で実行可能乗っ取り時の被害が最大化

👥 グループでの運用

個々のユーザーに1行ずつルールを書くのは、人数が増えると管理しきれない。多くのディストリビューションには、あらかじめsudo権限と紐づいたグループ(Debian/Ubuntu系はsudo、RHEL系はwheelが多い)が用意されている。

このグループにユーザーを追加するだけで、そのグループ向けに定義された権限(多くは全コマンド許可)を得られる。個別のsudoersルールを書かずに済むので、標準的な管理者を増やす場面ではこちらが手軽だ。

「全権を渡す管理者はグループで」「特定コマンドだけの限定運用は個別ルールで」と使い分けると、sudoers全体の見通しが良くなる。

sudoersは一度組んだら終わりではなく、担当が変わるたびに見直すべき台帳だ。visudoという安全な入り口を必ず通り、権限は必要な分だけ、が基本の姿勢になる。

この項目に出てくる用語

sudoersすーどぅあーず
誰がどのコマンドをどの権限で実行してよいかを定義する設定ファイル。実体は/etc/sudoers。
NOPASSWDのーぱすわーど
sudoers内で、指定コマンドの実行時にパスワード入力を省略させる指定。

関連コマンド

visudo

▶ 学習アプリでこの続きを学ぶ・演習する