コンテンツにスキップ

「Sudo」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
Permissive Umask: add TranslationStatus.
(3人の利用者による、間の30版が非表示)
1行目: 1行目:
[[Category:セキュリティ]]
[[Category:セキュリティ]]
[[Category:コマンドライン]]
[[Category:コマンド]]
[[cs:Sudo]]
[[de:sudo]]
[[en:Sudo]]
[[en:Sudo]]
[[es:Sudo]]
[[es:Sudo]]
[[fa:sudo]]
[[fr:Sudo]]
[[fr:Sudo]]
[[it:Sudo]]
[[pt:Sudo]]
[[ru:Sudo]]
[[ru:Sudo]]
[[sr: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] ("substitute user do") を使うことでシステム管理者は権限を委託できるようになり、root や他のユーザーとして複数のもしくは全てのコマンドを実行する能力を特定のユーザーもしくはユーザーのグループに与えることができます。また 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 は全てのコマンドとセキュリティ検査のアクセス失敗を記録します。


23行目: 24行目:


[[公式リポジトリ]]から {{Pkg|sudo}} パッケージをインストールしてください:
[[公式リポジトリ]]から {{Pkg|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}} lists all the options that can be used with the {{ic|Defaults}} command in the {{ic|/etc/sudoers}} file.
{{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}} に構文エラーの危険性があるということは絶対避けなくてはいけませんどんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも {{ic|visudo}} を使って編集するようにしてください。
* {{ic|sudoers}} に構文エラーの危険性があるということは絶対避けなくてはいけません!どんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも {{ic|visudo}} を使って編集するようにしてください。
* {{man|8|visudo}} より: ''VISUAL や EDITOR を設定するであらゆログラムを実行できるため、セキュリティホールなる可能性があます''
* {{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 でファイルをロックしたくない場合に有用です。


{{ic|visudo}} でだけ同じエディタを選び続けたいのなら、以下を {{ic|/etc/sudoers}} に追加してください ({{ic|nano}} はおきなエディタに変えてください):
エディタを永久に変更するには、[[環境変数#ユーザーごと]]を参照してください。システム全体で ''visudo'' のみのエディタを永久に変更するには、以下を {{ic|/etc/sudoers}} に追加します([[nano]] みのエディタであると仮定します):


# デフォルトのエディタを nano の制限付きバージョンに設定し、visudo が EDITOR/VISUAL を使用しないようにする。
# Reset environment by default
Defaults env_reset
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 が ホスト HOST_NAME を使っいるときだけ特コマンドに sudo 使えるようにするには:
ホスト {{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


128行目: 140行目:
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: '


=== エイリアスを渡す ===
=== エイリアスを渡す ===


[[Zsh]] と [[Bash]] では、エイリアスは通常、コマンドの最初の単語に対してのみ展開されます。これは、{{ic|sudo}} コマンドを実行するときにエイリアスが通常展開されないことを意味します。次の単語を展開する方法の一つは、スペースで終わる sudo のエイリアスを作成することです。以下を[[コマンドラインシェル#設定ファイル|シェルの設定ファイル]]に追加します:
使っているエイリアスが多すぎて、sudo を使っている時にそれらを root アカウントに持ち越せないことに気づいたかもしれませんね。しかしながら、エイリアスを全て動作させる簡単な方法があります。以下を {{ic|~/.bashrc}} か {{ic|/etc/bash.bashrc}} に追加するだけです:


alias sudo='sudo '
alias sudo='sudo '

{{man|1|zshmisc|ALIASING}} はこれがどのように機能するかを説明しています:
: 置換テキストがスペースで終わる場合、シェル入力の次の単語は常にエイリアス展開の対象になります。

{{man|1|bash|ALIASES}} も同様に説明しています:
: エイリアス値の最後の文字が空白の場合、エイリアスの次のコマンド単語もエイリアス展開の対象としてチェックされます。


=== ターミナルごとの sudo を無効化 ===
=== ターミナルごとの sudo を無効化 ===
140行目: 162行目:
{{Warning|以下を行うとすべてのプロセスがあなたの sudo セッションを使うようになります。}}
{{Warning|以下を行うとすべてのプロセスがあなたの sudo セッションを使うようになります。}}


sudo のデフォルト設定では、新しいターミナルを開くたびにパスワードを入力する必要がありますが、こを鬱陶しく感じなら '''tty_tickets''' を無効化て下さ:
新しいターミナルを開くたびにパスワードを入力するよう求められる sudo のデフォルト設定が煩わしい場合は、{{ic|timestamp_type}} を {{ic|global}} に設定します:


Defaults !tty_tickets
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 '


It is also possible to use a bash function; for more details see [https://unix.stackexchange.com/questions/584725/expand-certain-aliases-from-within-sudo-bash-function stackexchange].
また、bash 関数を使用することも可能です。詳細は [https://unix.stackexchange.com/questions/584725/expand-certain-aliases-from-within-sudo-bash-function stackexchange] を参照してください。


=== 環境変数 ===
=== 環境変数 ===
170行目: 191行目:
</nowiki>}}
</nowiki>}}


=== root パスワード ===
=== Root パスワード ===


{{ic|/etc/sudoers}} の Defaults 行に "rootpw" を加ると sudo はユーザーパスワードではなく root パスワードを尋ねるようになります:
ユーザーは、{{ic|/etc/sudoers}} の Defaults 行に {{ic|targetpw}}(ターゲットユーザー、デフォルトは root)または {{ic|rootpw}}で、ユーザーパスワードの代わりに root パスワードを尋ねるように sudo を設定できます


Defaults timestamp_timeout=0,rootpw
Defaults targetpw

root パスワードをユーザーに公開しないようにするためには、これを特定のグループに制限できます:

Defaults:%wheel targetpw
%wheel ALL=(ALL) ALL


=== root ログインを無効化 ===
=== root ログインを無効化 ===
180行目: 206行目:
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}} を使います:
197行目: 227行目:


$ 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}} を使ってください。}}
211行目: 248行目:
$ 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}} をインストールしてください。コマンドのタブ補完もあります。

