「Sudo」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→sudo を使って X11 アプリを実行: 削除) |
(→ヒントとテクニック: 同期) |
||
| (4人の利用者による、間の35版が非表示) | |||
| 1行目: | 1行目: | ||
[[Category:セキュリティ]] |
[[Category:セキュリティ]] |
||
| − | [[Category:コマンド |
+ | [[Category:コマンド]] |
| − | [[ |
+ | [[de:sudo]] |
[[en:Sudo]] |
[[en:Sudo]] |
||
[[es:Sudo]] |
[[es:Sudo]] |
||
| − | [[fa:sudo]] |
||
[[fr:Sudo]] |
[[fr:Sudo]] |
||
| − | [[ |
+ | [[pt:Sudo]] |
[[ru:Sudo]] |
[[ru:Sudo]] |
||
| − | [[ |
+ | [[uk:Sudo]] |
[[zh-hans:Sudo]] |
[[zh-hans:Sudo]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|ユーザーとグループ}} |
{{Related|ユーザーとグループ}} |
||
{{Related|su}} |
{{Related|su}} |
||
| + | {{Related|doas}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
| − | [https://www.sudo.ws/sudo/ sudo] |
+ | [https://www.sudo.ws/sudo/ sudo] を使うことでシステム管理者は権限を委託できるようになり、root や他のユーザーとして複数の(もしくは全ての)コマンドを実行する能力を特定のユーザー(もしくはユーザーのグループ)に与えることができます。 |
Sudo は root でコマンドを実行するためのものとして [[su]] に代わるものです。[[su]] が root シェルを起動してそれから全てのコマンドを root として実行できるようにするのに対し、sudo は一つのコマンドだけに特権を与えます。必要な時だけに root 特権を有効にするので、sudo を使うことにより打ち間違いや呼び出されたコマンドのバグによってシステムを破壊してしまう可能性を減らすことができます。 |
Sudo は root でコマンドを実行するためのものとして [[su]] に代わるものです。[[su]] が root シェルを起動してそれから全てのコマンドを root として実行できるようにするのに対し、sudo は一つのコマンドだけに特権を与えます。必要な時だけに root 特権を有効にするので、sudo を使うことにより打ち間違いや呼び出されたコマンドのバグによってシステムを破壊してしまう可能性を減らすことができます。 |
||
| + | |||
Sudo は他のユーザーとしてコマンドを実行するために使うこともできます; さらに、sudo は全てのコマンドとセキュリティ検査のアクセス失敗を記録します。 |
Sudo は他のユーザーとしてコマンドを実行するために使うこともできます; さらに、sudo は全てのコマンドとセキュリティ検査のアクセス失敗を記録します。 |
||
== インストール == |
== インストール == |
||
| − | + | {{Pkg|sudo}} パッケージをインストールしてください。あるいは、{{Pkg|sudo-rs}}にsudo-rsというメモリ安全なsudoの実装があります。 |
|
| − | |||
| − | # pacman -S sudo |
||
| − | |||
| − | {{ic|sudo}} を特権がないユーザーで使い始めるには、正しく設定をする必要があります。設定セクションを読んで設定を行なって下さい。 |
||
== 使用方法 == |
== 使用方法 == |
||
| − | ユーザーはコマンドの前に {{ic|sudo}} を付けることで、スーパーユーザー |
+ | ユーザーはコマンドの前に {{ic|sudo}} を付けることで、スーパーユーザー(もしくはその他の)特権がある状態でコマンドを実行できます。 |
''sudo'' を使うときはコマンドの前に {{ic|sudo}} と空白を付けてください: |
''sudo'' を使うときはコマンドの前に {{ic|sudo}} と空白を付けてください: |
||
| 41行目: | 38行目: | ||
詳しくは {{man|8|sudo}} を見てください。 |
詳しくは {{man|8|sudo}} を見てください。 |
||
| + | |||
| + | === ログインシェル === |
||
| + | |||
| + | すべてのコマンドを他のユーザーとして実行するために単に ''sudo'' を前置するだけでは不十分です。特に、[[Wikipedia:Redirection_(computing)|リダイレクション]]や[[Wikipedia:Command substitution|コマンド置換]]を使用する場合、ログインシェルを使用する必要があります。これは {{ic|sudo -iu ''user''}} で簡単にアクセスできます(目的のユーザーが root である場合は {{ic|-u ''user''}} を省略できます)。 |
||
| + | |||
| + | 次の例では、コマンド置換はフルシェルで動作しますが、''sudo'' を前置すると失敗します: |
||
| + | |||
| + | {{hc|$ sudo wpa_supplicant -B -i ''interface'' -c '''<('''wpa_passphrase ''MYSSID passphrase''''')'''| |
||
| + | Successfully initialized wpa_supplicant |
||
| + | Failed to open config file '/dev/fd/63', error: No such file or directory |
||
| + | Failed to read or parse configuration '/dev/fd/63' |
||
| + | }} |
||
== 設定 == |
== 設定 == |
||
| + | === デフォルトのスケルトンファイル === |
||
| − | === Defaults skeleton === |
||
| − | {{man|5|sudoers|SUDOERS OPTIONS}} |
+ | {{man|5|sudoers|SUDOERS OPTIONS}} は {{ic|/etc/sudoers}} ファイル内の {{ic|Defaults}} コマンドで使用できる全てのオプションをリストアップします。 |
| + | オプションのリスト (バージョン 1.8.7 のソースコードから解析されたもの) を {{ic|sudoers}} 用に最適化した形式で表示するには [https://gist.github.com/AladW/7eca9799b9ea624eca31] を参照してください。 |
||
| − | See [https://gist.github.com/AladW/7eca9799b9ea624eca31] for a list of options (parsed from the version 1.8.7 source code) in a format optimized for {{ic|sudoers}}. |
||
| + | パスワードのタイムアウトの設定など、より詳しい情報は {{man|5|sudoers}} を見て下さい。 |
||
| − | See {{man|5|sudoers}} for more information, such as configuring the password timeout. |
||
=== 現在の設定を表示 === |
=== 現在の設定を表示 === |
||
| 61行目: | 70行目: | ||
{{Warning| |
{{Warning| |
||
| − | * {{ic|sudoers}} に構文エラーの危険性があるということは絶対避けなくてはいけません |
+ | * {{ic|sudoers}} に構文エラーの危険性があるということは絶対避けなくてはいけません!どんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも {{ic|visudo}} を使って編集するようにしてください。 |
| − | * {{man|8|visudo}} よ |
+ | * {{man|8|visudo}} は、ユーザーが選択したエディターのユーザー環境変数を尊重するように visudo を設定すると、その変数を別の値に設定するだけで、visudo 権限を持つユーザーがログを記録せずに root として任意のコマンドを実行できるようになるため、セキュリティ ホールになる可能性があると警告しています。}} |
| − | }} |
||
visudo のデフォルトエディタは {{ic|vi}} です。core リポジトリの sudo はデフォルトで {{Ic|--with-env-editor}} を有効にしてコンパイルされており、{{Ic|VISUAL}} や {{Ic|EDITOR}} 変数を使用することができます。{{ic|VISUAL}} が設定されている場合 {{ic|EDITOR}} は使われません。 |
visudo のデフォルトエディタは {{ic|vi}} です。core リポジトリの sudo はデフォルトで {{Ic|--with-env-editor}} を有効にしてコンパイルされており、{{Ic|VISUAL}} や {{Ic|EDITOR}} 変数を使用することができます。{{ic|VISUAL}} が設定されている場合 {{ic|EDITOR}} は使われません。 |
||
| 73行目: | 81行目: | ||
もしくは {{ic|/etc/sudoers}} ファイルのコピーを編集して {{ic|visudo -c -f ''/copy/of/sudoers''}} でチェックすることもできます。visudo でファイルをロックしたくない場合に有用です。 |
もしくは {{ic|/etc/sudoers}} ファイルのコピーを編集して {{ic|visudo -c -f ''/copy/of/sudoers''}} でチェックすることもできます。visudo でファイルをロックしたくない場合に有用です。 |
||
| − | + | エディタを永久に変更するには、[[環境変数#ユーザーごと]]を参照してください。システム全体で ''visudo'' のみのエディタを永久に変更するには、以下を {{ic|/etc/sudoers}} に追加します([[nano]] が好みのエディタであると仮定します): |
|
| + | # デフォルトのエディタを nano の制限付きバージョンに設定し、visudo が EDITOR/VISUAL を使用しないようにする。 |
||
| − | # Reset environment by default |
||
| − | Defaults |
+ | Defaults editor=/usr/bin/rnano, !env_editor |
| − | # Set default EDITOR to nano, and do not allow visudo to use EDITOR/VISUAL. |
||
| − | Defaults editor=/usr/bin/nano, !env_editor |
||
=== エントリの例 === |
=== エントリの例 === |
||
| 94行目: | 100行目: | ||
%wheel ALL=(ALL) ALL |
%wheel ALL=(ALL) ALL |
||
| + | {{Tip|新しい管理者を作成する際、{{ic|wheel}} グループに sudo アクセスを有効にし、[[ユーザーとグループ#グループ管理|ユーザーを追加する]]ことが望ましいです。デフォルトでは、[[Polkit#Administrator identities|Polkit]] は {{ic|wheel}} グループのメンバーを管理者として扱うためです。ユーザーが {{ic|wheel}} のメンバーでない場合、Polkit を使用するソフトウェアはユーザーのパスワードではなく root のパスワードを使用して認証を求めることがあります。}} |
||
| − | ユーザー USER_NAME にパスワードを尋ねるのを無効化するには: |
||
| + | |||
| + | ユーザー {{ic|USER_NAME}} にパスワードを尋ねるのを無効化するには: |
||
| + | |||
| + | {{Warning|これにより、ユーザー名で実行されている任意のプロセスが、許可を求めずに sudo を使用できるようになります。}} |
||
Defaults:USER_NAME !authenticate |
Defaults:USER_NAME !authenticate |
||
| − | ユーザー USER_NAME |
+ | ホスト {{ic|HOST_NAME}} 上のユーザー {{ic|USER_NAME}} のみに対して明示的に定義されたコマンドを有効にするには: |
USER_NAME HOST_NAME=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu |
USER_NAME HOST_NAME=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu |
||
| + | |||
{{note|後ろの行の設定が前の設定よりも優先されるので、細かくカスタマイズしたオプションはファイルの最後に置くべきです。特にユーザーがグループに含まれているときは上のような行は {{ic|%wheel}} 行の後にすべきです。}} |
{{note|後ろの行の設定が前の設定よりも優先されるので、細かくカスタマイズしたオプションはファイルの最後に置くべきです。特にユーザーがグループに含まれているときは上のような行は {{ic|%wheel}} 行の後にすべきです。}} |
||
ユーザー USER_NAME が ホスト HOST_NAME を使っているときだけ特定のコマンドに sudo をパスワードなしで使えるようにするには: |
ユーザー USER_NAME が ホスト HOST_NAME を使っているときだけ特定のコマンドに sudo をパスワードなしで使えるようにするには: |
||
| + | |||
USER_NAME HOST_NAME= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu |
USER_NAME HOST_NAME= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu |
||
| 121行目: | 133行目: | ||
Defaults passwd_timeout=0 |
Defaults passwd_timeout=0 |
||
| + | |||
| + | === Bash 補完 === |
||
| + | |||
| + | sudo コマンドで完全な Bash 補完機能を利用できるようにするには、{{Pkg|bash-completion}} パッケージをインストールしてください。 |
||
| + | 何らかの理由でこのパッケージをインストールできない場合、sudo コマンドの補完機能は限定的になりますが、代替手段として以下の内容を [[.bashrc]] に追加することで利用可能です: |
||
| + | |||
| + | complete -cf sudo |
||
| + | |||
| + | === エイリアスを渡す === |
||
| + | |||
| + | [[Zsh]] と [[Bash]] では、エイリアスは通常、コマンドの最初の単語に対してのみ展開されます。これは、{{ic|sudo}} コマンドを実行するときにエイリアスが通常展開されないことを意味します。次の単語を展開する方法の一つは、スペースで終わる sudo のエイリアスを作成することです。以下を[[コマンドラインシェル#設定ファイル|シェルの設定ファイル]]に追加します: |
||
| + | |||
| + | alias sudo='sudo ' |
||
| + | |||
| + | {{man|1|zshmisc|ALIASING}} はこれがどのように機能するかを説明しています: |
||
| + | : 置換テキストがスペースで終わる場合、シェル入力の次の単語は常にエイリアス展開の対象になります。 |
||
| + | |||
| + | {{man|1|bash|ALIASES}} も同様に説明しています: |
||
| + | : エイリアス値の最後の文字が空白の場合、エイリアスの次のコマンド単語もエイリアス展開の対象としてチェックされます。 |
||
=== パスワードプロンプトに端末ベルを鳴らす === |
=== パスワードプロンプトに端末ベルを鳴らす === |
||
| 128行目: | 159行目: | ||
Defaults passprompt="^G[sudo] password for %p: " |
Defaults passprompt="^G[sudo] password for %p: " |
||
| − | {{ic|^G}} は文字通りベル文字です。 例えば。 [[vim]] で、シーケンスを使用して挿入 {{ic|Ctrl+v}} {{ic|Ctrl+g}} または [[Nano]] {{ic|alt+v}} {{ic|Ctrl+g}} |
+ | {{ic|^G}} は文字通りベル文字です。 例えば。 [[vim]] で、シーケンスを使用して挿入 {{ic|Ctrl+v}} {{ic|Ctrl+g}} または [[Nano]] {{ic|alt+v}} {{ic|Ctrl+g}} |
| + | もう一つのオプションとして、{{ic|SUDO_PROMPT}} [[環境変数]] を設定する方法があります。例えば、シェルの設定ファイルに以下を追加します: |
||
| − | === エイリアスを渡す === |
||
| + | export SUDO_PROMPT=$'\a[sudo] please enter a password: ' |
||
| − | 使っているエイリアスが多すぎて、sudo を使っている時にそれらを root アカウントに持ち越せないことに気づいたかもしれませんね。しかしながら、エイリアスを全て動作させる簡単な方法があります。以下を {{ic|~/.bashrc}} か {{ic|/etc/bash.bashrc}} に追加するだけです: |
||
| − | |||
| − | alias sudo='sudo ' |
||
=== ターミナルごとの sudo を無効化 === |
=== ターミナルごとの sudo を無効化 === |
||
| 140行目: | 169行目: | ||
{{Warning|以下を行うとすべてのプロセスがあなたの sudo セッションを使うようになります。}} |
{{Warning|以下を行うとすべてのプロセスがあなたの sudo セッションを使うようになります。}} |
||
| − | + | 新しいターミナルを開くたびにパスワードを入力するよう求められる sudo のデフォルト設定が煩わしい場合は、{{ic|timestamp_type}} を {{ic|global}} に設定します: |
|
| − | Defaults |
+ | Defaults timestamp_type=global |
| + | === パスワードの入力回数を減らす === |
||
| − | === Reduce the number of times you have to type a password === |
||
| + | 5分ごとにパスワードを再入力するのが面倒な場合 (デフォルト)、 {{ic|timestamp_timeout}} に長い値を設定することで変更することができます。(単位:分)。 |
||
| − | If you are annoyed that you have to re-enter your password every 5 minutes (default), you can change this by setting a longer value for {{ic|timestamp_timeout}} (in minutes): |
||
Defaults timestamp_timeout=10 |
Defaults timestamp_timeout=10 |
||
| + | 多くの sudo コマンドを連続して使用する場合、{{ic|timestamp_timeout}} を増やすよりも、sudo を使用するたびにタイムアウトを更新する方が論理的です。タイムアウトを更新するには、{{ic|sudo -v}} を使用します({{ic|sudo -K}} は即座に取り消します)。 |
||
| − | If you are using a lot of sudo commands on a row, it is more logical to refresh the timeout every time you use sudo than |
||
| − | to increase {{ic|timestamp_timeout}}. Refreshing the timeout can be done with {{ic|sudo -v}} (whereas {{ic|sudo -K}} revokes immediately). |
||
| + | 次の内容を[[環境変数#シェルの初期化ファイルを使う|シェル初期化ファイル]]に追加することで、自動化することができます: |
||
| − | You might want to automate this by adding the following to your {{ic|.bashrc}}: |
||
alias sudo='sudo -v; sudo ' |
alias sudo='sudo -v; sudo ' |
||
| − | + | また、bash 関数を使用することも可能です。詳細は [https://unix.stackexchange.com/questions/584725/expand-certain-aliases-from-within-sudo-bash-function stackexchange] を参照してください。 |
|
=== 環境変数 === |
=== 環境変数 === |
||
| 170行目: | 198行目: | ||
</nowiki>}} |
</nowiki>}} |
||
| − | === |
+ | === Root パスワード === |
| + | ユーザーは、{{ic|/etc/sudoers}} の Defaults 行に {{ic|targetpw}}(ターゲットユーザー、デフォルトは root)または {{ic|rootpw}} を追加することで、ユーザーパスワードの代わりに root パスワードを尋ねるように sudo を設定できます: |
||
| − | 管理コマンド ({{ic|/sbin}} や {{ic|/usr/sbin}} 内のコマンド) をフルパスを使わずに sudo で実行したいなら、以下を {{ic|/etc/sudoers}} に追加して下さい: |
||
| + | Defaults targetpw |
||
| − | Defaults secure_path="/bin:/sbin:/usr/bin:/usr/sbin" |
||
| + | root パスワードをユーザーに公開しないようにするためには、これを特定のグループに制限できます: |
||
| − | これで、 |
||
| + | Defaults:%wheel targetpw |
||
| − | $ sudo /usr/sbin/command |
||
| + | %wheel ALL=(ALL) ALL |
||
| − | |||
| − | や |
||
| − | |||
| − | $ sudo /sbin/command |
||
| − | |||
| − | などのコマンドを次で実行できるようになります: |
||
| − | |||
| − | $ sudo command |
||
| − | |||
| − | === root パスワード === |
||
| − | |||
| − | {{ic|/etc/sudoers}} の Defaults 行に "rootpw" を加えると sudo はユーザーのパスワードではなく root パスワードを尋ねるようになります: |
||
| − | |||
| − | Defaults timestamp_timeout=0,rootpw |
||
=== root ログインを無効化 === |
=== root ログインを無効化 === |
||
| 198行目: | 213行目: | ||
sudo をインストール・設定したら、root ログインを無効化できます。root を無効化すれば、攻撃者はユーザーのパスワードだけでなく sudoer として設定されたユーザー名もまず考えなくてはならなくなります。[[Secure Shell#root ログインを制限する]]も参照。 |
sudo をインストール・設定したら、root ログインを無効化できます。root を無効化すれば、攻撃者はユーザーのパスワードだけでなく sudoer として設定されたユーザー名もまず考えなくてはならなくなります。[[Secure Shell#root ログインを制限する]]も参照。 |
||
| + | {{Warning| |
||
| − | {{Warning|root アカウントを''無効にする前に''ユーザーが sudoer として正しく設定されているか確認して下さい!}} |
||
| + | * ルートログインを無効にすることで、自分自身をロックアウトしてしまう可能性がありますのでご注意ください。Sudo は自動的にインストールされませんし、そのデフォルトの設定では、パスワードなしの root アクセスも、自分のパスワードによる root アクセスもできません。root アカウントを無効にする前に、ユーザが sudoer として適切に設定されている ことを確認してください! |
||
| + | * sudoers ファイルをデフォルトで rootpw を使用するように変更した場合、以下のコマンドで root ログインを無効化しないでください! |
||
| + | * すでにロックアウトされている場合は、[[パスワードリカバリ]] を参照してください。 |
||
| + | }} |
||
アカウントをロックするには {{ic|passwd}} を使います: |
アカウントをロックするには {{ic|passwd}} を使います: |
||
| 215行目: | 234行目: | ||
$ sudo passwd root |
$ sudo passwd root |
||
| + | |||
| + | システム緊急時には、リカバリプロンプトが root パスワードを要求するため、リカバリシェルにログインすることができません。緊急時に自動的に root アカウントをアンロックするには、{{ic|rescue.service}} に [[ドロップインファイル]] を使用して {{ic|1=SYSTEMD_SULOGIN_FORCE=1}} 環境変数を追加します: |
||
| + | |||
| + | {{hc|/etc/systemd/system/rescue.service.d/SYSTEMD_SULOGIN_FORCE.conf|2= |
||
| + | [Service] |
||
| + | Environment=SYSTEMD_SULOGIN_FORCE=1 |
||
| + | }} |
||
{{Tip|''root'' アカウントを無効化した後もインタラクティブな root プロンプトを表示するには、{{ic|sudo -i}} を使ってください。}} |
{{Tip|''root'' アカウントを無効化した後もインタラクティブな root プロンプトを表示するには、{{ic|sudo -i}} を使ってください。}} |
||
| 229行目: | 255行目: | ||
$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo |
$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo |
||
| + | === sudoでハード化する例 === |
||
| − | あるいは {{AUR|kdesudo}} をインストールしてください。コマンドのタブ補完もあります。 |
||
| + | |||
| + | 例えば、admin, devel, joe の3人のユーザーを作ったとします。''admin'' は journalctl, systemctl, mount, kill, iptables に、''devel'' はパッケージのインストールや設定ファイルの編集に、そして ''joe'' はログインするユーザにそれぞれ使用します。''joe" にリブート、シャットダウン、netctl を使わせるためには、以下のようにします。 |
||
| + | |||
| + | {{ic|/etc/pam.d/su}} と {{ic|/etc/pam.d/su-l}} を編集してください。 |
||
| + | ユーザが wheel グループに属していることを要求するが、誰もその中に入れないようにする。 |
||
| + | #%PAM-1.0 |
||
| + | auth sufficient pam_rootok.so |
||
| + | # Uncomment the following line to implicitly trust users in the "wheel" group. |
||
| + | #auth sufficient pam_wheel.so trust use_uid |
||
| + | # Uncomment the following line to require a user to be in the "wheel" group. |
||
| + | auth required pam_wheel.so use_uid |
||
| + | auth required pam_unix.so |
||
| + | account required pam_unix.so |
||
| + | session required pam_unix.so |
||
| + | |||
| + | SSH ログインを 'ssh' グループに制限します。''joe'' だけがこのグループの一員になります。 |
||
| + | groupadd -r ssh |
||
| + | gpasswd -a joe ssh |
||
| + | echo 'AllowGroups ssh' >> /etc/ssh/sshd_config |
||
| + | |||
| + | [[リスタート]] {{ic|sshd.service}}. |
||
| + | |||
| + | ユーザーを他のグループに追加する。 |
||
| + | for g in power network ;do ;gpasswd -a joe $g ;done |
||
| + | for g in network power storage ;do ;gpasswd -a admin $g ;done |
||
| + | |||
| + | デベロッパーが編集できるように、コンフィグにパーミッションを設定します。 |
||
| + | chown -R devel:root /etc/{http,openvpn,cups,zsh,vim,screenrc} |
||
| + | |||
| + | Cmnd_Alias POWER = /usr/bin/shutdown -h now, /usr/bin/halt, /usr/bin/poweroff, /usr/bin/reboot |
||
| + | Cmnd_Alias STORAGE = /usr/bin/mount -o nosuid\,nodev\,noexec, /usr/bin/umount |
||
| + | Cmnd_Alias SYSTEMD = /usr/bin/journalctl, /usr/bin/systemctl |
||
| + | Cmnd_Alias KILL = /usr/bin/kill, /usr/bin/killall |
||
| + | Cmnd_Alias PKGMAN = /usr/bin/pacman |
||
| + | Cmnd_Alias NETWORK = /usr/bin/netctl |
||
| + | Cmnd_Alias FIREWALL = /usr/bin/iptables, /usr/bin/ip6tables |
||
| + | Cmnd_Alias SHELL = /usr/bin/zsh, /usr/bin/bash |
||
| + | %power ALL = (root) NOPASSWD: POWER |
||
| + | %network ALL = (root) NETWORK |
||
| + | %storage ALL = (root) STORAGE |
||
| + | root ALL = (ALL) ALL |
||
| + | admin ALL = (root) SYSTEMD, KILL, FIREWALL |
||
| + | devel ALL = (root) PKGMAN |
||
| + | joe ALL = (devel) SHELL, (admin) SHELL |
||
| + | |||
| + | この設定により、root ユーザーでのログインはほとんど必要なくなります。 |
||
| + | |||
| + | ''joe'' は自宅の WiFi に接続できます。 |
||
| + | sudo netctl start home |
||
| + | sudo poweroff |
||
| + | |||
| + | ''joe'' は、他のユーザーとして netctl を使用できません。 |
||
| + | sudo -u admin -- netctl start home |
||
| + | |||
| + | ''joe'' が journalctl を使ったり、逃亡したプロセスを kill したりする必要があるとき、そのユーザーに切り替えることができます。 |
||
| + | sudo -i -u devel |
||
| + | sudo -i -u admin |
||
| + | |||
| + | しかし、''joe'' は root ユーザーに切り替えることはできません。 |
||
| + | sudo -i -u root |
||
| + | |||
| + | ''joe'' が管理者として gnu-screen のセッションを開始したい場合は、次のようにします。 |
||
| + | sudo -i -u admin |
||
| + | admin% chown admin:tty `echo $TTY` |
||
| + | admin% screen |
||
=== /etc/sudoers.d のドロップインファイルを使って sudo を設定 === |
=== /etc/sudoers.d のドロップインファイルを使って sudo を設定 === |
||
| 255行目: | 346行目: | ||
$ SUDO_EDITOR=meld sudo -e /etc/''file''{,.pacnew''} |
$ SUDO_EDITOR=meld sudo -e /etc/''file''{,.pacnew''} |
||
| − | === |
+ | === 侮辱を有効にする === |
| + | visudo を使用して sudoers ファイルに次の行を追加することにより、sudo でイースターエッグ (侮辱) することができます。 |
||
| − | Users can enable insults easter egg in sudo by adding the following line in sudoers file with {{ic|visudo}}. |
||
| + | 不正なパスワードを入力すると、{{ic|Sorry, try again.}} のメッセージがユーモラスな侮辱に置き換えられます。 |
||
| − | Upon entering an incorrect password this will replace {{ic|Sorry, try again.}} message with humorous insults. |
||
{{hc|1=/etc/sudoers|2= |
{{hc|1=/etc/sudoers|2= |
||
Defaults insults |
Defaults insults |
||
}} |
}} |
||
| + | |||
| + | === パスワード入力のフィードバックを有効にする === |
||
| + | |||
| + | デフォルトでは、パスワードを入力する際に視覚的なフィードバックはありません。これは、セキュリティを高めるために意図的に行われています。しかし、視覚的な入力が必要な場合は、この行を追加することで有効にすることができます: |
||
| + | |||
| + | {{hc|/etc/sudoers|2= |
||
| + | Defaults pwfeedback |
||
| + | }} |
||
| + | |||
| + | === カラーパスワードプロンプト === |
||
| + | |||
| + | パスワードプロンプトをカラーや太字フォントでカスタマイズするには、シェル初期化ファイルに {{ic|SUDO_PROMPT}} [[環境変数]] を設定し、{{man|1|tput}} を使用します。 |
||
| + | |||
| + | 例えば、パスワードプロンプトを太字の赤で表示するには、以下のように設定します: |
||
| + | |||
| + | export SUDO_PROMPT="$(tput setaf 1 bold)Password:$(tput sgr0) " |
||
| + | |||
| + | また、デフォルトメッセージに異なる色を使用するには、以下のようにします: |
||
| + | |||
| + | export SUDO_PROMPT="$(tput setab 1 setaf 7 bold)[sudo]$(tput sgr0) $(tput setaf 6)password for$(tput sgr0) $(tput setaf 5)%p$(tput sgr0): " |
||
| + | |||
| + | {| |
||
| + | |- |
||
| + | | |
||
| + | |||
| + | {| class="wikitable" |
||
| + | |+ tput コマンドラインオプション チートシート |
||
| + | |- |
||
| + | ! tput コマンド !! 説明 |
||
| + | |- |
||
| + | | {{ic|tput bold}} || 太字テキスト |
||
| + | |- |
||
| + | | {{ic|tput setaf [CODE]}} || 前景色を設定 |
||
| + | |- |
||
| + | | {{ic|tput setab [CODE]}} || 背景色を設定 |
||
| + | |- |
||
| + | | {{ic|tput rev}} || 色を反転 |
||
| + | |- |
||
| + | | {{ic|tput sgr0}} || すべてをリセット |
||
| + | |} |
||
| + | <br> |
||
| + | <br> |
||
| + | <br> |
||
| + | |||
| + | || || |
||
| + | |||
| + | {| class="wikitable sortable" |
||
| + | |+ tput カラーコード |
||
| + | |- |
||
| + | ! tput カラー [CODE] !! 色 |
||
| + | |- |
||
| + | | 0 || 黒 |
||
| + | |- |
||
| + | | 1 || 赤 |
||
| + | |- |
||
| + | | 2 || 緑 |
||
| + | |- |
||
| + | | 3 || 黄 |
||
| + | |- |
||
| + | | 4 || 青 |
||
| + | |- |
||
| + | | 5 || マゼンタ |
||
| + | |- |
||
| + | | 6 || シアン |
||
| + | |- |
||
| + | | 7 || 白 |
||
| + | |} |
||
| + | |||
| + | |} |
||
| + | |||
| + | === U2F の使用 === |
||
| + | |||
| + | U2F は sudo と一緒に使用するのに最適です。これは、公共の場所での[[Wikipedia:Shoulder surfing (computer security)|ショルダーハック]]のリスクを効果的に排除しながら、シンプルな物理的なタッチでプロンプトを承認する意識的なコントロールを与えてくれます。 |
||
| + | |||
| + | [[Universal 2nd Factor#パスワードなしの sudo]] を参照してください。 |
||
| + | |||
| + | === 保護されたファイルへの書き込み === |
||
| + | |||
| + | sudo を使用する際、保護されたファイルに書き込みたい場合、[[tee]] を使うことで、このような分離が可能になります: |
||
| + | |||
| + | $ ''input stream'' | sudo tee ''--option'' ''protected_file_1 protected_file_2...'' |
||
| + | |||
| + | これは、単純な {{ic|>}}/{{ic|>>}} が機能しない場合に有効です。 |
||
| + | |||
| + | ==== Vim の場合 ==== |
||
| + | |||
| + | 他のユーザーが所有するファイルを編集している際、sudo 付きで [[Vim]] を起動するのを忘れた場合にも、同様の方法が役立ちます。 |
||
| + | そのようなときには、[[Vim]] 内部で以下を実行することでファイルを保存できます: |
||
| + | |||
| + | :w !sudo tee % |
||
| + | |||
| + | この操作を簡単に使えるように、以下を {{ic|~/.vimrc}} に追加すると、コマンドモードで {{ic|:w!!}} によるマッピングが使えるようになります: |
||
| + | |||
| + | {{hc|~/.vimrc|2= |
||
| + | " Allow saving of files as sudo when I forgot to start vim using sudo |
||
| + | cmap w!! w !sudo tee > /dev/null % |
||
| + | }} |
||
| + | |||
| + | {{ic|> /dev/null}} の部分は、標準出力を明示的に破棄するためのもので、他のパイプコマンドに何も渡す必要がないためです。 |
||
| + | |||
| + | この仕組みがどのように動作し、なぜ機能するのかについての詳細な説明は、StackOverflow の記事 |
||
| + | [https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work How does the vim “write with sudo” trick work?] を参照してください。 |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
| 286行目: | 479行目: | ||
sudo の umask が root のデフォルト umask (0022) に設定されデフォルトの挙動が上書きされます。ユーザーによって設定された umask を無視して指定された umask を常時使うようになります。 |
sudo の umask が root のデフォルト umask (0022) に設定されデフォルトの挙動が上書きされます。ユーザーによって設定された umask を無視して指定された umask を常時使うようになります。 |
||
| + | {{TranslationStatus|Sudo|2024-07-31|811791}} |
||
| − | === デフォルトスケルトン === |
||
| − | |||
| − | sudo の開発者のサイトには {{ic|/etc/sudoers}} ファイルの {{ic|Defaults}} コマンドで使うことができる [http://www.sudo.ws/sudo/sudoers.man.html#x5355444f455253204f5054494f4e53 オプションのリスト] が存在します。 |
||
| − | |||
| − | {{ic|sudoers}} に最適化されたフォーマットのオプションリストは [https://gist.github.com/AladW/7eca9799b9ea624eca31] を見てください (バージョン 1.8.7 のソースコードから解析)。 |
||
2025年5月7日 (水) 17:53時点における最新版
sudo を使うことでシステム管理者は権限を委託できるようになり、root や他のユーザーとして複数の(もしくは全ての)コマンドを実行する能力を特定のユーザー(もしくはユーザーのグループ)に与えることができます。
Sudo は root でコマンドを実行するためのものとして su に代わるものです。su が root シェルを起動してそれから全てのコマンドを root として実行できるようにするのに対し、sudo は一つのコマンドだけに特権を与えます。必要な時だけに root 特権を有効にするので、sudo を使うことにより打ち間違いや呼び出されたコマンドのバグによってシステムを破壊してしまう可能性を減らすことができます。
Sudo は他のユーザーとしてコマンドを実行するために使うこともできます; さらに、sudo は全てのコマンドとセキュリティ検査のアクセス失敗を記録します。
目次
- 1 インストール
- 2 使用方法
- 3 設定
- 4 ヒントとテクニック
- 4.1 パスワードプロンプトのタイムアウトを無効にする
- 4.2 Bash 補完
- 4.3 エイリアスを渡す
- 4.4 パスワードプロンプトに端末ベルを鳴らす
- 4.5 ターミナルごとの sudo を無効化
- 4.6 パスワードの入力回数を減らす
- 4.7 環境変数
- 4.8 Root パスワード
- 4.9 root ログインを無効化
- 4.10 sudoでハード化する例
- 4.11 /etc/sudoers.d のドロップインファイルを使って sudo を設定
- 4.12 ファイルの編集
- 4.13 侮辱を有効にする
- 4.14 パスワード入力のフィードバックを有効にする
- 4.15 カラーパスワードプロンプト
- 4.16 U2F の使用
- 4.17 保護されたファイルへの書き込み
- 5 トラブルシューティング
インストール
sudo パッケージをインストールしてください。あるいは、sudo-rsにsudo-rsというメモリ安全なsudoの実装があります。
使用方法
ユーザーはコマンドの前に sudo を付けることで、スーパーユーザー(もしくはその他の)特権がある状態でコマンドを実行できます。
sudo を使うときはコマンドの前に sudo と空白を付けてください:
$ sudo cmd
例えば、pacman を root で使いたいなら:
$ sudo pacman -Syu
詳しくは sudo(8) を見てください。
ログインシェル
すべてのコマンドを他のユーザーとして実行するために単に sudo を前置するだけでは不十分です。特に、リダイレクションやコマンド置換を使用する場合、ログインシェルを使用する必要があります。これは sudo -iu user で簡単にアクセスできます(目的のユーザーが root である場合は -u user を省略できます)。
次の例では、コマンド置換はフルシェルで動作しますが、sudo を前置すると失敗します:
$ sudo wpa_supplicant -B -i interface -c <(wpa_passphrase MYSSID passphrase)
Successfully initialized wpa_supplicant Failed to open config file '/dev/fd/63', error: No such file or directory Failed to read or parse configuration '/dev/fd/63'
設定
デフォルトのスケルトンファイル
sudoers(5) § SUDOERS OPTIONS は /etc/sudoers ファイル内の Defaults コマンドで使用できる全てのオプションをリストアップします。
オプションのリスト (バージョン 1.8.7 のソースコードから解析されたもの) を sudoers 用に最適化した形式で表示するには [1] を参照してください。
パスワードのタイムアウトの設定など、より詳しい情報は sudoers(5) を見て下さい。
現在の設定を表示
sudo -ll を実行して現在の sudo 設定を表示してください。sudo -lU user で指定したユーザーの sudo 設定も確認できます。
visudo を使う
sudo の設定ファイルは /etc/sudoers です。このファイルはどんなときでも visudo コマンドを使って編集するべきです。visudo は sudoers ファイルをロックし、一時ファイルに編集内容を保存して、それを /etc/sudoers にコピーする前にファイルの構文をチェックします。
visudo のデフォルトエディタは vi です。core リポジトリの sudo はデフォルトで --with-env-editor を有効にしてコンパイルされており、VISUAL や EDITOR 変数を使用することができます。VISUAL が設定されている場合 EDITOR は使われません。
現在のシェルセッションの間だけ visudo のエディタとして nano を使いたい場合、visudo を実行する前に EDITOR 変数を設定してください:
# EDITOR=nano visudo
もしくは /etc/sudoers ファイルのコピーを編集して visudo -c -f /copy/of/sudoers でチェックすることもできます。visudo でファイルをロックしたくない場合に有用です。
エディタを永久に変更するには、環境変数#ユーザーごとを参照してください。システム全体で visudo のみのエディタを永久に変更するには、以下を /etc/sudoers に追加します(nano が好みのエディタであると仮定します):
# デフォルトのエディタを nano の制限付きバージョンに設定し、visudo が EDITOR/VISUAL を使用しないようにする。 Defaults editor=/usr/bin/rnano, !env_editor
エントリの例
ユーザー USER_NAME が sudo を使った時に、完全な root 権限を与えたい場合は、次の行を加えて下さい:
USER_NAME ALL=(ALL) ALL
マシンのホストネームが HOST_NAME のときだけ、ユーザー USER_NAME に他のユーザーとしてコマンドを実行する権限を与えるには:
USER_NAME HOST_NAME=(ALL) ALL
wheel グループに追加されている全てのユーザーが sudo を使えるようにするには:
%wheel ALL=(ALL) ALL
ユーザー USER_NAME にパスワードを尋ねるのを無効化するには:
Defaults:USER_NAME !authenticate
ホスト HOST_NAME 上のユーザー USER_NAME のみに対して明示的に定義されたコマンドを有効にするには:
USER_NAME HOST_NAME=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
ユーザー USER_NAME が ホスト HOST_NAME を使っているときだけ特定のコマンドに sudo をパスワードなしで使えるようにするには:
USER_NAME HOST_NAME= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
説明のついた sudoers のサンプルは /usr/share/doc/sudo/examples/sudoers にあります。詳しくは sudoers(5) を見て下さい。
Sudoers デフォルトファイルパーミッション
sudoers ファイルの所有者とグループはゼロにしてください、つまり所有者が居てはいけません。ファイルパーミッションは 0440 に設定する必要があります。このパーミッションはデフォルトでセットされますが、パーミッションを変える事故を起こしてしまった場合、すぐにパーミッションを元に戻すか sudo を消して下さい。
# chown -c root:root /etc/sudoers # chmod -c 0440 /etc/sudoers
ヒントとテクニック
パスワードプロンプトのタイムアウトを無効にする
よくある悩みは、通常のパーミッションで実行され、必要な時にのみ上昇するバックグラウンドターミナルで実行される長時間実行プロセスです。これにより sudo のパスワード入力が促され、気づかれずにタイムアウトし、その時点でプロセスが終了し、完了した作業は失われるか、せいぜいキャッシュされます。一般的なアドバイスは、パスワードなしの sudo を有効にするか、パスワードを記憶する sudo のタイムアウトを延長することです。これらはいずれもセキュリティに悪影響を及ぼします。 プロンプト タイムアウトを無効にすることもできますが、これは適切なセキュリティ上の目的を果たすものではありません、そこを理解して設定する必要があります。
Defaults passwd_timeout=0
Bash 補完
sudo コマンドで完全な Bash 補完機能を利用できるようにするには、bash-completion パッケージをインストールしてください。 何らかの理由でこのパッケージをインストールできない場合、sudo コマンドの補完機能は限定的になりますが、代替手段として以下の内容を .bashrc に追加することで利用可能です:
complete -cf sudo
エイリアスを渡す
Zsh と Bash では、エイリアスは通常、コマンドの最初の単語に対してのみ展開されます。これは、sudo コマンドを実行するときにエイリアスが通常展開されないことを意味します。次の単語を展開する方法の一つは、スペースで終わる sudo のエイリアスを作成することです。以下をシェルの設定ファイルに追加します:
alias sudo='sudo '
zshmisc(1) § ALIASING はこれがどのように機能するかを説明しています:
- 置換テキストがスペースで終わる場合、シェル入力の次の単語は常にエイリアス展開の対象になります。
bash(1) § ALIASES も同様に説明しています:
- エイリアス値の最後の文字が空白の場合、エイリアスの次のコマンド単語もエイリアス展開の対象としてチェックされます。
パスワードプロンプトに端末ベルを鳴らす
バックグラウンドの端末で sudo プロンプトに注意を引く為に、bell character を鳴らす方法もあります。
Defaults passprompt="^G[sudo] password for %p: "
^G は文字通りベル文字です。 例えば。 vim で、シーケンスを使用して挿入 Ctrl+v Ctrl+g または Nano alt+v Ctrl+g
もう一つのオプションとして、SUDO_PROMPT 環境変数 を設定する方法があります。例えば、シェルの設定ファイルに以下を追加します:
export SUDO_PROMPT=$'\a[sudo] please enter a password: '
ターミナルごとの sudo を無効化
新しいターミナルを開くたびにパスワードを入力するよう求められる sudo のデフォルト設定が煩わしい場合は、timestamp_type を global に設定します:
Defaults timestamp_type=global
パスワードの入力回数を減らす
5分ごとにパスワードを再入力するのが面倒な場合 (デフォルト)、 timestamp_timeout に長い値を設定することで変更することができます。(単位:分)。
Defaults timestamp_timeout=10
多くの sudo コマンドを連続して使用する場合、timestamp_timeout を増やすよりも、sudo を使用するたびにタイムアウトを更新する方が論理的です。タイムアウトを更新するには、sudo -v を使用します(sudo -K は即座に取り消します)。
次の内容をシェル初期化ファイルに追加することで、自動化することができます:
alias sudo='sudo -v; sudo '
また、bash 関数を使用することも可能です。詳細は stackexchange を参照してください。
環境変数
環境変数をたくさん使っている場合や、export http_proxy="..." でプロクシー設定を export している場合、sudo を使うときに、sudo に -E オプションを付けない限りこれらの環境変数が root アカウントに渡されません。
$ sudo -E pacman -Syu
環境変数を維持するために env_keep にそれら環境変数を追加するのを推奨します:
/etc/sudoers
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
Root パスワード
ユーザーは、/etc/sudoers の Defaults 行に targetpw(ターゲットユーザー、デフォルトは root)または rootpw を追加することで、ユーザーパスワードの代わりに root パスワードを尋ねるように sudo を設定できます:
Defaults targetpw
root パスワードをユーザーに公開しないようにするためには、これを特定のグループに制限できます:
Defaults:%wheel targetpw %wheel ALL=(ALL) ALL
root ログインを無効化
sudo をインストール・設定したら、root ログインを無効化できます。root を無効化すれば、攻撃者はユーザーのパスワードだけでなく sudoer として設定されたユーザー名もまず考えなくてはならなくなります。Secure Shell#root ログインを制限するも参照。
アカウントをロックするには passwd を使います:
# passwd -l root
同じようなコマンドで root をアンロックできます。
$ sudo passwd -u root
もしくは、/etc/shadow を編集して root の暗号化されたパスワードを "!" で置き換えてください:
root:!:12345::::::
もう一度 root ログインを有効にするには:
$ sudo passwd root
システム緊急時には、リカバリプロンプトが root パスワードを要求するため、リカバリシェルにログインすることができません。緊急時に自動的に root アカウントをアンロックするには、rescue.service に ドロップインファイル を使用して SYSTEMD_SULOGIN_FORCE=1 環境変数を追加します:
/etc/systemd/system/rescue.service.d/SYSTEMD_SULOGIN_FORCE.conf
[Service] Environment=SYSTEMD_SULOGIN_FORCE=1
kdesu
KDE では root 権限で GUI アプリケーションを起動するのに kdesu が使われることがあります。root アカウントが無効になっているときでもデフォルトで kdesu は su を使おうとします。幸いに、kdesu では su の代わりに sudo を使うようにすることができます。~/.config/kdesurc (kde4 の場合は ~/.kde4/share/config/kdesurc) ファイルを作成・編集してください:
[super-user-command] super-user-command=sudo
もしくは以下のコマンドを使用 (kde4 の場合は kwriteconfig を使用):
$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo
sudoでハード化する例
例えば、admin, devel, joe の3人のユーザーを作ったとします。admin は journalctl, systemctl, mount, kill, iptables に、devel はパッケージのインストールや設定ファイルの編集に、そして joe はログインするユーザにそれぞれ使用します。joe" にリブート、シャットダウン、netctl を使わせるためには、以下のようにします。
/etc/pam.d/su と /etc/pam.d/su-l を編集してください。
ユーザが wheel グループに属していることを要求するが、誰もその中に入れないようにする。
#%PAM-1.0 auth sufficient pam_rootok.so # Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so trust use_uid # Uncomment the following line to require a user to be in the "wheel" group. auth required pam_wheel.so use_uid auth required pam_unix.so account required pam_unix.so session required pam_unix.so
SSH ログインを 'ssh' グループに制限します。joe だけがこのグループの一員になります。
groupadd -r ssh gpasswd -a joe ssh echo 'AllowGroups ssh' >> /etc/ssh/sshd_config
リスタート sshd.service.
ユーザーを他のグループに追加する。
for g in power network ;do ;gpasswd -a joe $g ;done for g in network power storage ;do ;gpasswd -a admin $g ;done
デベロッパーが編集できるように、コンフィグにパーミッションを設定します。
chown -R devel:root /etc/{http,openvpn,cups,zsh,vim,screenrc}
Cmnd_Alias POWER = /usr/bin/shutdown -h now, /usr/bin/halt, /usr/bin/poweroff, /usr/bin/reboot Cmnd_Alias STORAGE = /usr/bin/mount -o nosuid\,nodev\,noexec, /usr/bin/umount Cmnd_Alias SYSTEMD = /usr/bin/journalctl, /usr/bin/systemctl Cmnd_Alias KILL = /usr/bin/kill, /usr/bin/killall Cmnd_Alias PKGMAN = /usr/bin/pacman Cmnd_Alias NETWORK = /usr/bin/netctl Cmnd_Alias FIREWALL = /usr/bin/iptables, /usr/bin/ip6tables Cmnd_Alias SHELL = /usr/bin/zsh, /usr/bin/bash %power ALL = (root) NOPASSWD: POWER %network ALL = (root) NETWORK %storage ALL = (root) STORAGE root ALL = (ALL) ALL admin ALL = (root) SYSTEMD, KILL, FIREWALL devel ALL = (root) PKGMAN joe ALL = (devel) SHELL, (admin) SHELL
この設定により、root ユーザーでのログインはほとんど必要なくなります。
joe は自宅の WiFi に接続できます。
sudo netctl start home sudo poweroff
joe は、他のユーザーとして netctl を使用できません。
sudo -u admin -- netctl start home
joe が journalctl を使ったり、逃亡したプロセスを kill したりする必要があるとき、そのユーザーに切り替えることができます。
sudo -i -u devel sudo -i -u admin
しかし、joe は root ユーザーに切り替えることはできません。
sudo -i -u root
joe が管理者として gnu-screen のセッションを開始したい場合は、次のようにします。
sudo -i -u admin admin% chown admin:tty `echo $TTY` admin% screen
/etc/sudoers.d のドロップインファイルを使って sudo を設定
sudo は /etc/sudoers.d/ ディレクトリ内のファイルを読み込みます。/etc/sudoers を編集するかわりに、/etc/sudoers.d/ ディレクトリのファイルで設定を変更することができます。これには2つのメリットがあります:
sudoers.pacnewファイルを編集する必要がありません。- 新しいエントリに問題があった場合、
/etc/sudoersを編集するのではなく問題のあるファイルを削除するだけですみます。
ドロップインファイルのエントリの形式は /etc/sudoers 自体と同じです。直接編集するときは、visudo -f /etc/sudoers.d/somefile を使ってください。詳しくは sudoers(5) の "Including other files from within sudoers" セクションを参照。
/etc/sudoers.d/ ディレクトリのファイルは辞書順に読み込まれます。ファイル名に . または ~ が含まれているとスキップされます。ソート順で問題が起こらないように、ファイル名には2桁の数字を付けてください。例: 01_foo。
ファイルの編集
sudo -e または sudoedit を使うことで、ファイルを他のユーザーとして編集することができます。テキストエディタを動かすユーザーは変わりません。
テキストエディタの権限を昇格させることなく root でファイルを編集することが可能です。詳しくは sudo(8) § e を読んでください。
エディタは他のプログラムに設定できます。例えば meld を使って pacnew ファイルを管理する場合:
$ SUDO_EDITOR=meld sudo -e /etc/file{,.pacnew}
侮辱を有効にする
visudo を使用して sudoers ファイルに次の行を追加することにより、sudo でイースターエッグ (侮辱) することができます。
不正なパスワードを入力すると、Sorry, try again. のメッセージがユーモラスな侮辱に置き換えられます。
/etc/sudoers
Defaults insults
パスワード入力のフィードバックを有効にする
デフォルトでは、パスワードを入力する際に視覚的なフィードバックはありません。これは、セキュリティを高めるために意図的に行われています。しかし、視覚的な入力が必要な場合は、この行を追加することで有効にすることができます:
/etc/sudoers
Defaults pwfeedback
カラーパスワードプロンプト
パスワードプロンプトをカラーや太字フォントでカスタマイズするには、シェル初期化ファイルに SUDO_PROMPT 環境変数 を設定し、tput(1) を使用します。
例えば、パスワードプロンプトを太字の赤で表示するには、以下のように設定します:
export SUDO_PROMPT="$(tput setaf 1 bold)Password:$(tput sgr0) "
また、デフォルトメッセージに異なる色を使用するには、以下のようにします:
export SUDO_PROMPT="$(tput setab 1 setaf 7 bold)[sudo]$(tput sgr0) $(tput setaf 6)password for$(tput sgr0) $(tput setaf 5)%p$(tput sgr0): "
|
|
U2F の使用
U2F は sudo と一緒に使用するのに最適です。これは、公共の場所でのショルダーハックのリスクを効果的に排除しながら、シンプルな物理的なタッチでプロンプトを承認する意識的なコントロールを与えてくれます。
Universal 2nd Factor#パスワードなしの sudo を参照してください。
保護されたファイルへの書き込み
sudo を使用する際、保護されたファイルに書き込みたい場合、tee を使うことで、このような分離が可能になります:
$ input stream | sudo tee --option protected_file_1 protected_file_2...
これは、単純な >/>> が機能しない場合に有効です。
Vim の場合
他のユーザーが所有するファイルを編集している際、sudo 付きで Vim を起動するのを忘れた場合にも、同様の方法が役立ちます。 そのようなときには、Vim 内部で以下を実行することでファイルを保存できます:
:w !sudo tee %
この操作を簡単に使えるように、以下を ~/.vimrc に追加すると、コマンドモードで :w!! によるマッピングが使えるようになります:
~/.vimrc
" Allow saving of files as sudo when I forgot to start vim using sudo cmap w!! w !sudo tee > /dev/null %
> /dev/null の部分は、標準出力を明示的に破棄するためのもので、他のパイプコマンドに何も渡す必要がないためです。
この仕組みがどのように動作し、なぜ機能するのかについての詳細な説明は、StackOverflow の記事 How does the vim “write with sudo” trick work? を参照してください。
トラブルシューティング
SSH TTY 問題
リモートコマンドを実行するとき SSH はデフォルトでは tty を割り当てません。tty がないと、パスワードを要求するときに sudo は echo を無効化することができません。ssh の -tt オプションを使うことで強制的に tty を割り当てることができます (-tt を2回使ってください)。
Defaults オプションの requiretty は tty が存在するときだけ sudo を実行することを許可します。
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. You have to run "ssh -t hostname sudo <cmd>". # #Defaults requiretty
Permissive Umask
Sudo はユーザーの umask の値を sudo の umask (デフォルトは 0022) と結合します。これによってユーザーの umask が許可している以上のパーミッションでファイルを作成できないようにしています。umask をカスタマイズしていない場合はデフォルトで問題ありませんが、sudo によって実行されたユーティリティが作成したファイルのパーミッションが root で直接実行した場合と異なってしまう可能性があります。エラーが発生する場合、たとえユーザーが指定した umask よりもパーミッションを甘くしたいときでも、sudo には umask を修正する手段があります。以下を追加 (visudo を使用) することで sudo のデフォルトの挙動が上書きされます:
Defaults umask = 0022 Defaults umask_override
sudo の umask が root のデフォルト umask (0022) に設定されデフォルトの挙動が上書きされます。ユーザーによって設定された umask を無視して指定された umask を常時使うようになります。