sudoコマンドでroot権限を安全に実行する方法|visudoの設定からログ確認まで


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, セキュリティ > sudoコマンドでroot権限を安全に実行する方法|visudoの設定からログ確認まで
「sudoでコマンドを実行するとPermission deniedになる」
「visudoで/etc/sudoersを編集したいけど、書き方がよくわからない」
Linuxサーバーを管理していると、一般ユーザーで作業中にroot権限が必要になる場面は頻繁にあります。そのたびに su でrootに切り替えるのはセキュリティ上のリスクが大きく、現場では sudo を使うのが鉄則です。

この記事では、sudo コマンド の実践的な使い方を解説します。
基本的な実行方法から visudo による /etc/sudoers の設定、ログ確認やトラブルシュートまで、実務で必要な操作をすべてカバーします。動作確認環境は RHEL 9.4 / Rocky Linux 9.4 です。

この記事のポイント

・sudo コマンド名 でroot権限のコマンドを安全に実行できる
・/etc/sudoers の編集は必ず visudo を使う
・sudo -l で自分に許可されたコマンドを確認できる
・sudo の実行ログは /var/log/secure で追跡できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

sudoとは?suとの違いを整理する

sudo(superuser do)は、一般ユーザーのまま特定のコマンドだけをroot権限で実行する仕組みです。root パスワードを知らなくても、自分のパスワードで認証して管理者権限のコマンドを実行できます。

一方、su(substitute user)はユーザーそのものを切り替えるコマンドです。su - でrootに切り替えると、以後のすべての操作がroot権限で実行されます。

実務では sudo が推奨される理由を押さえておきましょう。

最小権限の原則:必要なコマンドだけをroot権限で実行できる(全操作がrootにならない)
監査ログ:誰がいつどのコマンドを sudo で実行したか、すべてログに記録される
rootパスワード不要:rootパスワードを複数人で共有するリスクがなくなる
タイムスタンプ:一度認証すると一定時間(デフォルト5分)は再認証不要

RHEL 9/Rocky Linux 9 では、インストール時に作成した管理ユーザーはデフォルトで wheel グループに所属しており、sudo が使える状態になっています。

sudoの基本的な使い方

最も基本的な使い方は、実行したいコマンドの前に sudo を付けるだけです。

1. root権限でコマンドを実行する

$ sudo systemctl restart httpd [sudo] testuser のパスワード: # パスワード入力後、httpdが再起動される

初回実行時に自分のパスワードを求められます。認証に成功すると、5分間はパスワード入力なしで sudo を続けて使えます。

2. 別のユーザーとしてコマンドを実行する

-u オプションで、root以外のユーザーとしてコマンドを実行できます。

# apacheユーザーとしてファイルの所有権を確認する $ sudo -u apache ls -la /var/www/html/

Webサーバーの権限トラブルを切り分けるとき、対象ユーザーの立場でファイルにアクセスできるかを確認する場面で重宝します。

3. rootのシェルを起動する(sudo -i / sudo -s)

複数のコマンドを連続でroot権限で実行したい場合は、rootシェルを起動できます。

# rootのログインシェルを起動する(su - と同等) $ sudo -i [root@sv01 ~]# # 現在のシェルのままroot権限に切り替える $ sudo -s [root@sv01 testuser]#

sudo -i:rootのログインシェルが起動し、rootのホームディレクトリ(/root)に移動する。環境変数もrootのものに切り替わる
sudo -s:現在のディレクトリのまま、rootのシェルが起動する。環境変数は呼び出し元ユーザーのものが引き継がれる

作業が終わったら exit で必ず元のユーザーに戻りましょう。rootシェルを開きっぱなしにするのは su - と同じリスクを抱えることになります。

4. 許可されたコマンドを確認する(sudo -l)

自分がどのコマンドを sudo で実行できるか確認するには -l オプションを使います。

$ sudo -l ユーザー testuser は sv01.linuxmaster.jp 上で次のコマンドを実行できます: (ALL) ALL

