言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Linux & Mac & Bashコマンド辞典

  1. トップページ
  2. Linux & Mac & Bashコマンド辞典
  3. sudo / visudo

sudo / visudo

『sudo / visudo』は『Linux』でroot権限の操作を一般ユーザーに委譲するための仕組みです。sudo コマンドを使うと、指定されたユーザーが一時的にroot(または別のユーザー)の権限でコマンドを実行できます。権限の設定は /etc/sudoers ファイルで管理し、直接編集せず必ず visudo コマンド経由で編集します。Debian・Ubuntu 系では sudo グループ、RHEL・AlmaLinux 系では wheel グループへの追加が管理者権限付与の慣習です。

構文

# -----------------------------------------------
#  sudo の基本構文
# -----------------------------------------------

# sudo {コマンド}
#   → 現在のユーザーがrootとしてコマンドを実行します
#   例: sudo apt update

# sudo -u {ユーザー名} {コマンド}
#   → 指定したユーザーとしてコマンドを実行します
#   例: sudo -u kurisu python3 /home/kurisu/script.py

# sudo -i
#   → rootのログインシェルを起動します(環境変数もrootのものになります)

# sudo -s
#   → rootのシェルを起動します(現在の環境変数を引き継ぎます)

# sudo -l
#   → 現在のユーザーが sudo で実行できるコマンド一覧を表示します

# -----------------------------------------------
#  visudo の基本構文
# -----------------------------------------------

# visudo
#   → /etc/sudoers を安全に編集します
#   → 構文エラーがあると保存を拒否するため直接編集より安全です
#   → $EDITOR 環境変数で使用するエディタを切り替えられます
#   例: sudo visudo
#   例: sudo EDITOR=nano visudo

# visudo -c
#   → /etc/sudoers の構文チェックのみ行います(編集はしません)
#   例: sudo visudo -c

# visudo -f {ファイルパス}
#   → /etc/sudoers.d/ 以下のインクルードファイルを編集します
#   例: sudo visudo -f /etc/sudoers.d/okabe

# -----------------------------------------------
#  sudoers の書き方
# -----------------------------------------------

# {ユーザー名} {ホスト}=({実行ユーザー}:{実行グループ}) {コマンド}

# okabe ALL=(ALL:ALL) ALL
#   → okabe がすべてのホストで、すべてのユーザー/グループとして
#     すべてのコマンドを実行できます

# %wheel ALL=(ALL:ALL) ALL
#   → wheel グループのメンバー全員にフルのsudo権限を付与します
#   → RHEL・AlmaLinux 系での標準的な管理者グループです

# %sudo ALL=(ALL:ALL) ALL
#   → sudo グループのメンバー全員にフルのsudo権限を付与します
#   → Debian・Ubuntu 系での標準的な管理者グループです

# -----------------------------------------------
#  NOPASSWD オプション
# -----------------------------------------------

# {ユーザー名} ALL=(ALL) NOPASSWD: {コマンド}
#   → 指定したコマンドをパスワードなしで実行できます
#   → 自動化スクリプトやCI/CD環境でよく使われますが
#     セキュリティリスクがあるため最小権限に絞るべきです
#   例: kurisu ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

# kurisu ALL=(ALL) NOPASSWD: ALL
#   → すべてのコマンドをパスワードなしで実行できます
#   → 非常に危険な設定のため本番環境では避けてください

# -----------------------------------------------
#  コマンドのエイリアス
# -----------------------------------------------

# Cmnd_Alias {エイリアス名} = {コマンド1}, {コマンド2}, ...
#   → よく使うコマンドをまとめてエイリアスに定義します
#   例: Cmnd_Alias WEBSERVICE = /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx

# -----------------------------------------------
#  インクルードファイルの活用
# -----------------------------------------------

# /etc/sudoers.d/ ディレクトリにファイルを置くことで
# sudoers を分割管理できます
# ファイル名に . や ~ を含めてはいけません

