Sudo
sudo ("substitute user do") を使うことでシステム管理者は権限を委託できるようになり、root や他のユーザーとして複数の(もしくは全ての)コマンドを実行する能力を特定のユーザー(もしくはユーザーのグループ)に与えることができます。また sudo を使うとコマンドや引数の記録が残ります。
Sudo は root でコマンドを実行するためのものとして su に代わるものです。su が root シェルを起動してそれから全てのコマンドを root として実行できるようにするのに対し、sudo は一つのコマンドだけに特権を与えます。必要な時だけに root 特権を有効にするので、sudo を使うことにより打ち間違いや呼び出されたコマンドのバグによってシステムを破壊してしまう可能性を減らすことができます。 Sudo は他のユーザーとしてコマンドを実行するために使うこともできます; さらに、sudo は全てのコマンドとセキュリティ検査のアクセス失敗を記録します。
インストール
公式リポジトリから sudo パッケージをインストールしてください:
# pacman -S sudo
sudo
を特権がないユーザーで使い始めるには、正しく設定をする必要があります。設定セクションを読んで設定を行なって下さい。
使用方法
ユーザーはコマンドの前に sudo
を付けることで、スーパーユーザー(もしくはその他の)特権がある状態でコマンドを実行できます。
sudo を使うときはコマンドの前に sudo
と空白を付けてください:
$ sudo cmd
例えば、pacman を root で使いたいなら:
$ sudo pacman -Syu
詳しくは sudo(8) を見てください。
設定
Defaults skeleton
sudoers(5) § SUDOERS OPTIONS lists all the options that can be used with the Defaults
command in the /etc/sudoers
file.
See [1] for a list of options (parsed from the version 1.8.7 source code) in a format optimized for sudoers
.
See sudoers(5) for more information, such as configuring the password timeout.
現在の設定を表示
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
はお好きなエディタに変えてください):
# Reset environment by default Defaults env_reset # Set default EDITOR to nano, and do not allow visudo to use EDITOR/VISUAL. Defaults editor=/usr/bin/nano, !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
ユーザー USER_NAME が ホスト HOST_NAME を使っているときだけ特定のコマンドに sudo を使えるようにするには:
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
パスワードプロンプトに端末ベルを鳴らす
バックグラウンドの端末で sudo プロンプトに注意を引く為に、bell character を鳴らす方法もあります。
Defaults passprompt="^G[sudo] 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 のデフォルト設定では、新しいターミナルを開くたびにパスワードを入力する必要がありますが、これを鬱陶しく感じるなら tty_tickets を無効化して下さい:
Defaults !tty_tickets
パスワードの入力回数を減らす
5分ごとにパスワードを再入力するのが面倒な場合 (デフォルト)、 timestamp_timeout
に長い値を設定することで変更することができます。(単位:分)。
Defaults timestamp_timeout=10
sudo コマンドを連続してたくさん使う場合は、sudo を使うたびにタイムアウトを更新する方が、より論理的です。
時間をを増やすと、timestamp_timeout
になります。タイムアウトのリフレッシュは sudo -v
で行うことができます。(一方 sudo -K
はすぐに取り消します)
以下を .bashrc
に追加して、これを自動化するとよいでしょう。
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 行に "rootpw" を加えると sudo はユーザーのパスワードではなく root パスワードを尋ねるようになります:
Defaults timestamp_timeout=0,rootpw
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
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
あるいは kdesudoAUR をインストールしてください。コマンドのタブ補完もあります。
Harden with sudo example
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 /etc/pam.d/su
and /etc/pam.d/su-l
Require user be in the wheel group, but do not put anyone in it.
#%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
Limit SSH login to the 'ssh' group. Only "joe" will be part of this group.
groupadd -r ssh gpasswd -a joe ssh echo 'AllowGroups ssh' >> /etc/ssh/sshd_config
Restart sshd.service
.
Add users to other groups.
for g in power network ;do ;gpasswd -a joe $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}
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
With this setup, you will almost never need to login as the Root user.
"joe" can connect to his home WiFi.
sudo netctl start home sudo poweroff
"joe" can not use netctl as any other user.
sudo -u admin -- netctl start home
When "joe" needs to use journalctl or kill run away process he can switch to that user.
sudo -i -u devel sudo -i -u admin
But "joe" cannot switch to the root user.
sudo -i -u root
If "joe" want to start a gnu-screen session as admin he can do it like this:
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}
Enable insults
Users can enable insults easter egg in sudo by adding the following line in sudoers file with visudo
.
Upon entering an incorrect password this will replace Sorry, try again.
message with humorous insults.
/etc/sudoers
Defaults insults
トラブルシューティング
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 を常時使うようになります。