Linux / コマンド / sudo - 他のユーザー権限でコマンドを実行

sudoは、セキュリティポリシーで許可されたユーザーが、あるコマンドを他のユーザーの権限で実行できるようにするツールです。対象のユーザーを指定しない場合、通常はrootとして実行されますが、実際の権限や認証方式はシステムのsudoポリシーによって決定されます。

パッケージのインストールやサービス管理のように管理者権限が必要な作業を行うときに便利ですが、コマンドを誤って入力するとシステム全体に影響を与える可能性があります。実行前に対象ファイルとオプションを確認し、必要なコマンドにのみ最小限の権限を付与することが重要です。

この記事の詳細なオプション説明は、従来のsudo(sudo.ws)を基準にします。Ubuntu 26.04の標準sudoはsudo-rsであり、sudo-rsの実装差異では、例えば-Eが未対応と説明されています。適用前にcommand -v sudo、sudo --version、sudo --helpと、その環境のマニュアルを確認してください。

sudoコマンドとは?

sudoは、許可されたユーザーがスーパーユーザーまたは他のユーザーとしてコマンドを実行できるようにします。ただ単に全てのユーザーに管理者権限を与えるツールではなく、誰がどのホストでどのユーザー権限でどのコマンドを実行できるかをポリシーで制御する構造です。

従来のsudoの基本ポリシープラグインはsudoersであり、通常は/etc/sudoersと/etc/sudoers.d/の設定を使用します。システムは実行リクエストをポリシーと照合し、必要な場合はユーザーを認証した後、許可されたコマンドのみを実行します。

詳細な実行方法は、sudo 公式マニュアルページ、ポリシー構文は sudoers 公式マニュアルページで確認できます。

基本構文と初回実行

一般的な構文は以下の通りです。

sudo [オプション] コマンド [引数...]

DebianやUbuntu 系でパッケージリストを更新する例は以下の通りです。

sudo apt update

認証が必要な場合、通常は現在ログインしているユーザーのパスワードを求められます。入力中に文字を表示しない実装・設定もあります。一方、sudo-rsでは既定でアスタリスクを表示します。表示方式は実装と設定によるため、文字が出るかどうかだけで異常と判断しません。システムのポリシーにより、対象ユーザーのパスワードや他の認証方法を求める場合もあります。

権限が許可され、認証に成功すると、apt update プロセスのみが対象の権限で実行されます。現在のシェル全体が自動的に管理者シェルに変わるわけではありません。

よく使う sudo オプション

オプション 機能 活用例と注意点
-u ユーザー 指定したユーザーでコマンド実行 sudo -u postgres psql
-g グループ 指定したグループでコマンド実行 ポリシーで許可されたグループのみ使用可能
-l 現在のユーザーの許可コマンド確認 実行前の権限範囲チェックに便利
-v 認証情報を確認または更新 コマンドは実行せず、タイムスタンプを更新
-k 現在の認証タイムスタンプを無効化 認証が必要な次回の実行で認証し直す。NOPASSWD対象などは例外
-K ユーザーの認証タイムスタンプを完全に削除 -k より強い初期化
-i 対象ユーザーのログインシェルを実行 複数の管理作業に使用するが、範囲が広くなる
-s シェルを実行 呼び出し環境の影響を受ける可能性があるため目的を確認
-n 非対話型実行 パスワードが必要な場合は尋ねずに失敗
-H HOMEを対象ユーザーのホームに設定するよう要求 ポリシーに従って動作し、必ずしも必要ではない
-E 従来のsudoで環境変数の保持を要求。sudo-rsでは未対応 ポリシーが許可する必要があり、セキュリティ上慎重に使用
-e, sudoedit 権限が必要なファイルを安全な編集フローで修正 sudoedit /etc/example.conf

他のユーザー権限で実行する

-uで対象ユーザーを指定する

対象ユーザーを省略すると、通常 root が使用されます。-u を指定すると、ポリシーが許可した他のユーザーとして実行できます。

sudo -u postgres psql

サービスアカウントのファイル権限や環境でコマンドを実行する際に便利です。ただし、ログインシェルが制限されているサービスアカウントもあるため、まずそのアカウントの用途とポリシーを確認してください。

実行ユーザーの確認

現在のポリシーが実際にどのユーザー権限を付与しているか簡単に確認するには、id を使用できます。

sudo id
sudo -u postgres id

実際の出力はシステムのユーザーとグループ構成によって異なります。単純に確認するには、管理者シェルを開くよりも個々のコマンドで検査するほうが範囲が限定されます。