構文一覧

操作コマンド / 書き方説明
rootとしてコマンド実行sudo {コマンド}一時的にroot権限でコマンドを実行します。実行後は元のユーザーに戻ります。
別ユーザーとして実行sudo -u {ユーザー名} {コマンド}指定したユーザーの権限でコマンドを実行します。rootだけでなく任意のユーザーへの切り替えに使用します。
rootシェルを起動(ログイン)sudo -irootのログインシェルを起動します。rootのホームディレクトリや環境変数が読み込まれます。
rootシェルを起動(非ログイン)sudo -s現在の環境変数を引き継いでrootのシェルを起動します。
実行可能コマンド確認sudo -l現在のユーザーがsudoで実行できるコマンドの一覧を表示します。権限確認に使います。
sudoersの編集sudo visudo/etc/sudoers を安全に編集します。構文エラーを自動チェックし、ロックファイルで同時編集を防ぎます。
インクルードファイルの編集sudo visudo -f /etc/sudoers.d/{ファイル名}/etc/sudoers.d/ 以下のファイルを安全に編集します。ユーザーやサービスごとに権限を分割管理できます。
構文チェックのみsudo visudo -c/etc/sudoers の構文が正しいかを確認します。編集は行いません。
フルアクセス付与(ユーザー)okabe ALL=(ALL:ALL) ALLsudoers内でユーザーにすべてのsudo権限を付与します。ホスト・実行ユーザー・コマンドすべてを許可します。
フルアクセス付与(グループ)%wheel ALL=(ALL:ALL) ALLwheelグループのメンバー全員にsudo権限を付与します。% プレフィックスがグループを示します。
NOPASSWD設定kurisu ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx指定コマンドをパスワードなしで実行できます。自動化に便利ですが権限の範囲は最小限にしてください。
コマンドエイリアス定義Cmnd_Alias {名前} = {コマンド1}, {コマンド2}複数のコマンドをひとつの名前にまとめます。同じコマンド組を複数のルールで参照できます。
wheelグループへの追加usermod -aG wheel {ユーザー名}ユーザーをwheelグループに追加してsudo権限を付与します。RHEL・AlmaLinux 系での慣習的な方法です。
sudoグループへの追加usermod -aG sudo {ユーザー名}ユーザーをsudoグループに追加してsudo権限を付与します。Debian・Ubuntu 系での慣習的な方法です。

使用例

# -----------------------------------------------
#  sudo の基本的な使い方
# -----------------------------------------------

# rootとしてシステムのパッケージリストを更新します
sudo apt update

# 現在のユーザーが実行できるsudoコマンドを確認します
sudo -l

実行するコマンドは次の通りです。

$ sudo -l
Matching Defaults entries for okabe on lab-server:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User okabe may run the following commands on lab-server:
    (ALL : ALL) ALL
ユーザーをwheelグループに追加してsudo権限を付与する(RHEL・AlmaLinux系)
# -----------------------------------------------
#  kurisu に sudo 権限を付与します(RHEL 系)
# -----------------------------------------------

# kurisu を wheel グループに追加します
# -a(append)を忘れると既存グループから外れるため必ず付けます
sudo usermod -aG wheel kurisu

# グループへの追加が反映されたか確認します
# kurisu が再ログインするまで新しいグループは有効になりません
groups kurisu

実行するコマンドは次の通りです。

$ groups kurisu
kurisu : kurisu wheel
visudoで特定ユーザーに限定的なNOPASSWD権限を設定する
# -----------------------------------------------
#  daru が nginx を再起動できるよう設定します
# -----------------------------------------------

# visudo でインクルードファイルを安全に編集します
sudo visudo -f /etc/sudoers.d/daru

実行するコマンドは次の通りです。

(エディタが開きます。以下の内容を記述して保存します)

同じ処理を次のようにも書けます。