(ALL) ALL と表示された場合は、すべてのコマンドをroot権限で実行できる状態です。制限付きの設定がされている場合は、許可されたコマンドだけが一覧表示されます。

visudoで/etc/sudoersを安全に編集する

sudoの権限設定は /etc/sudoers ファイルで管理します。このファイルを直接viで編集するのは厳禁です。構文エラーがあると sudo が使えなくなり、サーバー管理ができなくなる致命的な状態に陥ります。

必ず visudo コマンドを使いましょう。保存時に構文チェックが自動で実行され、エラーがあれば警告してくれます。

1. visudoの起動と基本操作

# visudoを起動する(root権限が必要) $ sudo visudo

viエディタが起動し、/etc/sudoers の内容が表示されます。編集後に :wq で保存すると、自動で構文チェックが行われます。

構文エラーがある場合は次のようなメッセージが出ます。

>>> /etc/sudoers: syntax error near line 25 <<< What now? Options are: (e)dit sudoers file again (x)exit without saving changes to sudoers file (Q)uit and save changes to sudoers file (DANGER!)

エラーが出たら必ず e を押して再編集するか、x で変更を破棄してください。Q は絶対に選ばないでください。壊れたsudoersを保存してしまうと、sudoが完全に使えなくなります。

2. sudoersファイルの書き方

/etc/sudoers の基本構文は次のとおりです。

# 書式: ユーザー名 ホスト名=(実行ユーザー) コマンド # すべてのホストですべてのコマンドをroot権限で実行可能 testuser ALL=(ALL) ALL # wheelグループのメンバーに全権限を付与(RHEL 9のデフォルト) %wheel ALL=(ALL) ALL # パスワードなしで全コマンドを実行可能にする %wheel ALL=(ALL) NOPASSWD: ALL

各フィールドの意味を整理します。

ユーザー名(または %グループ名):sudo を許可する対象。グループ名の場合は先頭に % を付ける
ALL(ホスト名):このルールが適用されるホスト。ALL はすべてのホストを意味する
(ALL)(実行ユーザー):どのユーザーとしてコマンドを実行できるか。ALL はroot含む全ユーザー
ALL(コマンド):実行を許可するコマンド。ALL はすべてのコマンド

3. 特定のコマンドだけを許可する実務例

全権限を与えるのではなく、必要なコマンドだけを許可するのがセキュリティのベストプラクティスです。

# webadminユーザーにApacheの再起動だけを許可 webadmin ALL=(root) /usr/bin/systemctl restart httpd, /usr/bin/systemctl status httpd # dbadminユーザーにMySQLのバックアップだけを許可 dbadmin ALL=(root) /usr/bin/mysqldump # monitorグループにログの閲覧だけを許可(書き込み系コマンドは不可) %monitor ALL=(root) /usr/bin/tail, /usr/bin/cat, /usr/bin/less, /usr/bin/grep

コマンドはフルパスで記述します。which コマンドでパスを確認してから設定しましょう。

$ which systemctl /usr/bin/systemctl

4. /etc/sudoers.dディレクトリの活用

RHEL 9 では /etc/sudoers の末尾に次の行が記述されています。

#includedir /etc/sudoers.d

この設定により、/etc/sudoers.d/ ディレクトリに配置したファイルが自動的に読み込まれます。ユーザーやグループごとに個別のファイルを作成すると、管理がしやすくなります。

# webadmin用のsudo設定ファイルを作成 $ sudo visudo -f /etc/sudoers.d/webadmin # ファイル内容 webadmin ALL=(root) /usr/bin/systemctl restart httpd

・ファイル名に .(ドット)や ~(チルダ)を含めないこと(読み込みがスキップされる)
・パーミッションは 0440 に設定する(visudo -f で作成すれば自動で適切なパーミッションが付与される)

sudoの実務で使えるオプション

基本操作に加えて、現場でよく使うオプションを紹介します。

