Linux sudoers完全ガイド|/etc/sudoersの書き方・ visudoの使い方・CVE事例まで一気に理解する|サイバーセキュリティ.com

Linux sudoers完全ガイド|/etc/sudoersの書き方・ visudoの使い方・CVE事例まで一気に理解する



「このLinuxサーバー、sudoersの設定が NOPASSWD:ALL になっていますよ」——セキュリティ診断でこう指摘された担当者が青ざめる光景は、決して珍しくありません。原因の多くは、Linuxの権限管理ファイル「sudoers」の小さな設定ミスや、安易な設定の使い回しです。

sudoers(スードアーズ)とは、Linuxサーバーで「誰が・どのコマンドを・管理者権限で実行できるか」を定義する設定ファイルです。正しく設定すれば強力なアクセス管理ツールになりますが、設定ミスが一つあるだけで、不正アクセスの足がかりになります。

sudoersとは?

sudoers(読み:スードアーズ)とは、Linuxシステムで「誰がsudoコマンドを使って管理者権限を行使できるか」を定義する設定ファイルです。ファイルの場所は /etc/sudoers で、システム全体のsudo権限を一元管理します。

sudoとは?

「sudo」とは「SuperUser DO(スーパーユーザーとして実行する)」の略です。通常は管理者(root)しかできない操作を、一般ユーザーが一時的に管理者権限で実行するためのコマンドです。

たとえると「会社の金庫を開けるときだけ上司の承認が必要」なイメージです。sudoは、必要な操作のときだけ一時的にroot権限を借りる仕組みです。

比較項目 rootユーザー sudoの利用
できること すべての操作が無制限に可能 sudoersで許可された操作だけ可能
ログ記録 操作によっては記録されない sudoの操作はすべてログに記録される
セキュリティ 乗っ取られると全権限が奪われる 権限を絞って被害を最小化できる
rootで常に作業するのが危険な理由
rootアカウントで常にログインして作業すると、操作ミスやマルウェア感染が即座にシステム全体の破壊につながります。sudoを経由して必要な操作だけ権限を借りる方式のほうが、リスクを大幅に抑えられます。

sudoersが必要な理由

sudo権限は便利な反面、使い方を間違えると大きなセキュリティリスクになります。sudoersファイルで「誰に・何の権限を与えるか」を細かく制御することで、最小権限の原則(必要最低限の権限しか与えない)を実現できます。

たとえば、Webサーバーの再起動を担当するメンバーには、その操作だけを許可する——こうした細かな制御がsudoersで可能になります。

/etc/sudoersファイルの基本

ファイルの場所と構成

sudoersファイルは /etc/sudoers に保存されています。また、設定を分割して管理できる /etc/sudoers.d/ ディレクトリも利用できます。

パス 役割 特徴
/etc/sudoers sudoのメイン設定ファイル システム全体の設定を管理
/etc/sudoers.d/ 設定を分割するディレクトリ チームやロール別にファイルを分けられる

なぜvisudoで編集しなければいけないのか

sudoersファイルは、絶対に通常のテキストエディタで直接編集してはいけません。

理由は明確です。構文エラーが1文字でもあると、システム上の全ユーザーがsudoを使えなくなります。最悪の場合、管理者さえもサーバーを操作できなくなります。

安全に編集するために使うのが visudo コマンドです。visudoは保存時に構文チェックを自動で行い、エラーがあれば保存をブロックして修正を促します。

# sudoersを安全に編集する(必ずこの方法で)
sudo visudo

# 個別ファイルを作成して編集する
sudo visudo -f /etc/sudoers.d/webops-team
「nano /etc/sudoers」は絶対にNG
nano /etc/sudoers や vi /etc/sudoers のように直接開いて保存すると、構文チェックが行われません。ミスがあっても保存されてしまい、次のsudo実行時にすべての権限が失われます。必ず sudo visudo を使ってください。

sudoersの基本構文の読み方

sudoersの設定は、以下の形式で記述します。

ユーザー名  ホスト名=(実行ユーザー)  許可するコマンド

一見複雑に見えますが、4つのフィールドに分けて読むとシンプルです。

フィールド 意味 代表的な値
① ユーザー名 権限を与える対象ユーザー(グループは先頭に%を付ける) alice、%admins
② ホスト名 どのサーバーで有効にするか(複数サーバー共用でなければALL) ALL
③ 実行ユーザー どのユーザーとして実行できるか (ALL)、(root)
④ 許可コマンド 実行を許可するコマンドのフルパス ALL、/usr/bin/apt-get

具体的な記述例

① ユーザー「alice」にすべてのコマンドを許可(管理者相当)

alice ALL=(ALL) ALL

② グループ「admins」にすべての権限を与える

%admins ALL=(ALL) ALL

③ ユーザー「bob」に特定コマンドだけ許可(推奨パターン)

bob ALL=(root) /usr/bin/apt-get, /usr/bin/systemctl restart nginx

④ パスワードなしで特定コマンドを許可(NOPASSWD)

