「Sudo」の版間の差分
Kusakata.bot (トーク | 投稿記録) 細 (文字列「Tips and tricks」を「ヒントとテクニック」に置換) |
(同期) |
||
1行目: | 1行目: | ||
[[Category:セキュリティ]] |
[[Category:セキュリティ]] |
||
+ | [[Category:コマンドライン]] |
||
[[cs:Sudo]] |
[[cs:Sudo]] |
||
[[en:Sudo]] |
[[en:Sudo]] |
||
[[es:Sudo]] |
[[es:Sudo]] |
||
+ | [[fa:sudo]] |
||
[[fr:Sudo]] |
[[fr:Sudo]] |
||
[[it:Sudo]] |
[[it:Sudo]] |
||
[[ru:Sudo]] |
[[ru:Sudo]] |
||
[[sr:Sudo]] |
[[sr:Sudo]] |
||
− | [[tr:Sudo]] |
||
− | [[uk:Sudo]] |
||
[[zh-hans:Sudo]] |
[[zh-hans:Sudo]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
15行目: | 15行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
− | [ |
+ | [https://www.sudo.ws/sudo/ sudo] ("substitute user do") を使うことでシステム管理者は権限を委託できるようになり、root や他のユーザーとして複数の(もしくは全ての)コマンドを実行する能力を特定のユーザー(もしくはユーザーのグループ)に与えることができます。また sudo を使うとコマンドや引数の記録が残ります。 |
Sudo は root でコマンドを実行するためのものとして [[su]] に代わるものです。[[su]] が root シェルを起動してそれから全てのコマンドを root として実行できるようにするのに対し、sudo は一つのコマンドだけに特権を与えます。必要な時だけに root 特権を有効にするので、sudo を使うことにより打ち間違いや呼び出されたコマンドのバグによってシステムを破壊してしまう可能性を減らすことができます。 |
Sudo は root でコマンドを実行するためのものとして [[su]] に代わるものです。[[su]] が root シェルを起動してそれから全てのコマンドを root として実行できるようにするのに対し、sudo は一つのコマンドだけに特権を与えます。必要な時だけに root 特権を有効にするので、sudo を使うことにより打ち間違いや呼び出されたコマンドのバグによってシステムを破壊してしまう可能性を減らすことができます。 |
||
31行目: | 31行目: | ||
ユーザーはコマンドの前に {{ic|sudo}} を付けることで、スーパーユーザー(もしくはその他の)特権がある状態でコマンドを実行できます。 |
ユーザーはコマンドの前に {{ic|sudo}} を付けることで、スーパーユーザー(もしくはその他の)特権がある状態でコマンドを実行できます。 |
||
+ | |||
+ | ''sudo'' を使うときはコマンドの前に {{ic|sudo}} と空白を付けてください: |
||
+ | |||
+ | $ sudo ''cmd'' |
||
例えば、pacman を root で使いたいなら: |
例えば、pacman を root で使いたいなら: |
||
36行目: | 40行目: | ||
$ sudo pacman -Syu |
$ sudo pacman -Syu |
||
− | 詳しくは |
+ | 詳しくは {{man|8|sudo}} を見てください。 |
== 設定 == |
== 設定 == |
||
50行目: | 54行目: | ||
{{Warning| |
{{Warning| |
||
* {{ic|sudoers}} に構文エラーの危険性があるということは絶対避けなくてはいけません!どんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも {{ic|visudo}} を使って編集するようにしてください。 |
* {{ic|sudoers}} に構文エラーの危険性があるということは絶対避けなくてはいけません!どんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも {{ic|visudo}} を使って編集するようにしてください。 |
||
− | * {{ |
+ | * {{man|8|visudo}} より: ''VISUAL や EDITOR を設定することであらゆるプログラムを実行できるため、セキュリティホールとなる可能性があります''。 |
}} |
}} |
||
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}} は使われません。 |
||
− | 現在のシェルセッションの間だけ '''visudo''' のエディタとして nano を使いたい場合、'''visudo''' を実行する前に {{Ic|EDITOR}} 変数を設定してください |
+ | 現在のシェルセッションの間だけ '''visudo''' のエディタとして nano を使いたい場合、'''visudo''' を実行する前に {{Ic|EDITOR}} 変数を設定してください: |
# EDITOR=nano visudo |
# EDITOR=nano visudo |
||
+ | |||
+ | もしくは {{ic|/etc/sudoers}} ファイルのコピーを編集して {{ic|visudo -c -f ''/copy/of/sudoers''}} でチェックすることもできます。visudo でファイルをロックしたくない場合に有用です。 |
||
{{ic|visudo}} でだけ同じエディタを選び続けたいのなら、以下を {{ic|/etc/sudoers}} に追加してください ({{ic|nano}} はお好きなエディタに変えてください): |
{{ic|visudo}} でだけ同じエディタを選び続けたいのなら、以下を {{ic|/etc/sudoers}} に追加してください ({{ic|nano}} はお好きなエディタに変えてください): |
||
91行目: | 97行目: | ||
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 |
||
− | 説明のついた sudoers のサンプルは {{ic|/usr/share/doc/sudo/examples/sudoers}} にあります。詳しくは |
+ | 説明のついた sudoers のサンプルは {{ic|/usr/share/doc/sudo/examples/sudoers}} にあります。詳しくは {{man|5|sudoers}} を見て下さい。 |
=== Sudoers デフォルトファイルパーミッション === |
=== Sudoers デフォルトファイルパーミッション === |
||
243行目: | 249行目: | ||
$ sudo passwd root |
$ sudo passwd root |
||
+ | {{Tip|''root'' アカウントを無効化した後もインタラクティブな root プロンプトを表示するには、{{ic|sudo -i}} を使ってください。}} |
||
− | ==== gksu ==== |
||
− | |||
− | デフォルトで sudo を使うように ''gksu'' を設定するには、次を実行: |
||
− | $ gconftool-2 --set --type boolean /apps/gksu/sudo-mode true |
||
==== kdesu ==== |
==== kdesu ==== |
||
267行目: | 270行目: | ||
* 新しいエントリに問題があった場合、{{ic|/etc/sudoers}} を編集するのではなく問題のあるファイルを削除するだけですみます。 |
* 新しいエントリに問題があった場合、{{ic|/etc/sudoers}} を編集するのではなく問題のあるファイルを削除するだけですみます。 |
||
− | ドロップインファイルのエントリの形式は {{ic|/etc/sudoers}} 自体と同じです。直接編集するときは、{{ic|visudo -f |
+ | ドロップインファイルのエントリの形式は {{ic|/etc/sudoers}} 自体と同じです。直接編集するときは、{{ic|visudo -f /etc/sudoers.d/''somefile''}} を使ってください。詳しくは {{man|5|sudoers}} の "Including other files from within sudoers" セクションを参照。 |
+ | |||
+ | {{ic|/etc/sudoers.d/}} ディレクトリのファイルは辞書順に読み込まれます。ファイル名に {{ic|.}} または {{ic|~}} が含まれているとスキップされます。ソート順で問題が起こらないように、ファイル名には2桁の数字を付けてください。例: {{ic|01_foo}}。 |
||
+ | |||
+ | {{Note|ドロップインファイルのエントリの順番は重要です: 間違って上書きしてしまわないように注意してください。}} |
||
+ | |||
+ | {{Warning|{{ic|/etc/sudoers.d/}} のファイルは {{ic|/etc/sudoers}} と同じように注意して扱う必要があります: フォーマットを間違えてしまうと {{ic|sudo}} が機能不全に陥ります。{{ic|visudo}} を使うことを強く推奨します。}} |
||
+ | |||
+ | === ファイルの編集 === |
||
+ | |||
+ | {{ic|sudo -e}} または {{ic|sudoedit}} を使うことで、ファイルを他のユーザーとして編集することができます。テキストエディタを動かすユーザーは変わりません。 |
||
+ | |||
+ | テキストエディタの権限を昇格させることなく root でファイルを編集することが可能です。詳しくは {{man|8|sudo|e}} を読んでください。 |
||
+ | |||
+ | エディタは他のプログラムに設定できます。例えば {{Pkg|meld}} を使って [[Pacnew と Pacsave ファイル|pacnew]] ファイルを管理する場合: |
||
+ | |||
+ | $ SUDO_EDITOR=meld sudo -e /etc/''file''{,.pacnew''} |
||
== トラブルシューティング == |
== トラブルシューティング == |
2018年4月27日 (金) 00:31時点における版
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) を見てください。
設定
現在の設定を表示
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
パスワードキャッシュのタイムアウト
キャッシュされたパスワードの有効期間の前にデフォルトのタイムアウトを変えることができます。/etc/sudoers
の timestamp_timeout でこれができます。単位は分です。
タイムアウトを20分に設定:
Defaults:USER_NAME timestamp_timeout=20
ヒントとテクニック
ファイル例
この例は 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 のデフォルト設定では、新しいターミナルを開くたびにパスワードを入力する必要がありますが、これを鬱陶しく感じるなら 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 ログインを制限するも参照。
アカウントをロックするには 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 をインストールしてください。コマンドのタブ補完もあります。
/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}
トラブルシューティング
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 のソースコードから解析)。