# /etc/sudoers.d/daru の内容
# -----------------------------------------------
#  daru が nginx 関連の操作をパスワードなしで実行できます
# -----------------------------------------------

# 許可するコマンドをエイリアスにまとめます
# フルパスで指定することが重要です(パスインジェクション対策)
Cmnd_Alias NGINX_OPS = /usr/bin/systemctl restart nginx, \
                       /usr/bin/systemctl reload nginx, \
                       /usr/bin/systemctl status nginx

# daru に NGINX_OPS のみ NOPASSWD で許可します
# NOPASSWD: ALL のような広すぎる設定は避けてください
daru ALL=(ALL) NOPASSWD: NGINX_OPS

実行するコマンドは次の通りです。

$ sudo visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/daru: parsed OK

実装例は次の通りです。

# daru ユーザーで実際に動作確認します
sudo -u daru sudo systemctl reload nginx

# daru が使えるコマンドを確認します
sudo -l -U daru

実行するコマンドは次の通りです。

$ sudo -l -U daru
User daru may run the following commands on lab-server:
    (ALL) NOPASSWD: /usr/bin/systemctl restart nginx,
                    /usr/bin/systemctl reload nginx,
                    /usr/bin/systemctl status nginx
suzuhaに特定ディレクトリへの書き込み権限を別ユーザーとして委譲する
# -----------------------------------------------
#  suzuha が mayuri 所有のディレクトリに書き込めるよう設定します
# -----------------------------------------------

# mayuri のホームディレクトリの所有者を確認します
ls -la /home/mayuri/data/

実行するコマンドは次の通りです。

$ ls -la /home/mayuri/data/
drwxr-x--- 2 mayuri mayuri 4096 Mar 25 10:00 .
drwxr-xr-x 5 mayuri mayuri 4096 Mar 25  9:00 ..

実装例は次の通りです。

# visudo で suzuha に対して mayuri として実行する権限を設定します
sudo visudo -f /etc/sudoers.d/suzuha

同じ処理を次のようにも書けます。

# /etc/sudoers.d/suzuha の内容
# -----------------------------------------------
#  suzuha が mayuri ユーザーとして cp コマンドを実行できます
# -----------------------------------------------

suzuha ALL=(mayuri) NOPASSWD: /usr/bin/cp

同じ処理を次のようにも書けます。

# suzuha ユーザーで mayuri として cp を実行してデータをコピーします
sudo -u mayuri cp /tmp/report.txt /home/mayuri/data/report.txt

# コピー結果を確認します(ファイルの所有者が mayuri になります)
ls -la /home/mayuri/data/

実行するコマンドは次の通りです。

$ ls -la /home/mayuri/data/
drwxr-x--- 2 mayuri mayuri 4096 Mar 25 10:15 .
drwxr-xr-x 5 mayuri mayuri 4096 Mar 25  9:00 ..
-rw-r--r-- 1 mayuri mayuri  512 Mar 25 10:15 report.txt

概要

『sudo』は一般ユーザーが必要な権限だけを必要なときに借りるための仕組みであり、常時rootで作業するよりはるかに安全です。権限設定ファイル /etc/sudoers は構文エラーがあるとsudo自体が使えなくなるため、必ず visudo 経由で編集してください。visudo は保存時に構文チェックを行い、ロックファイルで同時編集も防ぎます。

NOPASSWD 設定はCI/CDパイプラインやデーモン管理など自動化に便利ですが、NOPASSWD: ALL のような設定はパスワードなしでシステム全体を掌握されるリスクがあります。許可するコマンドは Cmnd_Alias でフルパス指定し、必要最小限に絞ることが重要です。管理者グループの慣習はディストリビューションによって異なり、RHEL・AlmaLinux 系では wheel グループ、Debian・Ubuntu 系では sudo グループへの追加が標準的な方法です。ユーザーの追加には useradd / usermod を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。