Sudo

提供: ArchWiki
2016年2月14日 (日) 15:29時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

関連記事

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

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

インストール

公式リポジトリから sudo パッケージをインストールしてください:

# pacman -S sudo

sudo を特権がないユーザーで使い始めるには、正しく設定をする必要があります。設定セクションを読んで設定を行なって下さい。

使用方法

ユーザーはコマンドの前に sudo を付けることで、スーパーユーザー(もしくはその他の)特権がある状態でコマンドを実行できます。

例えば、pacman を root で使いたいなら:

$ sudo pacman -Syu

詳しくは sudo マニュアルを見て下さい。

設定

現在の設定を表示

sudo -ll を実行して現在の sudo 設定を表示してください。sudo -lU user で指定したユーザーの sudo 設定も確認できます。

visudo を使う

sudo の設定ファイルは /etc/sudoers です。このファイルはどんなときでも visudo コマンドを使って編集するべきです。visudosudoers ファイルをロックし、一時ファイルに編集内容を保存して、それを /etc/sudoers にコピーする前にファイルの構文をチェックします。

警告:
  • sudoers に構文エラーの危険性があるということは絶対避けなくてはいけません!どんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも visudo を使って編集するようにしてください。
  • man 8 visudo より: VISUAL や EDITOR を設定することであらゆるプログラムを実行できるため、セキュリティホールとなる可能性があります

visudo のデフォルトエディタは vi です。core リポジトリの sudo はデフォルトで --with-env-editor を有効にしてコンパイルされており、VISUALEDITOR 変数を使用することができます。VISUAL が設定されている場合 EDITOR は使われません。

現在のシェルセッションの間だけ visudo のエディタとして nano を使いたい場合、visudo を実行する前に EDITOR 変数を設定してください。

# EDITOR=nano 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
ノート: 後ろの行の設定が前の設定よりも優先されるので、細かくカスタマイズしたオプションはファイルの最後に置くべきです。特にユーザーがグループに含まれているときは上のような行は %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 マニュアル を見て下さい。

Sudoers デフォルトファイルパーミッション

sudoers ファイルの所有者とグループはゼロにしてください、つまり所有者が居てはいけません。ファイルパーミッションは 0440 に設定する必要があります。このパーミッションはデフォルトでセットされますが、パーミッションを変える事故を起こしてしまった場合、すぐにパーミッションを元に戻すか sudo を消して下さい。

# chown -c root:root /etc/sudoers
# chmod -c 0440 /etc/sudoers

パスワードキャッシュのタイムアウト

キャッシュされたパスワードの有効期間の前にデフォルトのタイムアウトを変えることができます。/etc/sudoers の timestamp_timeout でこれができます。単位は分です。 タイムアウトを20分に設定:

Defaults:USER_NAME timestamp_timeout=20
ヒント: sudo が毎回パスワードをきくようにしたいのなら、タイムアウトを 0 に設定してください。パスワードのタイムアウトをなくしたいのなら、0 未満に設定してください。

Tips and tricks

ファイル例

この例は screen, tmux, ratpoison などのターミナルマルチプレクサを使っている人や、スクリプトや cron ジョブから sudo を使っている人に役立つと思われます。

/etc/sudoers
Cmnd_Alias WHEELER = /usr/bin/lsof, /bin/nice, /bin/ps, /usr/bin/top, /usr/local/bin/nano, /usr/bin/ss, /usr/bin/locate, /usr/bin/find, /usr/bin/rsync
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/nice, /usr/bin/ionice, /usr/bin/top, /usr/bin/kill, /usr/bin/killall, /usr/bin/ps, /usr/bin/pkill
Cmnd_Alias EDITS = /usr/bin/vim, /usr/bin/nano, /usr/bin/cat, /usr/bin/vi
Cmnd_Alias ARCHLINUX = /usr/bin/gparted, /usr/bin/pacman

root ALL = (ALL) ALL
USER_NAME ALL = (ALL) ALL, NOPASSWD: WHEELER, NOPASSWD: PROCESSES, NOPASSWD: ARCHLINUX, NOPASSWD: EDITS
 
Defaults !requiretty, !tty_tickets, !umask
Defaults visiblepw, path_info, insults, lecture=always
Defaults loglinelen = 0, logfile =/var/log/sudo.log, log_year, log_host, syslog=auth
Defaults mailto=webmaster@foobar.com, mail_badpass, mail_no_user, mail_no_perms
Defaults passwd_tries = 8, passwd_timeout = 1
Defaults env_reset, always_set_home, set_home, set_logname
Defaults !env_editor, editor="/usr/bin/vim:/usr/bin/vi:/usr/bin/nano"
Defaults timestamp_timeout=360
Defaults passprompt="Sudo invoked by [%u] on [%H] - Cmd run as %U - Password for user %p:"

