「Sudo」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎ヒントとテクニック: === エイリアスを渡す === の位置を移動)
(→‎ヒントとテクニック: === ターミナルごとの sudo を無効化 === の位置を変更)
144行目: 144行目:
   
 
alias sudo='sudo '
 
alias sudo='sudo '
  +
  +
=== ターミナルごとの sudo を無効化 ===
  +
  +
{{Warning|以下を行うとすべてのプロセスがあなたの sudo セッションを使うようになります。}}
  +
  +
sudo のデフォルト設定では、新しいターミナルを開くたびにパスワードを入力する必要がありますが、これを鬱陶しく感じるなら '''tty_tickets''' を無効化して下さい:
  +
  +
Defaults !tty_tickets
   
 
=== Bash のタブ補完を有効にする ===
 
=== Bash のタブ補完を有効にする ===
172行目: 180行目:
   
 
Defaults env_keep += "HOME"
 
Defaults env_keep += "HOME"
 
=== ターミナルごとの sudo を無効化 ===
 
 
{{Warning|以下を行うとすべてのプロセスがあなたの sudo セッションを使うようになります。}}
 
 
sudo のデフォルト設定では、新しいターミナルを開くたびにパスワードを入力する必要がありますが、これを鬱陶しく感じるなら '''tty_tickets''' を無効化して下さい:
 
 
Defaults !tty_tickets
 
   
 
=== 環境変数 ===
 
=== 環境変数 ===

2021年8月4日 (水) 21:23時点における版

関連記事

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

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

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 はお好きなエディタに変えてください):

# 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(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
ヒント: sudo が毎回パスワードをきくようにしたいのなら、タイムアウトを 0 に設定してください。パスワードのタイムアウトをなくしたいのなら、0 未満に設定してください。

ヒントとテクニック

パスワードプロンプトのタイムアウトを無効にする

よくある悩みは、通常のパーミッションで実行され、必要な時にのみ上昇するバックグラウンドターミナルで実行される長時間実行プロセスです。これにより 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 セッションを使うようになります。

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

Defaults !tty_tickets

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"

環境変数

環境変数をたくさん使っている場合や、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

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
ヒント: 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

あるいは 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

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

ファイルの編集

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

デフォルトスケルトン

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

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