=== Harden with sudo example ===


例えば、admin, devel, joe の3人のユーザーを作ったとします。''admin'' は journalctl, systemctl, mount, kill, iptables に、''devel'' はパッケージのインストールや設定ファイルの編集に、そして ''joe'' はログインするユーザにそれぞれ使用します。''joe" にリブート、シャットダウン、netctl を使わせるためには、以下のようにします。
Let us say you create 3 users: admin, devel, and joe. The user "admin" is used for journalctl, systemctl, mount, kill, and iptables; "devel" is used for installing packages, and editing config files; and "joe" is the user you log in with. To let "joe" reboot, shutdown, and use netctl we would do the following:


Edit {{ic|/etc/pam.d/su}} and {{ic|/etc/pam.d/su-l}}
{{ic|/etc/pam.d/su}} {{ic|/etc/pam.d/su-l}} を編集してください。
ユーザが wheel グループに属していることを要求するが、誰もその中に入れないようにする。
Require user be in the wheel group, but do not put anyone in it.
#%PAM-1.0
#%PAM-1.0
auth sufficient pam_rootok.so
auth sufficient pam_rootok.so
229行目: 264行目:
session required pam_unix.so
session required pam_unix.so


SSH ログインを 'ssh' グループに制限します。''joe'' だけがこのグループの一員になります。
Limit SSH login to the 'ssh' group. Only "joe" will be part of this group.
groupadd -r ssh
groupadd -r ssh
gpasswd -a joe ssh
gpasswd -a joe ssh
echo 'AllowGroups ssh' >> /etc/ssh/sshd_config
echo 'AllowGroups ssh' >> /etc/ssh/sshd_config


[[Restart]] {{ic|sshd.service}}.
[[リスタート]] {{ic|sshd.service}}.


ユーザーを他のグループに追加する。
Add users to other groups.
for g in power network ;do ;gpasswd -a joe $g ;done
for g in power network ;do ;gpasswd -a joe $g ;done
for g in network power storage ;do ;gpasswd -a admin $g ;done
for g in network power storage ;do ;gpasswd -a admin $g ;done