Bash のタブ補完を有効にする

ユーザーが sudoers ファイルに追加された最初のうちは、デフォルトで、Tab 補完は動作しないようになっています。例えば、通常 John が入力する必要があるのはこれだけです:

$ fire<Tab>

シェルが彼のためにコマンドを補完してくれるでしょう:

$ firefox

しかしながら、John が sudoers ファイルに追加されると、同じように入力しても:

$ sudo fire<Tab>

シェルは何もしません。

sudo で Tab 補完を有効にするには、公式リポジトリから bash-completion パッケージをインストールして下さい。詳しくは bash#タブ補完 を見て下さい。

もしくは、以下を ~/.bashrc に追加して下さい:

complete -cf sudo

sudo を使って X11 アプリを実行

sudo が X11 のグラフィカルアプリケーションを実行できるようにするには visudo に以下を追加する必要があります:

Defaults env_keep += "HOME"

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

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

sudo のデフォルト設定では、新しいターミナルを開くたびにパスワードを入力する必要がありますが、これを鬱陶しく感じるなら tty_tickets を無効化して下さい:

Defaults !tty_tickets

環境変数

環境変数をたくさん使っている場合や、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 パスに /sbin と /usr/sbin を追加

管理コマンド (/sbin/usr/sbin 内のコマンド) をフルパスを使わずに sudo で実行したいなら、以下を /etc/sudoers に追加して下さい:

Defaults secure_path="/bin:/sbin:/usr/bin:/usr/sbin"

これで、

$ sudo /usr/sbin/command

$ sudo /sbin/command

などのコマンドを次で実行できるようになります:

$ sudo command

エイリアスを渡す

使っているエイリアスが多すぎて、sudo を使っている時にそれらを root アカウントに持ち越せないことに気づいたかもしれませんね。しかしながら、エイリアスを全て動作させる簡単な方法があります。以下を ~/.bashrc/etc/bash.bashrc に追加するだけです:

alias sudo='sudo '

Insults

間違ったパスワードが入力されたときに、デフォルトの "wrong password" メッセージの代わりに侮辱的なメッセージを表示するように sudo を設定できます。/etc/sudoers 内の Defaults 行を探して既存のオプションの後に "insults" を加えて下さい。以下のようになります:

#Defaults specification
Defaults insults

テストするために、sudo -K を入力して現在のセッションを終わらせもう一度 sudo にパスワードを尋ねさせてください。

root パスワード

/etc/sudoers の Defaults 行に "rootpw" を加えると sudo はユーザーのパスワードではなく root パスワードを尋ねるようになります:

Defaults timestamp_timeout=0,rootpw

root ログインを無効化

sudo をインストール・設定したら、root ログインを無効化できます。root を無効化すれば、攻撃者はユーザーのパスワードだけでなく sudoer として設定されたユーザー名もまず考えなくてはならなくなります。Secure Shell#root ログインを制限するも参照。

警告: root アカウントを無効にする前にユーザーが sudoer として正しく設定されているか確認して下さい!

アカウントをロックするには passwd を使います:

# passwd -l root

同じようなコマンドで root をアンロックできます。

$ sudo passwd -u root

もしくは、/etc/shadow を編集して root の暗号化されたパスワードを "!" で置き換えてください:

root:!:12345::::::

もう一度 root ログインを有効にするには:

$ sudo passwd root

gksu

デフォルトで sudo を使うように gksu を設定するには、次を実行:

$ gconftool-2 --set --type boolean /apps/gksu/sudo-mode true

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 をインストールしてください。コマンドのタブ補完もあります。

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

sudo/etc/sudoers.d/ ディレクトリ内のファイルを読み込みます。/etc/sudoers を編集するかわりに、/etc/sudoers.d/ ディレクトリのファイルで設定を変更すうrことができます。これには2つのメリットがあります:

  • sudoers.pacnew ファイルを編集する必要がありません。
  • 新しいエントリに問題があった場合、/etc/sudoers を編集するのではなく問題のあるファイルを削除するだけですみます。

ドロップインファイルのエントリの形式は /etc/sudoers 自体と同じです。直接編集するときは、visudo -f /path/to/file を使ってください。詳しくは man sudoersIncluding other files from within sudoers セクションを参照。

トラブルシューティング

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

デフォルトスケルトン

sudo の開発者のサイトには /etc/sudoers ファイルの Defaults コマンドで使うことができる オプションのリスト が存在します。

sudoers に最適化されたフォーマットのオプションリストは [1] を見てください (バージョン 1.8.7 のソースコードから解析)。