許可された権限の確認と認証キャッシュ

sudo -l で実行可能なコマンドの確認

sudo -l は、現在のユーザーに適用される基本設定と実行可能なコマンドを表示します。権限がないというエラーが発生した場合、むやみに設定を変更する前にまず確認できます。

sudo -l

管理者は権限がある場合、-Uで他のユーザーのポリシーを確認できますが、一般ユーザーは通常、自分の権限のみを参照します。

sudo -vで認証を更新する

sudo -vはコマンドを実行せずに保存された認証情報を確認または更新します。複数の管理コマンドを実行する前に認証状態を準備する際に使用できます。

sudo -v

認証キャッシュの基本時間と範囲はsudoersポリシーによって異なります。一定時間パスワードを再入力しないからといって、すべてのコマンドが許可されるわけではなく、各コマンドは引き続きポリシーのチェックを受けます。

sudo -kで認証状態をクリアする

共用端末や管理作業を終えた後、次回実行時に再度認証させたい場合はsudo -kを使用します。

sudo -k

-Kはユーザーの認証タイムスタンプを完全に削除します。詳細な違いはインストールされているsudoのバージョンとポリシーを確認してください。

コマンドの連結やパイプに注意する点

sudoは直後のコマンドにのみ適用されます

sudoは次のコマンドの最初のapt updateにのみ適用されます。以下のapt upgradeは現在のユーザー権限で実行されます。

sudo apt update && apt upgrade

両方のコマンドに管理者権限が必要な場合、それぞれに付ける最も明確な方法はsudoを付与することです。

sudo apt update && sudo apt upgrade

接続オペレーターの実行条件を正確に理解するために、 Bashコマンドの接続オペレーターの使い方も確認できます。

パイプの両側は別々のプロセスです

パイプで接続された各コマンドは別々に実行されます。以下の例では、ターゲット特権で最初のコマンドのみが実行され、grepは現在のユーザーで実行されます。

sudo some-command | grep 'pattern'

読み取りのみのフィルターコマンドでも、通常のユーザー権限があっても十分な場合が多いです。パイプ全体に高い権限を与えるのではなく、実行前に実際に権限が必要なステップを絞り込んでください。

シェル全体を動かす方法は広範です

sudo sh -c 'コマンド1 && コマンド2'のように対象権限のシェルで複数のコマンドを実行することもできますが、引用ルールが複雑になり、権限範囲が広くなります。単純な作業であれば、各コマンドにsudoを明示する方がレビューと記録に有利です。

リダイレクションでPermission deniedが発生する理由

出力リダイレクションは現在のシェルが処理します

次のコマンドはechoのみ管理者権限で実行します。>リダイレクションはsudoを実行する前に現在のシェルが処理するため、保護されたファイルを開けない場合があります。

sudo echo 'value' > /etc/example.conf

teeで必要な書き込みだけ権限昇格する

短い一行を追加したり上書きする場合は、標準入力をsudo teeに渡すことができます。

printf '%s\n' 'value' | sudo tee /etc/example.conf > /dev/null

既存ファイルの末尾に追加する場合はtee -aを使用します。実行前に対象パスと上書きの有無を必ず確認してください。

printf '%s\n' 'value' | sudo tee -a /etc/example.conf > /dev/null

設定ファイルはsudoeditで編集する

複数行の設定を修正する場合は、sudoeditの方が適しています。ポリシーが許可した一時コピーを現在のユーザーで編集し、変更内容を元のファイルに反映させます。

sudoedit /etc/example.conf

エディタ全体を管理者権限で実行するよりも権限範囲を狭めることができますが、シンボリックリンクや書き込み可能なディレクトリなどに対する実際の制限はsudoバージョンとポリシーに従います。

管理者シェル: sudo -iとsudo -s

方式 一般的な動作 適した状況
sudo コマンド コマンド1つだけを対象権限で実行 ほとんどの一時的な管理作業に推奨
sudo -i 対象ユーザーのログイン環境を模したシェル実行 連続した管理作業がどうしても必要な場合
sudo -s 呼び出しユーザーのシェルまたは環境が指定したシェルを実行 環境の違いを理解し、シェルが必要な場合

管理者シェルでは、以降に入力するコマンドごとにsudoが表示されないため、ミスの影響範囲を把握しにくくなります。一つか二つの作業であれば管理者シェルよりsudo コマンド形式を使用し、シェルを開いた場合はプロンプトと現在のユーザー・作業ディレクトリを常に確認してください。

sudoersはvisudoで修正する

なぜ直接編集してはいけないのですか?