デベロッパーが編集できるように、コンフィグにパーミッションを設定します。
Set permissions on configs so devel can edit them.
chown -R devel:root /etc/{http,openvpn,cups,zsh,vim,screenrc}
chown -R devel:root /etc/{http,openvpn,cups,zsh,vim,screenrc}


259行目: 294行目:
joe ALL = (devel) SHELL, (admin) SHELL
joe ALL = (devel) SHELL, (admin) SHELL


この設定により、root ユーザーでのログインはほとんど必要なくなります。
With this setup, you will almost never need to login as the Root user.


''joe'' は自宅の WiFi に接続できます。
"joe" can connect to his home WiFi.
sudo netctl start home
sudo netctl start home
sudo poweroff
sudo poweroff


''joe'' は、他のユーザーとして netctl を使用できません。
"joe" can not use netctl as any other user.
sudo -u admin -- netctl start home
sudo -u admin -- netctl start home


''joe'' が journalctl を使ったり、逃亡したプロセスを kill したりする必要があるとき、そのユーザーに切り替えることができます。
When "joe" needs to use journalctl or kill run away process he can switch to that user.
sudo -i -u devel
sudo -i -u devel
sudo -i -u admin
sudo -i -u admin


しかし、''joe'' は root ユーザーに切り替えることはできません。
But "joe" cannot switch to the root user.
sudo -i -u root
sudo -i -u root


''joe'' が管理者として gnu-screen のセッションを開始したい場合は、次のようにします。
If "joe" want to start a gnu-screen session as admin he can do it like this:
sudo -i -u admin
sudo -i -u admin
admin% chown admin:tty `echo $TTY`
admin% chown admin:tty `echo $TTY`
admin% screen
admin% screen

=== /etc/sudoers.d のドロップインファイルを使って sudo を設定 ===
=== /etc/sudoers.d のドロップインファイルを使って sudo を設定 ===


303行目: 339行目:
$ SUDO_EDITOR=meld sudo -e /etc/''file''{,.pacnew''}
$ SUDO_EDITOR=meld sudo -e /etc/''file''{,.pacnew''}


=== Enable insults ===
=== 侮辱を有効にする ===


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>

|| &nbsp;&nbsp; ||

{| 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]] を参照してください。


== トラブルシューティング ==
== トラブルシューティング ==
333行目: 444行目:


sudo の umask が root のデフォルト umask (0022) に設定されデフォルトの挙動が上書きされます。ユーザーによって設定された umask を無視して指定された umask を常時使うようになります。
sudo の umask が root のデフォルト umask (0022) に設定されデフォルトの挙動が上書きされます。ユーザーによって設定された umask を無視して指定された umask を常時使うようになります。

{{TranslationStatus|Sudo|2024-07-31|811791}}

2024年7月31日 (水) 21:54時点における版

sudo を使うことでシステム管理者は権限を委託できるようになり、root や他のユーザーとして複数の(もしくは全ての)コマンドを実行する能力を特定のユーザー(もしくはユーザーのグループ)に与えることができます。

Sudo は root でコマンドを実行するためのものとして su に代わるものです。su が root シェルを起動してそれから全てのコマンドを root として実行できるようにするのに対し、sudo は一つのコマンドだけに特権を与えます。必要な時だけに root 特権を有効にするので、sudo を使うことにより打ち間違いや呼び出されたコマンドのバグによってシステムを破壊してしまう可能性を減らすことができます。

Sudo は他のユーザーとしてコマンドを実行するために使うこともできます; さらに、sudo は全てのコマンドとセキュリティ検査のアクセス失敗を記録します。

インストール

公式リポジトリから 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 コマンドを使って編集するべきです。visudosudoers ファイルをロックし、一時ファイルに編集内容を保存して、それを /etc/sudoers にコピーする前にファイルの構文をチェックします。

警告
  • sudoers に構文エラーの危険性があるということは絶対避けなくてはいけません!どんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも visudo を使って編集するようにしてください。
  • visudo(8) は、ユーザーが選択したエディターのユーザー環境変数を尊重するように visudo を設定すると、その変数を別の値に設定するだけで、visudo 権限を持つユーザーがログを記録せずに root として任意のコマンドを実行できるようになるため、セキュリティ ホールになる可能性があると警告しています。