deploy ALL=(root) NOPASSWD: /usr/bin/git pull, /usr/bin/systemctl restart app
コマンドは必ずフルパスで書く
コマンドの指定は必ず絶対パス(フルパス)で記述してください。どこにあるかわからないときは which コマンド名 で確認できます。相対パスで書くと意図しないコマンドが実行されるセキュリティリスクがあります。

主な設定パターンと使い分け

目的 設定例 セキュリティ評価
管理者と同等の全権限 alice ALL=(ALL) ALL ⚠️ 必要な管理者のみに限定
特定コマンドのみ許可 bob ALL=(root) /usr/bin/systemctl restart nginx ✅ 最も推奨されるパターン
グループへの権限付与 %webops ALL=(root) /usr/bin/systemctl ✅ 管理しやすく棚卸しが楽
パスワードなし実行(NOPASSWD) deploy ALL=(root) NOPASSWD: /usr/bin/git pull ⚠️ 対象コマンドを必ず絞ること
特定コマンドを禁止 alice ALL=(ALL) ALL, !/usr/bin/passwd root ❌ 単独では脆弱性で回避される

NOPASSWDタグの危険性

NOPASSWD タグは、sudoコマンド実行時のパスワード入力を不要にするオプションです。CI/CD(継続的デプロイ)の自動化スクリプトや監視ツールとの連携でよく使われますが、設定を誤ると深刻なセキュリティリスクになります。

設定 リスク 判定
NOPASSWD:ALL アカウント乗っ取り=root権限の完全奪取 ❌ 原則禁止
NOPASSWD: /usr/bin/git pull 対象が限定されているため被害を抑制できる ⚠️ 用途を限定して使用
NOPASSWD: /usr/bin/systemctl restart nginx 特定の再起動操作のみ許可 ✅ 最小権限の原則に沿った使い方
NOPASSWD:ALLは最も危険な設定
alice ALL=(ALL) NOPASSWD:ALL という設定は、aliceアカウントが攻撃者に乗っ取られた瞬間に、パスワードなしであらゆる操作をrootとして実行できる状態になります。自動化が必要な場合も、許可するコマンドを必要最小限に絞ってください。

エイリアス(Alias)で設定を管理しやすくする

複数のユーザーやコマンドをグループ化して管理したいときは、エイリアスが便利です。設定が複雑になってきたときに、見通しをよくしてミスを減らせます。

エイリアスの種類 書き方の例 用途
User_Alias User_Alias ADMINS = alice, bob ユーザーのグループ化
Cmnd_Alias Cmnd_Alias RESTART = /usr/bin/systemctl restart コマンドのグループ化
Host_Alias Host_Alias SERVERS = web01, web02 ホスト名のグループ化
Runas_Alias Runas_Alias WEBUSER = www-data, apache 実行ユーザーのグループ化

エイリアスを使った設定例:

User_Alias WEBOPS = alice, bob, carol
Cmnd_Alias WEBCMDS = /usr/bin/systemctl restart nginx, /usr/bin/tail -f /var/log/nginx/error.log

WEBOPS ALL=(root) WEBCMDS

sudoers設定ミスによるセキュリティインシデント

CVE-2019-14287:「root禁止」の設定を回避された脆弱性

2019年10月に公表された脆弱性(CVE-2019-14287)は、「rootとして実行を禁止する」という設定が意図通りに機能しない欠陥でした。

問題の設定:

alice ALL=(ALL, !root) ALL

「aliceにはすべてのコマンドを許可するが、rootとしての実行は禁止する」という意図で書かれた設定ですが、sudo -u#-1 というオプションを付けることでこの制限を回避し、rootとして実行できてしまいました。

「!root」だけでは不十分——sudo 1.8.28以降にアップデートを
この脆弱性は sudo 1.8.28 で修正されています。sudo -V でバージョンを確認し、古いバージョンを使用している場合は直ちにアップデートしてください。

出典:NVD「CVE-2019-14287 Detail」

CVE-2021-3156(Baron Samedit):パスワードなしでroot権限を取得できた脆弱性

2021年1月、セキュリティ企業Qualysが発見した「Baron Samedit(CVE-2021-3156)」は、sudoのコマンドライン引数処理に存在するヒープバッファオーバーフローの脆弱性です。

・影響バージョン:sudo 1.8.2〜1.8.31p2、1.9.0〜1.9.5p1
・攻撃条件:Linuxサーバーに一般ユーザーとしてログインできれば攻撃可能
・sudoersの設定内容に関係なく、ローカルユーザーなら誰でもroot権限を取得できた

この脆弱性の深刻な点は、sudoersをどんなに適切に設定していても、sudoのバージョンが古ければ攻撃を受けるということです。

設定だけでなくsudoのバージョン管理も必須
修正版はsudo 1.9.5p2で提供されています。OSのパッケージ管理コマンド(apt upgrade sudo / yum update sudo)で定期的にアップデートしてください。

出典:Qualys「CVE-2021-3156: Heap-Based Buffer Overflow in Sudo (Baron Samedit)」

安全に運用するためのベストプラクティス

1. 最小権限の原則を守る

ALL=(ALL) ALL の「全権限」は必要な管理者だけに限定し、各担当者には業務に必要な最低限のコマンドだけを許可するのが基本です。