/etc/sudoersに文法エラーが発生すると、sudo自体が動作しない可能性があります。visudoは同時編集を防ぐためファイルをロックし、保存前に基本的な妥当性と文法をチェックします。

sudo visudo

安全な編集手順はvisudo公式マニュアルページで確認できます。

別の sudoers.d ファイルを使用する

役割ごとのルールを分けるには、/etc/sudoers.d/の下に別ファイルを作成できます。まず、対象システムの基本 sudoers がこのディレクトリを含むか確認し、ファイル名の規則もチェックしてください。

sudo visudo -f /etc/sudoers.d/service-maintenance

一部の sudoers 構成では、ファイル名にドットが含まれたり、チルダで終わる項目を無視する場合があるため、単純な英数字やハイフンの名前を使用する方が安全です。

変更後に全体の文法を検査する

既存の sudoers および含まれるファイルの文法を検査するには、次のコマンドを使用します。

sudo visudo -c

検査が成功したからといって、権限設計が安全であるとは限りません。別の管理者セッションを維持した状態で対象ユーザーとして sudo -l を確認し、許可・拒否動作をテストした後、セッションを終了することをお勧めします。

sudoers ルールの基本構造

sudoers ルールは概念的に次の項目を組み合わせます。

ユーザー  ホスト=(実行ユーザー:実行グループ) タグ: コマンド
項目 意味 設計時に確認すべき点
ユーザーまたはグループ ルールを適用する主体 グループは一般的に %グループ名 として表現
ホスト ルールが有効なシステム 中央ポリシーでホストの範囲を過度に広げない
実行ユーザー・グループ コマンドが実行される対象アカウント ALLより必要なアカウントのみ指定
タグ 認証・実行・ログ動作の調整 NOPASSWDなどはリスクを評価した上で制限的に使用
コマンドと引数 許可する実行ファイルおよび任意の引数 絶対パスと固定引数で範囲を絞る

以下はdeployユーザーが決められたサービスの再起動と状態確認のみをrootで実行できるように制限する例です。実際に適用する前に、そのコマンドが他のコマンドの実行やファイルの変更を迂回的に許可していないかを確認する必要があります。

deploy ALL=(root) /usr/bin/systemctl restart webapp.service, /usr/bin/systemctl is-active webapp.service

実行ファイルの実際のパスはシステムごとに異なるため、command -v systemctlなどで確認します。ユーザーが変更可能なスクリプトやユーザーが書き込み可能なディレクトリの実行ファイルをsudoersに許可すると、その内容を変えて任意のコマンドを高権限で実行することができます。

最小権限でsudoersを設計する

ALLやNOPASSWDを習慣的に使用しない

ALL=(ALL) NOPASSWD: ALLのようなルールは、実質的に広範なパスワード不要の管理者権限を提供します。自動化が必要であっても、専用アカウント、固定された実行ファイルと引数、ログ、秘密情報の保護、呼び出し経路を合わせて設計する必要があります。

シェル脱出が可能なプログラムに注意する

エディタ、ページャー、シェルを呼び出せるプログラム、任意のファイルを書き込んだりプラグインを読み込むツールは、制限されたコマンドのように見えても、管理者シェルにつながる可能性があります。コマンド名だけで安全だと判断せず、そのプログラムの全機能や環境変数、設定ファイルを確認してください。

コマンドのパスと引数を具体的に制限する

コマンドは絶対パスで指定し、可能であれば許可する引数まで固定します。ワイルドカードや否定ルールは予期しないパスに一致したり回避される可能性があるため、sudoersのコマンド一致ルールを正確に理解した上で使用する必要があります。

権限変更を記録し、定期的にレビューする

sudoポリシーの変更には、申請者、レビュー担当者、目的と期限を残すことが望ましいです。使用していないアカウントやルールを削除し、実際のログやsudo -lの結果を基に過剰な権限がないかを定期的に確認してください。

環境変数とパスが変わる理由

sudoは環境をそのままコピーしないことがあります

sudoersのデフォルト設定では、危険な環境変数を削除したり制限された環境を構築することができます。PATH、HOME、プロキシ変数や言語設定が通常のシェルと異なるため、コマンドの動作が変わることがあります。

sudo env

問題解決のために一般ユーザー環境のenvの結果と比較することはできますが、出力にトークンや秘密情報が含まれる可能性があるため、共有前に内容を確認してください。

sudo -Eは慎重に使用すること