visudo のデフォルトエディタは vi です。core リポジトリの sudo はデフォルトで --with-env-editor を有効にしてコンパイルされており、VISUALEDITOR 変数を使用することができます。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
ヒント 新しい管理者を作成する際、wheel グループに sudo アクセスを有効にし、ユーザーを追加することが望ましいです。デフォルトでは、Polkitwheel グループのメンバーを管理者として扱うためです。ユーザーが wheel のメンバーでない場合、Polkit を使用するソフトウェアはユーザーのパスワードではなく root のパスワードを使用して認証を求めることがあります。

ユーザー USER_NAME にパスワードを尋ねるのを無効化するには:

警告 これにより、ユーザー名で実行されている任意のプロセスが、許可を求めずに sudo を使用できるようになります。
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
ノート 後ろの行の設定が前の設定よりも優先されるので、細かくカスタマイズしたオプションはファイルの最後に置くべきです。特にユーザーがグループに含まれているときは上のような行は %wheel 行の後にすべきです。

ユーザー 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

パスワードプロンプトに端末ベルを鳴らす

バックグラウンドの端末で 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: '

エイリアスを渡す

ZshBash では、エイリアスは通常、コマンドの最初の単語に対してのみ展開されます。これは、sudo コマンドを実行するときにエイリアスが通常展開されないことを意味します。次の単語を展開する方法の一つは、スペースで終わる sudo のエイリアスを作成することです。以下をシェルの設定ファイルに追加します:

alias sudo='sudo '

zshmisc(1) § ALIASING はこれがどのように機能するかを説明しています:

置換テキストがスペースで終わる場合、シェル入力の次の単語は常にエイリアス展開の対象になります。

bash(1) § ALIASES も同様に説明しています:

エイリアス値の最後の文字が空白の場合、エイリアスの次のコマンド単語もエイリアス展開の対象としてチェックされます。

ターミナルごとの sudo を無効化

警告 以下を行うとすべてのプロセスがあなたの sudo セッションを使うようになります。

新しいターミナルを開くたびにパスワードを入力するよう求められる sudo のデフォルト設定が煩わしい場合は、timestamp_typeglobal に設定します:

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 ログインを制限するも参照。

警告
  • ルートログインを無効にすることで、自分自身をロックアウトしてしまう可能性がありますのでご注意ください。Sudo は自動的にインストールされませんし、そのデフォルトの設定では、パスワードなしの root アクセスも、自分のパスワードによる root アクセスもできません。root アカウントを無効にする前に、ユーザが sudoer として適切に設定されている ことを確認してください!
  • sudoers ファイルをデフォルトで rootpw を使用するように変更した場合、以下のコマンドで 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
ヒント root アカウントを無効化した後もインタラクティブな root プロンプトを表示するには、sudo -i を使ってください。

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

ノート ドロップインファイルのエントリの順番は重要です: 間違って上書きしてしまわないように注意してください。
警告 /etc/sudoers.d/ のファイルは /etc/sudoers と同じように注意して扱う必要があります: フォーマットを間違えてしまうと sudo が機能不全に陥ります。visudo を使うことを強く推奨します。

ファイルの編集

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): "
tput コマンドラインオプション チートシート
tput コマンド 説明
tput bold 太字テキスト
tput setaf [CODE] 前景色を設定
tput setab [CODE] 背景色を設定
tput rev 色を反転
tput sgr0 すべてをリセット




  
tput カラーコード
tput カラー [CODE]
0
1
2
3
4
5 マゼンタ
6 シアン
7

U2F の使用

U2F は sudo と一緒に使用するのに最適です。これは、公共の場所でのショルダーハックのリスクを効果的に排除しながら、シンプルな物理的なタッチでプロンプトを承認する意識的なコントロールを与えてくれます。

Universal 2nd Factor#パスワードなしの sudo を参照してください。

トラブルシューティング

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 を常時使うようになります。

翻訳ステータス: このページは en:Sudo の翻訳バージョンです。最後の翻訳日は 2024-07-31 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。