権限の与えすぎを防ぐチェック:

# 自分の権限を確認する
sudo -l

# 特定ユーザーの権限を確認する(root権限が必要)
sudo -l -U ユーザー名

2. NOPASSWDの使用は最小限に

自動化スクリプトなどでNOPASSWDが必要な場合も、対象コマンドを厳密に絞り込んでください。NOPASSWD:ALL は原則禁止です。

3. visudoで必ず編集する

sudoersファイルの直接編集は、構文エラーによるシステムロックアウトのリスクがあります。保存前に自動チェックが走る visudo を必ず使用してください。

4. /etc/sudoers.dを活用する

チームやロールごとに別ファイルを作成して管理すると、設定の見通しがよくなりミスが減ります。

# チームごとのファイルを作成
sudo visudo -f /etc/sudoers.d/webops-team
sudo visudo -f /etc/sudoers.d/deploy-scripts
sudoers.dのファイル名ルール
/etc/sudoers.d/ のファイル名には、ドット(.)やチルダ(~)を含めないようにしてください。それらを含むファイルはsudoに読み込まれません。

5. 定期的に設定を見直す

担当者の異動・退職後もsudoers設定が残り続けるケースが非常に多いです。半年ごとなど定期的にアカウントと権限の棚卸しを実施してください。

6. sudo操作のログを監視する

sudo経由の操作はすべてログに記録されます。

・Red Hat系(CentOS / AlmaLinuxなど):/var/log/secure
・Debian/Ubuntu系:/var/log/auth.log

不審なsudo操作を早期発見するために、ログ監視ツールとの連携をおすすめします。

実践チェックリスト

sudoers設定の安全チェックリスト
・ sudoersファイルはvisudoで編集しているか
・ NOPASSWD:ALLの設定が存在していないか
・ 退職・異動したユーザーのsudo権限を削除したか
・ コマンドはフルパスで指定しているか
・ /etc/sudoers.dを使って設定を整理しているか
・ sudo操作のログが記録・監視されているか
・ sudoのバージョンが最新か(sudo -V)
・ 「!コマンド禁止」設定だけに頼っていないか
・ グループ単位での権限管理ができているか
・ 定期的な権限棚卸しのスケジュールがあるか

よくある質問(FAQ)

Q. sudoersを誤って編集してしまい、誰もsudoが使えなくなった、どうしよう?

シングルユーザーモード(レスキューモード)でシステムを起動し、rootとしてログインしてsudoersを修正してください。AWS EC2などのクラウド環境ではEC2シリアルコンソールやSSMセッションマネージャーを使って対応します。このリスクを防ぐためにも、日頃からvisudoでの編集を徹底してください。

Q. NOPASSWD設定は絶対に使ってはいけませんか?

絶対にNGではありません。CI/CDの自動デプロイや監視エージェントなど、パスワード入力ができない場面での利用は合理的です。ただし、許可するコマンドをフルパスで必要最小限に絞ること、対象アカウントのアクセス管理を厳格にすることが前提です。

Q. /etc/sudoers.dのファイルはどう管理すればいいですか?

チームやロールごとにファイルを分けると管理しやすくなります(例:webops-team、deploy-scripts など)。ファイル名にはドット(.)やチルダ(~)を含めないでください。含まれていると読み込まれません。

Q. sudoの権限を確認するコマンドはありますか?

sudo -l で自分の権限一覧を、sudo -l -U ユーザー名 で他のユーザーの権限一覧を確認できます(他ユーザーの確認にはroot権限が必要)。定期的な権限棚卸しに活用してください。

Q. グループに権限を与えるのと、個人に与えるのはどちらが管理しやすい?

グループへの権限付与を推奨します。ユーザーのグループへの追加・削除だけで権限を管理できるため、担当変更時の対応がシンプルになります。個人単位の設定が増えると、退職者の権限削除漏れなどが発生しやすくなります。

Q. sudoersの設定は変更後すぐ反映されますか?

はい、visudoで保存した瞬間に設定が反映されます。sudoやサービスの再起動は不要です。ただし、すでに実行中のsudoセッションには即座に反映されないことがあるため、新しいターミナルセッションで動作を確認することをおすすめします。

まとめ

sudoersとは、Linuxシステムでsudoコマンドによる管理者権限の行使を「誰が・どのコマンドで・どんな条件で」許可するかを定義する設定ファイルです。/etc/sudoers に保存され、構文ミスによるシステムロックアウトを防ぐためにvisudoでの編集が鉄則です。

設定の基本は最小権限の原則です。ALL=(ALL) ALL のような全権限の付与はごく一部の管理者に限定し、一般の担当者には業務で必要なコマンドだけを許可してください。NOPASSWDタグは自動化用途では有用ですが、対象コマンドを必ず絞り込む必要があります。

CVE-2019-14287やBaron Samedit(CVE-2021-3156)のように、sudoそのものの脆弱性が定期的に発見されています。sudoersの設定を適切に保つだけでなく、sudo自体のバージョン管理やログ監視も組み合わせた多層的なアクセス管理が、Linuxサーバーのセキュリティを守る上で欠かせません。

SNSでもご購読できます。