1. タイムスタンプをリセットする(sudo -k)

# 認証キャッシュを無効化する(次回sudo実行時にパスワードを求められる) $ sudo -k

離席する前や、共用端末で作業したあとに実行しておくと安全です。

2. 環境変数を引き継ぐ(sudo -E)

# 現在のユーザーの環境変数をroot権限のコマンドに引き継ぐ $ sudo -E env | grep -i proxy http_proxy=http://proxy.example.com:8080

プロキシ環境でパッケージのインストールを行うとき、http_proxy 変数を引き継ぐ必要がある場面で使います。

3. コマンドの出力をリダイレクトする

sudo でリダイレクトを使う場合は注意が必要です。

# これはPermission deniedになる(リダイレクトは一般ユーザー権限で実行される) $ sudo echo "test" > /etc/test.conf -bash: /etc/test.conf: Permission denied # 正しい方法:teeコマンドを使う $ echo "test" | sudo tee /etc/test.conf # 追記する場合は -a オプション $ echo "test2" | sudo tee -a /etc/test.conf

> リダイレクトはシェルが処理するため、sudo の権限が及びません。tee コマンドを sudo で実行すれば、root権限でファイルに書き込めます。

sudoのログを確認する方法

sudo の大きな利点は、すべての実行履歴がログに記録されることです。セキュリティ監査や障害調査で重要な情報源になります。

1. /var/log/secureでsudoログを確認する

RHEL 9 / Rocky Linux 9 では、sudo の実行ログは /var/log/secure に記録されます。

$ sudo grep sudo /var/log/secure | tail -5 Apr 14 10:23:45 sv01 sudo: testuser : TTY=pts/0 ; PWD=/home/testuser ; USER=root ; COMMAND=/usr/bin/systemctl restart httpd Apr 14 10:25:12 sv01 sudo: testuser : TTY=pts/0 ; PWD=/home/testuser ; USER=root ; COMMAND=/usr/bin/cat /etc/shadow Apr 14 10:30:01 sv01 sudo: webadmin : command not allowed ; TTY=pts/1 ; PWD=/home/webadmin ; USER=root ; COMMAND=/usr/sbin/reboot

ログの各フィールドの意味は以下のとおりです。

ユーザー名:sudo を実行したユーザー
TTY:実行端末
PWD:実行時のカレントディレクトリ
USER:どのユーザーとして実行したか
COMMAND:実行されたコマンド(フルパス)

3行目のように command not allowed と記録されたエントリは、許可されていないコマンドを実行しようとした証拠です。不正アクセスの兆候として注意が必要です。

2. journalctlでsudoログを確認する

systemd 環境では journalctl でもログを確認できます。

# sudoに関するログを直近から表示 $ sudo journalctl _COMM=sudo --no-pager | tail -10 # 特定の日付のsudoログを抽出 $ sudo journalctl _COMM=sudo --since "2026-04-14" --until "2026-04-15"

「sudo: ユーザー名 is not in the sudoers file」が出た時の対処法

sudo を実行して次のエラーが表示された場合、そのユーザーに sudo の権限が設定されていません。

$ sudo systemctl restart httpd [sudo] testuser のパスワード: testuser は sudoers ファイル内にありません。この事象は記録・報告されます。

このエラーが出たら、次の手順で権限を付与します。

1. wheelグループに追加する(推奨)

RHEL 9 では wheel グループに所属するユーザーに sudo の全権限が付与される設定がデフォルトで有効です。

# rootまたは既にsudo権限のあるユーザーで実行 $ sudo usermod -aG wheel testuser # 設定の反映を確認する(再ログインが必要な場合がある) $ id testuser uid=1001(testuser) gid=1001(testuser) groups=1001(testuser),10(wheel)

-aG-a(append)を忘れると、既存のグループ所属がすべて外れてしまうので注意してください。

2. visudoで個別にユーザーを追加する

