「Sudo」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(カテゴリの修正)
1行目: 1行目:
 
[[Category:セキュリティ]]
 
[[Category:セキュリティ]]
[[Category:コマンドライン]]
+
[[Category:コマンド]]
 
[[cs:Sudo]]
 
[[cs:Sudo]]
 
[[en:Sudo]]
 
[[en:Sudo]]

2021年8月13日 (金) 09:32時点における版

関連記事

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

ヒントとテクニック

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

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

Reduce the number of times you have to type a password

If you are annoyed that you have to re-enter your password every 5 minutes (default), you can change this by setting a longer value for timestamp_timeout (in minutes):

Defaults timestamp_timeout=10

If you are using a lot of sudo commands on a row, it is more logical to refresh the timeout every time you use sudo than to increase timestamp_timeout. Refreshing the timeout can be done with sudo -v (whereas sudo -K revokes immediately).

You might want to automate this by adding the following to your .bashrc:

alias sudo='sudo -v; sudo '

It is also possible to use a bash function; for more details see 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 ログインを制限するも参照。

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

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

ノート: ドロップインファイルのエントリの順番は重要です: 間違って上書きしてしまわないように注意してください。
警告: /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 を常時使うようになります。