sudo、sudoedit — 他のユーザーとしてコマンドを実行する
SYNOPSIS
sudo -h | -K | -k | -V
sudo -v [-ABkNnS] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-ABkNnS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command [arg ...]]
sudo [-ABbEHnPS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory]
[-r role] [-t type] [-T timeout] [-u user] [VAR=value] [-i | -s] [command [arg ...]]
sudoedit [-ABkNnS] [-C num] [-D directory] [-g group] [-h host] [-p prompt] [-R directory]
[-r role] [-t type] [-T timeout] [-u user] file ...
DESCRIPTION
sudo は、セキュリティポリシーで指定されたとおり、許可されたユーザーがスーパーユーザーまたは別のユーザーとしてコマンドを実行できるようにします。コマンドを呼び出すユーザーの実際の(有効ではない)ユーザー ID を使用して、セキュリティポリシーを照会するユーザー名を決定します。
sudo は、セキュリティポリシー、監査、および入出力ロギングのためのプラグインアーキテクチャをサポートします。サードパーティは独自のプラグインを開発および配布して、sudo フロントエンドとシームレスに連携させることができます。デフォルトのセキュリティポリシーは sudoers であり、これは /etc/sudoers ファイルまたは LDAP を介して構成されます。詳細については、「プラグイン」セクションを参照してください。
セキュリティポリシーは、ユーザーが sudo を実行できる権限を決定します。ポリシーでは、ユーザーがパスワードまたは別の認証メカニズムを使用して認証する必要がある場合があります。認証が必要な場合、ユーザーのパスワードが構成可能な時間制限内に入力されないと、sudo は終了します。この制限はポリシーによって異なります。デフォルトの sudoers セキュリティポリシーのデフォルトのパスワードプロンプトタイムアウトは 0 分です。
セキュリティポリシーは、資格情報のキャッシュをサポートして、ユーザーが認証を必要とせずに、一定期間 sudo を再度実行できるようにすることができます。デフォルトでは、sudoers ポリシーはターミナルごとに 15 分間資格情報をキャッシュします。sudoers(5) の timestamp_type オプションと timestamp_timeout オプションの詳細については、こちらを参照してください。sudo に -v オプションを付けて実行することで、ユーザーはコマンドを実行せずに、キャッシュされた資格情報を更新できます。
sudo がスーパーユーザー権限を取得するための主要な方法であるシステムでは、セキュリティポリシー構成ファイルでの構文エラーを回避することが不可欠です。デフォルトのセキュリティポリシー(sudoers(5))の場合、構成ファイルへの変更は、構文エラーが発生しないようにする visudo(8) ユーティリティを使用して行う必要があります。
sudoedit として呼び出された場合、-e オプション(以下で説明)が暗黙的に使用されます。
セキュリティポリシーと監査プラグインは、sudo を実行しようとする試行の成功と失敗の両方をログに記録できます。I/O プラグインが構成されている場合、実行中のコマンドの入力と出力もログに記録される場合があります。
次のオプションがあります。
-A, --askpass
通常、sudoがパスワードを必要とする場合、ユーザーのターミナルからパスワードを読み取ります。 -A(askpass)オプションが指定された場合、ユーザーのパスワードを読み取り、パスワードを標準出力に出力する(場合によってはグラフィカルな)ヘルパープログラムが実行されます。 SUDO_ASKPASS環境変数が設定されている場合、ヘルパープログラムへのパスを指定します。 それ以外の場合、sudo.conf(5)にaskpassプログラムを指定する行が含まれている場合、その値が使用されます。 例:
# askpassヘルパープログラムへのパス
Path askpass /usr/bin/ssh-askpass
askpassプログラムが利用できない場合、sudoはエラーで終了します。
-B, --bell
ターミナルが存在する場合、パスワードプロンプトの一部としてベルを鳴らします。 このオプションは、askpassプログラムが使用されている場合には影響しません。
-b, --background
指定されたコマンドをバックグラウンドで実行します。 シェルジョブ制御を使用して、sudoによって開始されたバックグラウンドプロセスを操作することはできません。 ほとんどのインタラクティブなコマンドは、バックグラウンドモードで正しく機能しません。
-C num, --close-from=num
コマンドを実行する前に、num以上のすべてのファイル記述子を閉じます。 3未満の値は許可されていません。 デフォルトでは、sudoはコマンドを実行する際に、標準入力、標準出力、および標準エラー以外のすべての開いているファイル記述子を閉じます。 セキュリティポリシーは、ユーザーがこのオプションを使用する機能を制限する場合があります。 sudoersポリシーは、管理者がclosefrom_overrideオプションを有効にした場合にのみ、-Cオプションの使用を許可します。
-D directory, --chdir=directory
現在の作業ディレクトリの代わりに、指定されたディレクトリでコマンドを実行します。 セキュリティポリシーは、ユーザーが作業ディレクトリを指定する許可を持っていない場合、エラーを返す場合があります。
-E, --preserve-env
ユーザーが既存の環境変数を保持したいことをセキュリティポリシーに示します。 セキュリティポリシーは、ユーザーが環境を保持する許可を持っていない場合、エラーを返す場合があります。
--preserve-env=list
ユーザーが環境から保持する環境変数のカンマ区切りリストを追加したいことをセキュリティポリシーに示します。 セキュリティポリシーは、ユーザーが環境を保持する許可を持っていない場合、エラーを返す場合があります。 このオプションは複数回指定できます。
-e, --edit
コマンドを実行する代わりに、1つまたは複数のファイルを編集します。 パス名の代わりに、セキュリティポリシーを参照するときに文字列「sudoedit」が使用されます。 ポリシーによってユーザーが承認されている場合、次の手順が実行されます。
編集するファイルのテンポラリコピーが作成され、所有者が呼び出しユーザーに設定されます。
ポリシーによって指定されたエディターが、テンポラリファイルを編集するために実行されます。
sudoersポリシーは、SUDO_EDITOR、VISUAL、およびEDITOR環境変数(この順で使用)を使用します。
SUDO_EDITOR、VISUAL、またはEDITORのいずれも設定されていない場合、sudoers(5)オプションにリストされている最初のプログラムが使用されます。
一時ファイルが変更された場合、一時ファイルは元の場所にコピーされ、一時バージョンは削除されます。
不正なファイルの編集を防ぐために、セキュリティポリシーで明示的に許可されていない限り、以下の制限が適用されます。
- シンボリックリンクは編集できません(バージョン1.8.15以降)。
- 編集対象のパスにあるシンボリックリンクは、親ディレクトリが呼び出しユーザーによって書き込み可能である場合、またはそのユーザーがrootユーザーである場合を除き、追跡されません(バージョン1.8.16以降)。
- 呼び出しユーザーによって書き込み可能なディレクトリにあるファイルは、そのユーザーがrootユーザーである場合を除き、編集できません(バージョン1.8.16以降)。
- ユーザーは、デバイス特殊ファイルを編集することはできません。
-
指定されたファイルが存在しない場合、ファイルが作成されます。sudoによって実行されるほとんどのコマンドとは異なり、エディターは呼び出しユーザーの環境を変更せずに実行されます。一時ファイルが編集後に空になった場合、ユーザーはインストール前にプロンプトが表示されます。 何らかの理由で、sudoが編集されたバージョンでファイルを更新できない場合、ユーザーは警告を受け、編集されたコピーは一時ファイルに残ります。
-g グループ、--group=グループ コマンドを、ターゲットユーザーのパスワードデータベースエントリで指定されたプライマリグループの代わりに、指定されたグループのプライマリグループとして実行します。グループは、グループ名または「#」文字で始まる数値グループID(GID)(例:「#0」はGID 0)のいずれかになります。GIDとしてコマンドを実行する場合、多くのシェルでは「#」をバックスラッシュ(\)でエスケープする必要があります。-uオプションが指定されていない場合、コマンドは呼び出しユーザーとして実行されます。どちらの場合も、プライマリグループはグループに設定されます。sudoersポリシーは、-Pオプションが使用されていない限り、ターゲットユーザーのすべてのグループが-gオプションで指定できることを許可します。
-H、--set-home セキュリティポリシーが、ターゲットユーザーのパスワードデータベースエントリで指定されたホームディレクトリにHOME環境変数を設定するように要求します。ポリシーによっては、これがデフォルトの動作になる場合があります。
-h、--help 短いヘルプメッセージを標準出力に表示して終了します。
-h ホスト、--host=ホスト セキュリティポリシープラグインがリモートコマンドをサポートしている場合、指定されたホストでコマンドを実行します。sudoersプラグインは、現在リモートコマンドの実行をサポートしていません。これは、-lオプションと組み合わせて、リモートホストのユーザーの権限を一覧表示するためにも使用できます。
-i、--login ターゲットユーザーのパスワードデータベースエントリで指定されたシェルを、ログインシェルとして実行します。これは、.profile、.bash_profile、または.loginなどのログイン固有のリソースファイルがシェルによって読み取られることを意味します。コマンドが指定されている場合、コマンドは-cオプションを使用してシェルに単純なコマンドとして渡されます。コマンドとすべての引数は連結され、スペースで区切られ、各文字(空白を含む)はバックスラッシュ(\)でエスケープされます(英数字、アンダースコア、ハイフン、ドル記号を除く)。コマンドが指定されていない場合、インタラクティブシェルが実行されます。sudoは、シェルを実行する前に、そのユーザーのホームディレクトリに切り替えるように試みます。コマンドは、ユーザーがログイン時に受信するのと同じ環境で実行されます。ほとんどのシェルは、コマンドが指定されている場合とインタラクティブセッションの場合で動作が異なります。詳細は、シェルのマニュアルを参照してください。sudoersポリシーが使用されている場合、-iオプションがコマンドの実行環境に与える影響は、sudoers(5)マニュアルの「コマンド環境」セクションに記載されています。
-K, --remove-timestamp
-k オプションと同様ですが、ユーザーのキャッシュされたすべての認証情報を削除します。これにより、sudo が次回実行されるときに、セキュリティポリシーで認証が必要な場合は、パスワードを入力する必要があります。-K オプションをコマンドまたは他のオプションと組み合わせて使用することはできません。このオプションではパスワードは必要ありません。すべてのセキュリティポリシーが認証情報のキャッシュをサポートしているわけではありません。
-k, --reset-timestamp
コマンドなしで使用すると、現在のセッションでユーザーのキャッシュされた認証情報を無効にします。sudo が次回セッションで実行されるときに、セキュリティポリシーで認証が必要な場合は、パスワードを入力する必要があります。デフォルトでは、sudoers ポリシーは、ターミナルごとに(またはターミナルが存在しない場合は親プロセス IDごとに)認証情報キャッシュに別のレコードを使用します。これにより、-k オプションが別のターミナルセッションで実行される sudo コマンドに干渉するのを防ぎます。詳細については、sudoers(5) の timestamp_type オプションを参照してください。このオプションではパスワードは必要なく、.logout ファイルから sudo 権限を取り消すために追加されました。
コマンドまたはパスワードが必要となる可能性のあるオプションと組み合わせて使用すると、このオプションにより sudo はユーザーのキャッシュされた認証情報を無視します。その結果、sudo はパスワードをプロンプトし(セキュリティポリシーで必要な場合)、ユーザーのキャッシュされた認証情報を更新しません。
すべてのセキュリティポリシーが認証情報のキャッシュをサポートしているわけではありません。
-l, --list
コマンドが指定されていない場合、呼び出しユーザー(または -U オプションで指定されたユーザー)の現在のホストでの権限を一覧表示します。このオプションが複数回指定され、セキュリティポリシーが詳細な出力形式をサポートしている場合、より詳細な形式で一覧表示されます。
コマンドが指定され、呼び出しユーザー(または -U オプションで指定されたユーザー)の現在のホストでセキュリティポリシーによって許可されている場合、コマンドへの完全修飾パスと引数が表示されます。-l が 1 回以上指定され(セキュリティポリシーがサポートしている場合)、一致するルールが詳細な形式で表示され、コマンドも表示されます。コマンドが指定されているが、ポリシーによって許可されていない場合、sudo はステータス値 1 で終了します。
-N, --no-update
ユーザーのキャッシュされた認証情報を更新しない。ユーザーが正常に認証された場合でも、更新は行われない。 -k フラグとは異なり、既存の有効なキャッシュされた認証情報が存在する場合は、それを使用する。ユーザーのキャッシュされた認証情報が有効であるか(または認証が不要であるか)を検出するには、以下を使用できる。
sudo -Nnv
セキュリティポリシーによっては、認証情報のキャッシュをサポートしていない場合がある。
-n, --non-interactive
いかなる種類の入力についても、ユーザーにプロンプトを表示しない。コマンドの実行にパスワードが必要な場合、sudo はエラーメッセージを表示して終了する。
-P, --preserve-groups
呼び出し元のユーザーのグループベクトルを変更せずに維持する。デフォルトでは、sudoers ポリシーは、ターゲットユーザーが属するグループのリストでグループベクトルを初期化する。ただし、実際のグループ ID と有効なグループ ID は、ターゲットユーザーに一致するように設定される。
-p prompt, --prompt=prompt
オプションのエスケープシーケンスを含むカスタムパスワードプロンプトを使用する。sudoers ポリシーでサポートされている、次のパーセント (‘%’) エスケープシーケンスがある。
%H ドメイン名を含むホスト名に展開される(マシンのホスト名が完全に修飾されているか、sudoers(5) で fqdn オプションが設定されている場合にのみ)
%h ドメイン名を含まないローカルホスト名に展開される
%p パスワードの要求に使用されているユーザーの名前に展開される(sudoers(5) の rootpw、targetpw、および runaspw フラグを尊重する)
%U コマンドが実行されるユーザーのログイン名に展開される(-u オプションも指定されていない場合は、デフォルトで root になる)
%u 呼び出し元のユーザーのログイン名に展開される
%% 連続する 2 つの ‘%’ 文字が 1 つの ‘%’ 文字に置き換えられる
カスタムプロンプトは、セキュリティポリシーまたは SUDO_PROMPT 環境変数によって指定されたデフォルトのプロンプトをオーバーライドする。PAM を使用するシステムでは、カスタムプロンプトは、sudoers で passprompt_override フラグが無効になっている場合を除き、PAM モジュールによって指定されたプロンプトもオーバーライドする。
-R directory, --chroot=directory
コマンドを実行する前に、指定されたルートディレクトリに変更する(chroot(8) を参照)。セキュリティポリシーは、ユーザーがルートディレクトリを指定する権限を持っていない場合、エラーを返すことがある。
このオプションは非推奨であり、将来のバージョンの sudo で削除される予定である。
-r role, --role=role
指定されたロールを含む SELinux セキュリティコンテキストでコマンドを実行する。
-S, --stdin
プロンプトを標準エラーに出力し、パスワードを標準入力から読み取る。ターミナルデバイスを使用しない。
-s, --shell
SHELL 環境変数が設定されている場合はそのシェルを、設定されていない場合は呼び出し元のユーザーのパスワードデータベースエントリに指定されたシェルを実行する。コマンドが指定されている場合は、シェルに単純なコマンドとして -c オプションを使用して渡す。コマンドと引数は連結され、スペースで区切られ、各文字(空白を含む)はバックスラッシュ (‘\’) でエスケープされる(英数字、アンダースコア、ハイフン、ドル記号を除く)。コマンドが指定されていない場合は、インタラクティブシェルが実行される。ほとんどのシェルは、コマンドが指定された場合とインタラクティブセッションで異なる動作をする。詳細については、シェルのマニュアルを参照すること。
-t type, --type=type
指定されたタイプを含む SELinux セキュリティコンテキストでコマンドを実行します。タイプが指定されていない場合、デフォルトのタイプはロールから派生します。
-U user, --other-user=user
-l オプションと組み合わせて、呼び出しユーザーではなく、指定されたユーザーの権限をリストするために使用します。セキュリティポリシーは、他のユーザーの権限をリストすることを制限する場合があります。sudoers ポリシーを使用する場合、-U オプションは root ユーザーと、指定されたユーザーに対して「リスト」権限を持つか、現在のホストで root ユーザーまたはユーザーとして任意のコマンドを実行できるユーザーに制限されます。
-T timeout, --command-timeout=timeout
コマンドのタイムアウトを設定するために使用します。タイムアウトが期限切れになる前にコマンドが終了しない場合、コマンドは終了されます。セキュリティポリシーは、ユーザーがタイムアウトを設定する機能を制限する場合があります。sudoers ポリシーでは、ユーザーが指定したタイムアウトを明示的に有効にする必要があります。
-u user, --user=user
デフォルトのターゲットユーザー(通常は root)以外のユーザーとしてコマンドを実行します。ユーザーは、ユーザー名または「#」文字で始まる数値ユーザー ID(UID)(例:UID 0 の場合は「#0」)のいずれかです。UID としてコマンドを実行する場合、多くのシェルでは「#」をバックスラッシュでエスケープする必要があります(例:\#)。一部のセキュリティポリシーは、UID をパスワードデータベースにリストされているものに制限する場合があります。sudoers ポリシーでは、targetpw オプションが設定されていない限り、パスワードデータベースにない UID を許可します。他のセキュリティポリシーはこれをサポートしていない場合があります。
-V, --version
sudo バージョン文字列と、構成されているプラグインのバージョン文字列を表示します。呼び出しユーザーがすでに root の場合、-V オプションは、sudo のビルド時に configure に渡されたオプションを表示します。プラグインは、デフォルトのオプションなど、追加の情報を表示する場合があります。
-v, --validate
ユーザーのキャッシュされた資格情報を更新し、必要に応じてユーザーを認証します。sudoers プラグインの場合、これはデフォルトで 15 分間、sudo タイムアウトを延長しますが、コマンドは実行されません。すべてのセキュリティポリシーがキャッシュされた資格情報をサポートしているわけではありません。
--
-- は、sudo オプションの終わりを示すために使用されます。後続のオプションは、コマンドに渡されます。
値を受け取るオプションは、説明でそれ以外に指定されている場合を除き、1 回だけ指定できます。これは、ユーザーが制御する入力で sudo を呼び出す可能性のある、不適切なスクリプトによって引き起こされる問題を回避するために役立ちます。
コマンドに対して設定する必要がある環境変数は、VAR=value の形式で sudo にオプションとして渡すこともできます。たとえば、LD_LIBRARY_PATH=/usr/local/pkg/lib などです。環境変数は、セキュリティポリシープラグインによって課される制限を受ける場合があります。sudoers ポリシーでは、オプションとして渡される環境変数は、既存の環境変数と同じ制限を受けますが、重要な違いが 1 つあります。sudoers で setenv オプションが設定されている場合、実行するコマンドに SETENV タグが設定されているか、一致するコマンドが ALL の場合、ユーザーは通常禁止されている変数を設定できます。詳細については、sudoers(5) を参照してください。
コマンド実行
sudo がコマンドを実行する場合、セキュリティポリシーはコマンドの実行環境を指定します。 通常、実際のユーザー ID と有効なユーザー ID、および実際のグループ ID と有効なグループ ID は、パスワードデータベースで指定されたターゲットユーザーに一致するように設定され、グループベクトルはグループデータベースに基づいて初期化されます(ただし、-P オプションが指定された場合は除きます)。
セキュリティポリシーで以下のパラメータを指定できます。
実際のユーザー ID と有効なユーザー ID
実際のグループ ID と有効なグループ ID
補助グループ ID
環境リスト
現在の作業ディレクトリ
ファイル作成モードマスク (umask)
SELinux ロールとタイプ
スケジューリング優先度(別名:nice 値)
プロセスモデル
sudo がコマンドを実行する方法は 2 つあります。
I/O ログプラグインがターミナル I/O のログを記録するように構成されている場合、またはセキュリティポリシーで明示的に要求された場合、新しい疑似端末(「pty」)が割り当てられ、fork(2) が使用されて 2 番目の sudo プロセス(「モニター」と呼ばれる)が作成されます。 モニターは、自身をリーダーとし、pty を制御端末として持つ新しい端末セッションを作成し、再度 fork(2) を呼び出し、上記のように実行環境を設定し、次に execve(2) システムコールを使用して、子プロセスでコマンドを実行します。 モニターは、ユーザーの端末とコマンドが実行されている pty の間でジョブ制御シグナルを中継します。 これにより、コマンドを通常どおり一時停止および再開できます。 モニターがないと、コマンドは POSIX で言う「孤立したプロセスグループ」になり、カーネルからジョブ制御シグナルを受信できなくなります。 コマンドが終了するか、シグナルによって終了すると、モニターはコマンドの終了ステータスをメインの sudo プロセスに渡し、終了します。 メインの sudo プロセスは、コマンドの終了ステータスを受信した後、セキュリティポリシーの close 関数、および構成されている監査プラグインの close 関数にコマンドの終了ステータスを渡し、終了します。 このモードは、sudoers ポリシーを使用する場合、sudo バージョン 1.9.14 以降ではデフォルトです。
pty が使用されない場合、sudo は fork(2) を呼び出し、上記のように実行環境を設定し、execve(2) システムコールを使用して、子プロセスでコマンドを実行します。 メインの sudo プロセスは、コマンドが完了するまで待機し、次にコマンドの終了ステータスをセキュリティポリシーの close 関数、および構成されている監査プラグインの close 関数に渡し、終了します。
特別なケースとして、ポリシープラグインが close 関数を定義していない場合、sudo は最初に fork(2) を呼び出す代わりに、コマンドを直接実行します。 sudoers ポリシープラグインは、I/O ログが有効になっている場合、pty が必要になる場合、SELinux ロールが指定されている場合、コマンドにタイムアウトが関連付けられている場合、または pam_session または pam_setcred オプションが有効になっている場合にのみ、close 関数を定義します。 pam_session と pam_setcred の両方は、PAM を使用するシステムではデフォルトで有効になっています。 このモードは、sudoers ポリシーを使用する場合、sudo バージョン 1.9.14 より前のバージョンではデフォルトです。
PAMを使用するシステムでは、セキュリティポリシーのクローズ関数は、PAMセッションを閉じます。また、コマンドの終了ステータスをログに記録することもあります。
シグナル処理
コマンドがsudoプロセスの子として実行される場合、sudoは受信したシグナルをコマンドに転送します。SIGINTおよびSIGQUITシグナルは、コマンドが新しいptyで実行されている場合、またはシグナルがユーザープロセスによって送信された場合にのみ転送されます。これにより、ユーザーがControl-Cを押すたびにコマンドがSIGINTを2回受信することがなくなります。SIGSTOPやSIGKILLなどの一部のシグナルはキャッチできないため、コマンドに転送されません。一般的には、sudoによって実行されているコマンドを一時停止したい場合は、SIGSTOPの代わりにSIGTSTPを使用する必要があります。
特別なケースとして、sudoは実行中のコマンドによって送信されたシグナルを転送しません。これにより、コマンドが誤って自身を終了させることを防ぎます。一部のシステムでは、reboot(8)ユーティリティは、システムを再起動する前に、自身以外のすべての非システムプロセスにSIGTERMを送信します。これにより、sudoが受信したSIGTERMシグナルをreboot(8)に転送するのを防ぎます。これにより、reboot(8)がシステムが実際に再起動される前に終了し、シングルユーザーモードに似た半死状態になるのを防ぎます。ただし、このチェックはsudoによって実行されるコマンドにのみ適用され、コマンドが作成する可能性のある他のプロセスには適用されないことに注意してください。その結果、reboot(8)またはshutdown(8)をsudo経由で実行するスクリプトを実行すると、システムがこの未定義の状態になる可能性があります。ただし、reboot(8)またはshutdown(8)は、system()の代わりにexec()ファミリの関数を使用して実行する必要があります(これにより、コマンドと呼び出しプロセスとの間にシェルが配置されます)。
プラグイン
プラグインは、sudo.conf(5)ファイル内のPluginディレクティブを介して指定できます。これらは、動的共有オブジェクト(サポートされているシステムの場合)として、またはsudoバイナリに直接コンパイルしてロードできます。sudo.conf(5)ファイルが存在しない場合、またはPlugin行が含まれていない場合、sudoはsudoers(5)をポリシー、監査、およびI / Oロギングプラグインとして使用します。詳細については、sudo.conf(5)マニュアルとsudo_plugin(5)マニュアルを参照してください。
終了値
コマンドが正常に実行されると、sudoからの終了ステータスは、実行されたプログラムの終了ステータスになります。コマンドがシグナルの受信によって終了した場合、sudoは自身に同じシグナルを送信します。
-l オプションがコマンドなしで指定された場合、sudo は、ユーザーが sudo を実行することを許可されており、セキュリティポリシーで必要とされるように正常に認証された場合に、0 の値で終了します。-l オプションにコマンドが指定されている場合、終了値が 0 になるのは、そのコマンドがセキュリティポリシーで許可されている場合に限られ、それ以外の場合は 1 になります。
認証に失敗した場合、構成/権限の問題が発生した場合、または指定されたコマンドを実行できない場合、sudo は 1 の値で終了します。後者の場合、エラー文字列が標準エラーに出力されます。sudo がユーザーの PATH 内の 1 つ以上のエントリを stat(2) できない場合、エラーが標準エラーに出力されます。(ディレクトリが存在しない場合、または実際にディレクトリでない場合は、そのエントリは無視され、エラーは出力されません。)これは通常は発生しません。stat(2) が「権限がありません」を返す最も一般的な理由は、自動マウンターを実行しており、PATH 内のディレクトリの 1 つが現在アクセス不能なマシン上にある場合です。
セキュリティに関する注意点
sudo は、外部コマンドを実行する際に安全性を確保するように設計されています。
コマンドのなりすましを防ぐために、sudo は PATH 内の「.」と「」の両方(どちらも現在のディレクトリを意味します)を、コマンドをユーザーの PATH 内で検索する際に最後にチェックします。セキュリティポリシーによっては、ユーザーの PATH 環境変数を変更、置換、または sudo が実行するプログラムに変更せずに渡すことができます。
ユーザーには、ユーザーが書き込み可能なファイル、またはユーザーが書き込み可能なディレクトリに存在するファイルを実行する sudo 権限を絶対に与えるべきではありません。ユーザーがコマンドを修正または置き換えることができる場合、実行できる追加のコマンドを制限する方法はありません。
デフォルトでは、sudo は明示的に実行するコマンドのみをログに記録します。「sudo su」や「sudo sh」などのコマンドを実行した場合、そこから実行される後続のコマンドは、sudo のセキュリティポリシーの対象になりません。シェルエスケープを提供するコマンド(ほとんどのエディターを含む)も同様です。I/O ログが有効になっている場合、後続のコマンドの入力および/または出力はログに記録されますが、それらのコマンドに対する従来のログは記録されません。このため、sudo 経由でコマンドへのアクセスを与える際には、そのコマンドがユーザーに実質的なルートシェルを誤って与えることがないように注意する必要があります。これに対処する方法については、sudoers(5) の「シェルエスケープの防止」セクションを参照してください。
sudo は、実行中にコアダンプをデフォルトで無効にすることで、潜在的に機密性の高い情報の漏えいを防ぎます(実行されるコマンドについては、コアダンプが再度有効になります)。この慣習は、ほとんどのオペレーティングシステムが、set-user-ID プロセスがデフォルトでコアダンプを実行できるようにしていた時代にまで遡ります。sudo のクラッシュのデバッグを支援するために、sudo.conf(5) ファイルで「disable_coredump」を false に設定して、コアダンプを再度有効にすることができます。
^ isable_coredump を false に設定します。
詳細については、sudo.conf(5) マニュアルを参照してください。
環境変数
^ udo は、以下の環境変数を使用します。セキュリティポリシーがコマンドの実際の環境の内容を制御します。
^ DITOR -e (sudoedit) モードで使用するデフォルトのエディター。SUDO_EDITOR または VISUAL が設定されていない場合に使用されます。
^ AIL -i オプションが指定された場合、または sudoers で env_reset が有効になっている場合 (ただし、MAIL が env_keep リストに含まれている場合は除く) に、ターゲットユーザーのメールスプールに設定されます。
^ OME -i または -H オプションが指定された場合、-s オプションが指定され、sudoers で set_home が設定されている場合、sudoers で always_set_home が有効になっている場合、または sudoers で env_reset が有効になり、HOME が env_keep リストに含まれていない場合に、ターゲットユーザーのホームディレクトリに設定されます。
^ OGNAME -i オプションが指定された場合、sudoers で set_logname オプションが有効になっている場合、または sudoers で env_reset オプションが有効になっている場合 (ただし、LOGNAME が env_keep リストに含まれている場合は除く) に、ターゲットユーザーのログイン名に設定されます。
^ ATH セキュリティポリシーによってオーバーライドされる場合があります。
^ HELL -s オプションで使用するシェルを決定するために使用されます。
^ UDO_ASKPASS ターミナルが利用できない場合、または -A オプションが指定された場合に、パスワードを読み取るために使用するヘルパープログラムへのパスを指定します。
^ UDO_COMMAND sudo によって実行されるコマンドとその引数に設定されます。引数は 4096 文字に切り捨てられ、潜在的な実行エラーを防ぎます。
^ UDO_EDITOR -e (sudoedit) モードで使用するデフォルトのエディター。
^ UDO_GID sudo を呼び出したユーザーのグループ ID に設定されます。
^ UDO_HOME sudo を呼び出したユーザーのホームディレクトリに設定されます。
^ UDO_PROMPT -p オプションが指定されていない限り、デフォルトのパスワードプロンプトとして使用されます。
^ UDO_PS1 設定されている場合、実行されているプログラムに対して PS1 の値が設定されます。
^ UDO_TTY ターミナルが存在する場合、sudo を呼び出したユーザーのターミナルデバイスに設定されます。
^ UDO_UID sudo を呼び出したユーザーのユーザー ID に設定されます。
^ UDO_USER sudo を呼び出したユーザーのログイン名に設定されます。
^ SER 上記の LOGNAME と同じ値に設定されます。
^ ISUAL SUDO_EDITOR が設定されていない場合に、-e (sudoedit) モードで使用するデフォルトのエディター。
ファイル
^ etc/sudo.conf sudo のフロントエンド構成
例
以下の例は、適切に構成されたセキュリティポリシーを前提としています。
読み取りアクセスできないディレクトリのファイルリストを取得するには:
$ sudo ls /usr/local/protected
ファイルシステムが ~yaz としてルートとしてエクスポートされていないマシンで、ユーザー yaz のホームディレクトリをリストするには:
$ sudo -u yaz ls ~yaz
ユーザー www として index.html ファイルを編集するには:
$ sudoedit -u www ~www/htdocs/index.html
root ユーザーと adm グループのユーザーのみがアクセスできるシステムログを表示するには:
$ sudo -g adm more /var/log/syslog
jim ユーザーとして別のプライマリグループを持つエディターを実行するには:
$ sudoedit -u jim -g audio ~jim/sound.txt
マシンをシャットダウンするには:
$ sudo shutdown -r +15 "quick reboot"
/home パーティション内のディレクトリの使用量一覧を作成します。コマンドはサブシェルで実行され、cd コマンドとファイルリダイレクトが機能するようにします。
$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
診断
sudo によって生成されるエラーメッセージ:
書き込み可能なディレクトリ内のファイルの編集は許可されていません
デフォルトでは、sudoedit は、呼び出しユーザーが書き込み可能な親ディレクトリのいずれかにファイルがある場合、そのファイルの編集を許可しません。これにより、ユーザーが任意のファイルを上書きできる可能性がある競合状態を回避します。sudoers(5) の sudoedit_checkdir オプションの詳細を参照してください。
シンボリックリンクの編集は許可されていません
デフォルトでは、sudoedit はファイルのオープン時にシンボリックリンクを追跡しません。sudoers(5) の sudoedit_follow オプションの詳細を参照してください。
有効な uid は 0 ではありません。sudo は setuid root としてインストールされていますか?
sudo が root 権限で実行されていません。sudo バイナリは root ユーザーが所有し、set-user-ID ビットが設定されている必要があります。また、nosuid オプションでマウントされたファイルシステム上、または uid 0 を特権を持たない uid にマッピングする NFS ファイルシステム上には配置しないでください。
有効な uid は 0 ではありません。sudo は、`nosuid` オプションが設定されたファイルシステム上、または、root 権限を持たない NFS ファイルシステム上にありますか?
sudo が root 権限で実行されていません。sudo バイナリには適切な所有者と権限がありますが、それでも root 権限で実行されていません。最も一般的な理由は、sudo バイナリが配置されているファイルシステムが、nosuid オプションでマウントされているか、uid 0 を特権を持たない uid にマッピングする NFS ファイルシステムであることです。
致命的なエラー、プラグインをロードできません
sudo.conf(5) で指定されたプラグインのロードまたは初期化中にエラーが発生しました。
無効な環境変数名
-E オプションで指定された 1 つ以上の環境変数名に等号 (=) が含まれています。-E オプションの引数は、関連する値のない環境変数名である必要があります。
パスワードが提供されていません
sudo がパスワードを読み込もうとしたときに、文字が受信されませんでした。これは、ターミナルが利用できない場合 (または -S オプションが指定された場合) に、標準入力が /dev/null からリダイレクトされた場合に発生する可能性があります。
ターミナルが必要です
sudo はパスワードを読み取る必要がありますが、パスワードを読み取るためのメカニズムがありません。ssh(1) を介して実行されるリモートコマンドは、デフォルトではターミナルを持っていません。ssh(1) に -t オプションを渡すと、ターミナルが割り当てられ、sudo がパスワードを読み取ることができるようになります。ターミナルなしでローカルコマンドを実行できるようにするには、-S オプションを使用して、標準入力からパスワードを読み込むか、sudo.conf(5) ファイルまたは SUDO_ASKPASS 環境変数を設定して、askpass ヘルパーを構成できます。
書き込み可能な一時ディレクトリが見つかりません
sudoedit は、中間ファイルを保存できる使用可能な一時ディレクトリを見つけることができませんでした。
「新しい権限なし」フラグが設定されており、sudo が root として実行されるのを防ぎます
sudo は、「新しい権限なし」フラグが設定された Linux プロセスによって実行されました。これにより、実行可能ファイルの set-user-ID ビットが無視され、sudo が機能しなくなります。最も可能性の高い原因は、このフラグを設定したコンテナ内で sudo を実行することです。コンテナを構成して、このフラグが設定されないようにできるかどうか、ドキュメントを確認してください。
sudo は uid 0 の所有である必要があり、setuid ビットが設定されている必要があります
sudo は root 権限で実行されませんでした。sudo バイナリは、正しい所有者または権限を持っていません。root ユーザーが所有し、set-user-ID ビットが設定されている必要があります。
sudoedit はこのプラットフォームではサポートされていません
sudoedit は、有効なユーザー ID を設定できるシステムでのみ実行できます。
パスワードの読み込みがタイムアウトしました
ユーザーがパスワードを入力する前に、パスワードのタイムアウト時間 (デフォルトは 5 分) が経過しました。
あなたは passwd データベースに存在しません
ユーザー ID がシステムの passwd データベースに表示されていません。
編集モードで環境変数を指定することはできません
環境変数を指定できるのは、コマンドを実行する場合のみです。ファイルを編集する場合、エディターはユーザーの環境を変更せずに実行されます。
関連項目
su(1)、stat(2)、login_cap(3)、passwd(5)、sudo.conf(5)、sudo_plugin(5)、sudoers(5)、 sudoers_timestamp(5)、sudoreplay(8)、visudo(8)
歴史
sudo ディストリビューション (https://www.sudo.ws/about/history/) の HISTORY.md ファイルを参照して、sudo の簡単な履歴を確認してください。
著者
長年にわたって多くの人々が sudo に携わってきました。このバージョンは主に次のコードで構成されています。
Todd C. Miller
sudo ディストリビューション (https://www.sudo.ws/about/contributors/) の CONTRIBUTORS.md ファイルを参照して、sudo に貢献した人々の詳細なリストを確認してください。
注意事項
sudo を通じて任意のコマンドを実行することを許可されたユーザーが root シェルを取得するのを簡単に防ぐ方法はありません。また、多くのプログラム (エディターなど) は、ユーザーがシェルエスケープを介してコマンドを実行できるようにするため、sudo のチェックを回避できます。ただし、ほとんどのシステムでは、sudoers(5) プラグインの noexec 機能を使用して、シェルエスケープを防止できます。
^ d コマンドを直接 sudo で実行するのは意味がありません。
$ sudo cd /usr/local/protected
コマンドが終了すると、親プロセス (シェル) は同じままになります。`-D` オプションを使用して、特定のディレクトリでコマンドを実行できます。
sudo を介してシェルスクリプトを実行すると、一部のオペレーティングシステムで set-user-ID シェルスクリプトを安全でない状態にする可能性がある、同じカーネルバグが発生する可能性があります (OS に /dev/fd/ ディレクトリがある場合、set-user-ID シェルスクリプトは通常は安全です)。
バグ
sudoにバグがあると思われる場合は、sudoのバグデータベースであるhttps://bugzilla.sudo.ws/でバグ報告を提出するか、https://github.com/sudo-project/sudo/issuesでissueを開いてください。メールを使用したい場合は、sudo-workersメーリングリストであるhttps://www.sudo.ws/mailman/listinfo/sudo-workers (公開) または <_> (非公開) にメッセージを送信できます。
セキュリティ上の脆弱性は、公開されているGitHubのissue、Bugzilla、またはメーリングリストで報告しないでください。代わりに、メールで<_>に報告してください。必要に応じて、https://www.sudo.ws/dist/PGPKEYSにあるキーを使用してメッセージをPGPで暗号化することもできます。
サポート
限られた無料サポートは、sudo-usersメーリングリストを通じて提供されます。購読またはアーカイブの検索については、https://www.sudo.ws/mailman/listinfo/sudo-usersをご覧ください。
免責事項
sudoは「現状のまま」提供され、明示的または黙示的な保証(商品性および特定の目的に対する適合性の黙示的保証を含むがこれに限定されない)はすべて放棄されます。完全な詳細については、sudoに同梱されているLICENSE.mdファイルまたはhttps://www.sudo.ws/about/license/を参照してください。