特定のコマンドだけを許可したい場合は、visudo で個別に設定します。

$ sudo visudo # 末尾に追加 testuser ALL=(root) /usr/bin/systemctl restart httpd

sudoでよくあるトラブルと対処法

現場で遭遇しやすいトラブルと、その解決策をまとめます。

1. 「sudo: コマンド名: command not found」

sudoでコマンドを実行すると、rootユーザーのPATH環境変数が使われます。一般ユーザーのPATHにしか含まれないコマンドは見つからないことがあります。

# フルパスで指定すれば実行できる $ sudo /usr/local/bin/mycommand # または、PATHの設定をsudoersに追加する $ sudo visudo Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

2. sudoのパスワードキャッシュ時間を変更する

デフォルトの5分では短すぎる、あるいはセキュリティポリシーで毎回パスワードを要求したい場合は、timestamp_timeout で変更できます。

$ sudo visudo # パスワードキャッシュを15分に変更 Defaults timestamp_timeout=15 # 毎回パスワードを要求する Defaults timestamp_timeout=0

3. NOPASSWDが効かない場合

NOPASSWD を設定してもパスワードを求められる場合は、設定の記述順序が原因です。sudoers は上から順に評価され、後の行が優先されます。

# この順序だと NOPASSWD が上書きされてしまう testuser ALL=(ALL) NOPASSWD: ALL %wheel ALL=(ALL) ALL # 正しい順序:個別設定はグループ設定の後に記述する %wheel ALL=(ALL) ALL testuser ALL=(ALL) NOPASSWD: ALL

または、/etc/sudoers.d/ に個別ファイルとして配置するのが確実です。

sudoのセキュリティ設定(実務Tips)

本番サーバーでsudoを運用する際に設定しておきたい項目を紹介します。

1. rootログインを無効化してsudo運用に統一する

rootで直接ログインできる状態は、パスワードブルートフォース攻撃のリスクがあります。SSH経由のrootログインを無効化し、sudo経由でのみ管理者操作を行う運用が推奨されます。

# /etc/ssh/sshd_configを編集 $ sudo vi /etc/ssh/sshd_config PermitRootLogin no # sshd を再起動して反映 $ sudo systemctl restart sshd

この設定をする前に、必ず sudo が正しく動作するユーザーが存在することを確認してください。

2. sudo実行時のログメッセージを追加する

sudo 実行時に警告メッセージを表示して、管理者権限の操作であることをユーザーに意識させることができます。

$ sudo visudo # 初回sudo時に警告メッセージを表示する(RHEL 9デフォルト) Defaults lecture = always

本記事のまとめ

sudo コマンドの基本操作から visudo の設定、トラブルシュートまでを解説しました。

やりたいこと コマンド
root権限でコマンドを実行する sudo コマンド名
別のユーザーとして実行する sudo -u ユーザー名 コマンド名
rootのログインシェルを起動する sudo -i
許可されたコマンドを確認する sudo -l
認証キャッシュをリセットする sudo -k
sudoersファイルを安全に編集する sudo visudo
sudoersの個別設定ファイルを編集する sudo visudo -f /etc/sudoers.d/ファイル名
wheelグループにユーザーを追加する sudo usermod -aG wheel ユーザー名
sudoの実行ログを確認する sudo grep sudo /var/log/secure

sudo はサーバー管理の基盤となるコマンドです。rootのパスワードを複数人で共有するのではなく、sudo と visudo を正しく使って「誰が何をしたか」を追跡できる状態を維持しましょう。

suコマンドとの使い分けについては「suコマンドでユーザーを切り替える方法」、パスワード管理の詳細は「passwdコマンドでパスワードを変更する方法」もあわせてご覧ください。

sudoの基本はわかった。次はサーバー構築全体の流れを押さえませんか?

sudo の設定はサーバー管理の入口にすぎません。安全なサーバー構築を体系的に学ぶことが、現場で信頼されるエンジニアへの近道です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。


暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。