この節の-Eは従来のsudoの機能で、sudo-rsでは未対応です。呼び出しユーザーの環境を保持するようポリシーに要求します。ポリシーは拒否する場合があり、ライブラリパス・プロキシ・実行パスなどの環境値は高権限プログラムの動作を変更する可能性があります。必要な変数だけをsudoersで明示的に許可する方法が一般的により安全です。

自動化でsudoを使用する

-nでパスワード待機を防ぐ

自動化作業で対話的なパスワード入力を待つと作業が停止する可能性があります。-nは認証入力が必要なときにすぐに失敗させます。

sudo -n /usr/bin/systemctl restart webapp.service

成功かどうかは終了状態とログで確認してください。パスワードをスクリプトやコマンドラインに入れる方法は、プロセスリスト、シェル履歴やログに露出する可能性があるため使用しないでください。

必要なコマンドだけを非対話的に許可する

無人実行が必須の場合、専用サービスアカウントで決められたコマンドと引数のみを許可し、実行ファイルと関連設定をそのアカウントが変更できないようにするべきです。広範なNOPASSWD権限の代わりに作業専用API、systemdサービス、権限が制限されたヘルパープログラムも検討できます。

よく発生するエラーと解決方法

メッセージまたは症状 考えられる原因 確認方法
user is not in the sudoers file ユーザーに許可されている規則がない 管理者に必要なコマンドと目的を伝える
not allowed to execute 該当するコマンド・引数の組み合わせがポリシーと一致しない sudo -lで許可範囲を確認
command not found sudoのPATHがユーザーシェルと異なる 絶対パスとsecure_pathを確認
パスワードを再度要求 認証キャッシュの期限切れ、または端末・ポリシーの違い ポリシーとタイムスタンプ設定を確認
リダイレクトで権限拒否 現在のシェルが保護されたファイルを先に開こうとしている sudoeditまたは制限付きteeを使用
sudoers構文エラー 直接編集または誤ったルール 復元セッションでは visudo -c で確認

sudo 使用時のセキュリティ原則

  • インターネットや文書からコピーしたコマンドは、実行前にオプションと対象パスを直接確認します。
  • sudo rm、ディスク・パーティション・ファイアウォール・アカウント関連のコマンドは、復元方法と影響をまず確認します。
  • 一度限りのコマンドのために長時間管理者シェルを維持しません。
  • パスワード、トークン、秘密鍵をコマンドライン・スクリプト・環境変数に無分別に入れません。
  • ユーザーが修正可能なスクリプトや実行ファイルに高い権限を付与しません。
  • sudoのログの場所と保持ポリシーを確認し、重要な環境では中央ログと入出力監査をチェックします。

sudoがコマンドを記録しても、sudo shやシェル脱出後に実行された個別コマンドまで伝統的なコマンドログにすべて残るわけではありません。入出力ログが別途設定されているか確認する必要があります。

よくある質問

sudoは常にroot権限で実行されますか?

対象ユーザーを省略すると通常rootがデフォルトですが、-uで他のユーザーを指定でき、実際に許可されるかどうかはポリシーが決定します。sudoの核心はroot専用実行ではなく、許可された他のユーザー権限でコマンドを実行することです。

sudoがパスワードを要求しない理由は何ですか?

最近の認証情報がポリシーで定められた時間内で有効であるか、そのコマンドにNOPASSWDルールが適用されていた可能性があります。sudo -lでポリシーを確認し、次回実行時に再度認証するにはsudo -kを使用できます。

sudo cdが現在のディレクトリを変更しない理由は何ですか?

cdは、現在のシェルの作業ディレクトリを変更するシェル組み込みコマンドです。別のプロセスでディレクトリを変更しても、親シェルには反映されません。特定のディレクトリでコマンドを実行したい場合は、そのコマンドがサポートする作業ディレクトリオプションやsudoの-D対応を確認してください。

sudoersファイルを一般的なエディタで修正してもよいですか?

推奨されません。文法エラーによりsudoを使用できなくなる可能性があるため、visudoを使用する必要があります。別ファイルもsudo visudo -f /etc/sudoers.d/ファイル名で編集し、全体の設定はsudo visudo -cで確認してください。

まとめ

管理者権限が必要なコマンド一つはsudo コマンド、他のユーザーとして実行する場合はsudo -u ユーザー コマンド、許可範囲はsudo -lで確認します。認証状態は-vで更新し、作業後に-kで無効化できます。

設定ファイルはvisudoとsudoeditを活用し、sudoersルールは絶対パス・固定引数・最小権限を基準に設計してください。その他の基本管理コマンドも確認したい場合は、Linuxでよく使うコマンド一覧を参考にできます。