Sudo は、システム管理者が権限を委譲して、特定のユーザーまたはユーザー グループに、コマンドとその引数の監査証跡を提供しながら、root または別のユーザーとしてコマンドを実行する能力を与えることができます。
Sudo は、root 権限でコマンドを実行するための su の代替手段です。root シェルを起動し、それ以降のすべてのコマンドに root 権限を付与する su とは異なり、Sudo は単一のコマンドに一時的な権限の昇格を与えます。
Sudo は他のユーザーとしてコマンドを実行するためにも使用できます。さらに、sudo はセキュリティ監査のために、すべてのコマンドと失敗したアクセス試行を記録します。
インストール
sudo パッケージをインストールします。
使用
非特権ユーザーとして sudo
を使い始めるには、適切に設定する必要があります。 詳しくは #設定 をご覧ください。
sudo を使うには、コマンドとその引数の前に sudo
とスペースを入れるだけです:
$ sudo cmd
例えば pacman を使うには:
$ sudo pacman -Syu
詳細は sudo(8) をご覧ください。
設定
Defaults
を議論するイントロダクションを作成し、おそらく一般的な設定をリストアップした表を作成する(トークで議論する。Defaults skeleton
sudoers(5) § SUDOERS OPTIONSは、Defaults
/etc/sudoers
コマンドで使用できるすべてのオプションを一覧表示します。
オプションのリスト (バージョン 1.8.7 のソース コードから解析されたもの) をご覧ください。
パスワードのタイムアウトの設定などの詳細については、sudoers(5)を参照してください。
現在の設定を見る
sudo -ll
を実行すると、現在のsudoの設定を印刷することができますし、sudo -lU user
を実行すると、特定のユーザーの設定を印刷することができます。 visudoはsudoers
/etc/sudoers
にコピーする前に構文エラーをチェックします。
sudoers
には、シンタックスエラーがないことが必須です! エラーがあると sudo が使えなくなります。- visudo(8) は、ユーザが選択したエディタの環境変数を尊重するように visudo を設定することは、セキュリティホールになる可能性があると警告しています。なぜなら、visudo の権限を持つユーザが、その変数に別のものを設定するだけで、ログを取らずに root として任意のコマンドを実行できるからです。 sudo パッケージは
--with-env-editor
SUDO_EDITOR
VISUAL
EDITOR
EDITOR
VISUAL
が設定されていると使用されません。現在のシェルセッションの間、visudoのエディタとしてnanoを使用するには、
EDITOR=nano
をエクスポートします。# EDITOR=nano visudo
別の方法として、
/etc/sudoers
visudo -c -f /copy/of/sudoers
を使用してチェックすることもできます。エディタを恒久的に変更するには、Environment variables#Per userを参照してください。 visudoのためだけにシステム全体で選択するエディタを恒久的に変更するには、以下を
/etc/sudoers
に追加します(nanoがあなたの好みのエディタであると仮定します)。# Reset environment by defaultDefaults env_reset# Set default EDITOR to nano, and do not allow visudo to use EDITOR/VISUAL.Defaults editor=/usr/bin/nano, !env_editor
サンプル エントリ
ユーザーがコマンドの前に
sudo
を付けたときに、完全な root 権限を取得できるようにするには、次の行を追加します。USER_NAME ALL=(ALL) ALL
ユーザーがホスト名
HOST_NAME
のマシン上でのみ、すべてのコマンドを任意のユーザーとして実行できるようにするには、次の行を追加します。USER_NAME HOST_NAME=(ALL) ALL
グループ
wheel
のメンバーに sudo アクセスを許可するには:%wheel ALL=(ALL) ALL
ヒント。 新しい管理者を作成するときには、wheel
グループのsudoアクセスを有効にして、ユーザーをそこに追加することが望ましいことがよくあります。なぜなら、Polkitはデフォルトでwheel
グループのメンバーを管理者として扱うからです。ユーザー
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
の行の後に記述する必要があります。パスワードのないホスト
HOST_NAME
USER_NAME
に対してのみ、明示的に定義されたコマンドを有効にします。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
ファイルのオーナーとグループは両方とも 0 でなければなりません。また、ファイルパーミッションは 0440 に設定されていなければなりません。 これらのパーミッションはデフォルトで設定されていますが、誤って変更してしまった場合は、すぐに元に戻さないと sudo が失敗します。# chown -c root:root /etc/sudoers# chmod -c 0440 /etc/sudoers
ヒントとコツ
パスワード プロンプトのタイムアウトを無効にする
よくある厄介な問題は、どこかのバックグラウンド ターミナルで実行される、通常のパーミッションで実行され、必要なときだけ昇格する長時間実行されるプロセスです。 これにより、sudo のパスワード プロンプトが表示されますが、気づかれずにタイムアウトしてしまい、その時点でプロセスが終了し、実行した作業が失われるか、せいぜいキャッシュされる程度です。 一般的なアドバイスは、パスワードレス sudo を有効にするか、sudo がパスワードを記憶するタイムアウトを延長することです。 これらはどちらもセキュリティ上、マイナスの意味を持ちます。 プロンプトのタイムアウトは無効にすることもできますが、それは合理的なセキュリティ目的を果たさないので、ここではそれが解決策となります。
Defaults passwd_timeout=0
パスワード プロンプトにターミナルのベルを追加する
バックグラウンド ターミナルで sudo プロンプトに注意を向けるために、ユーザーは単にベル文字をエコーさせることができます。
Defaults passprompt="^G password for %p: "
^G
はリテラルのベル文字であることに注意してください。 例)vimでは、Ctrl+v
Ctrl+g
という並びで挿入し、nanoでは、Alt+v
Ctrl+g
という並びで挿入します。エイリアスの継承
エイリアスを多用している方は、sudo を使用する際に、エイリアスが root アカウントに継承されないことにお気づきかもしれません。 しかし、それらを機能させるための簡単な方法があります。
~/.bashrc
/etc/bash.bashrc
:alias sudo='sudo '
端末ごとの sudo を無効にする
警告。 これにより、任意のプロセスがあなたの sudo セッションを使用できるようになります。新しいターミナルを開くたびにパスワードを入力しなければならないsudoのデフォルトに悩まされている場合は、
timestamp_type
global
に設定してください。Defaults timestamp_type=global
パスワードを入力する回数を減らす
5分ごと(デフォルト)にパスワードを再入力しなければならないことに煩わしさを感じる場合は、
timestamp_timeout
に長い値(分単位)を設定することで変更できます。Defaults timestamp_timeout=10
一度に多くの sudo コマンドを使用する場合は、
timestamp_timeout
の値を大きくするよりも、sudo を使用するたびにタイムアウトを更新する方が論理的です。 タイムアウトの更新はsudo -v
sudo -K
はすぐに失効します)。.bashrc
:alias sudo='sudo -v; sudo '
また、bashの関数を使用することもできます。
環境変数
環境変数がたくさんある場合や、
export http_proxy="..."
でプロキシ設定をエクスポートしている場合、sudoを使用するときに-E
オプションを付けてsudoを実行しないと、これらの変数はrootアカウントに渡されません。$ sudo -E pacman -Syu
環境変数を保存する推奨された方法は、
env_keep
に追加することです。/etc/sudoers
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
Root パスワード
ユーザーは、
targetpw
(ターゲットユーザー。/etc/sudoers
の Defaults 行にrootpw
を追加します。Defaults targetpw
root のパスワードをユーザーに公開しないようにするには、特定のグループに制限することができます:
Defaults:%wheel targetpw%wheel ALL=(ALL) ALL
root のログインを無効にする
ユーザーは root のログインを無効にしたいと思うかもしれません。 root がないと、攻撃者はまず sudoer として設定されたユーザー名とユーザーのパスワードを推測しなければなりません。 例えば、OpenSSH#Denyを参照してください。
警告。- 注意してほしいのは、rootログインを無効にすることで自分自身をロックアウトしてしまう可能性があるということです。 Sudo は自動的にはインストールされず、そのデフォルトの設定では、パスワードなしのルートアクセスも、自分のパスワードでのルートアクセスもできません。 root アカウントを無効にする前に、ユーザーが sudoer として適切に設定されていることを確認してください!
- rootpw をデフォルトで使用するように sudoers ファイルを変更している場合は、以下のコマンドで root ログインを無効にしないでください!
- すでにロックアウトされている場合は、パスワード回復を参照してください。
アカウントのロックは
passwd
:# passwd -l root
同様のコマンドで root のロックを解除します。
$ sudo passwd -u root
別の方法として、
/etc/shadow
を編集し、ルートの暗号化されたパスワードを「!”:root:!:12345::::::
再びルートのログインを可能にするには:
$ sudo passwd root
ヒント:kdesu
kdesuはKDEでroot権限でGUIアプリケーションを起動するために使われることがあります。 kdesuはデフォルトでは、rootアカウントが無効であってもsuを使おうとする可能性があります。 幸いなことに、kdesu に su の代わりに sudo を使うように指示することができます。 ファイル
~/.config/kdesurc
:super-user-command=sudo
または以下のコマンドを使用します:
$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo
代わりに kdesudoAUR をインストールすると、以下のコマンドでタブコンプリートが使えるようになります。
sudo の例では、Harden を使用します
例えば、admin、devel、joe の 3 人のユーザーを作成したとしましょう。 admin」はjournalctl、systemctl、mount、kill、iptablesなどの操作を行うユーザー、「devel」はパッケージのインストールや設定ファイルの編集を行うユーザー、「joe」はログインを行うユーザーです。
/etc/pam.d/su
/etc/pam.d/su-l
wheelグループに入ることを要求しますが、誰も入れないようにします。#%PAM-1.0auth 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_uidauth required pam_unix.soaccount required pam_unix.sosession required pam_unix.so
SSHのログインを「ssh」グループに限定します。
groupadd -r sshgpasswd -a joe sshecho 'AllowGroups ssh' >> /etc/ssh/sshd_config
再起動
sshd.service
.他のグループにユーザーを追加します。
for g in power network ;do ;gpasswd -a joe $g ;donefor g in network power storage ;do ;gpasswd -a admin $g ;done
develが編集できるようにconfigsのパーミッションを設定します。
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/rebootCmnd_Alias STORAGE = /usr/bin/mount -o nosuid\,nodev\,noexec, /usr/bin/umountCmnd_Alias SYSTEMD = /usr/bin/journalctl, /usr/bin/systemctlCmnd_Alias KILL = /usr/bin/kill, /usr/bin/killallCmnd_Alias PKGMAN = /usr/bin/pacmanCmnd_Alias NETWORK = /usr/bin/netctlCmnd_Alias FIREWALL = /usr/bin/iptables, /usr/bin/ip6tablesCmnd_Alias SHELL = /usr/bin/zsh, /usr/bin/bash%power ALL = (root) NOPASSWD: POWER%network ALL = (root) NETWORK%storage ALL = (root) STORAGEroot ALL = (ALL) ALLadmin ALL = (root) SYSTEMD, KILL, FIREWALLdevel ALL = (root) PKGMANjoe ALL = (devel) SHELL, (admin) SHELL
この設定では、Rootユーザーとしてログインする必要はほとんどありません。
「joe」は自宅のWiFiに接続できます。
sudo netctl start homesudo poweroff
「joe」は他のユーザーとしてnetctlを使用できません。
sudo -u admin -- netctl start home
「joe」がjournalctlを使用したり、逃げたプロセスを殺す必要がある場合、そのユーザーに切り替えることができます。
sudo -i -u develsudo -i -u admin
しかし、「joe」はルートユーザーに切り替えることはできません。
sudo -i -u root
もし「joe」が admin として gnu-screen セッションを開始したい場合、次のように行うことができます:
sudo -i -u adminadmin% chown admin:tty `echo $TTY`admin% screen
/etc/sudoers.d のドロップインファイルを使用して sudo を設定します。d
sudo は、
/etc/sudoers.d/
/etc/sudoers
を編集する代わりに、スタンドアロンのファイルで設定を変更し、そのディレクトリにドロップすることができます。sudoers.pacnew
ファイルを編集する必要はありません。- 新しいエントリに問題がある場合、
/etc/sudoers
を編集する代わりに、問題のあるファイルを削除することができます (ただし、以下の警告を参照してください)。
これらのドロップイン ファイルのエントリの形式は、
/etc/sudoers
visudo -f /etc/sudoers.d/somefile
を使用してください。/etc/sudoers.d/
.
~
を含むファイル名はスキップされます。注意: ドロップインファイルのエントリの順序は重要です。ステートメントが自身を上書きしないようにしてください。警告。/etc/sudoers.d/
/etc/sudoers
sudo
visudo
ファイルの編集
sudo -e
sudoedit
では、自分のユーザーとしてテキスト エディターを実行しながら、他のユーザーとしてファイルを編集することができます。この機能は、テキストエディタの権限を上げずに、rootとしてファイルを編集する場合に特に便利です。
エディタはどんなプログラムでも設定できることに注意してください。例えば、pacnewファイルを管理するためにmeldを使用することができます。
不正なパスワードを入力すると、
Sorry, try again.
メッセージがユーモアのある侮辱文に置き換えられます。/etc/sudoers
Defaults insults
トラブルシューティング
TTYなしでのSSH問題
この記事やセクションは#Configurationとのマージの候補です。
注意事項:テンプレートの第2引数を使って、より詳細な表示を行ってください。 (Talk:Sudo#で議論)SSHはリモートコマンドを実行するとき、デフォルトではttyを割り当てません。 割り当てられたttyがないと、sudoはパスワードが表示されるのを防ぐことができません。 sshの
-t
オプションを使うことで、強制的にttyを割り当てることができます。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
注意事項:テンプレートの第2引数を使って、より詳細な表示をしてください。 (Talk:Sudo#で議論)Sudoは、ユーザーのumaskの値を自分のumask(デフォルトは0022)と結合します。 これにより、sudo がユーザーの umask が許可するよりも多くのオープンパーミッションを持つファイルを作成することを防ぎます。 カスタム umask が使用されていない場合、これは正常なデフォルトですが、sudo によって実行されたユーティリティが、root によって直接実行された場合とは異なるパーミッションでファイルを作成するような状況が発生する可能性があります。 これによりエラーが発生した場合は、ユーザが指定したumaskよりも希望するumaskの方がより寛容であっても、sudoはumaskを修正する手段を提供します。
visudo
を使用してこれを追加すると、sudo のデフォルトの動作をオーバーライドします:Defaults umask = 0022Defaults umask_override
これは sudo の umask を root のデフォルト umask (0022) に設定し、デフォルトの動作をオーバーライドします。