「Sudo」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(typo)
(他言語へのリンクを修正)
 
(5人の利用者による、間の30版が非表示)
1行目: 1行目:
 
[[Category:セキュリティ]]
 
[[Category:セキュリティ]]
  +
[[Category:コマンド]]
[[cs:Sudo]]
 
  +
[[de:sudo]]
 
[[en:Sudo]]
 
[[en:Sudo]]
 
[[es:Sudo]]
 
[[es:Sudo]]
 
[[fr:Sudo]]
 
[[fr:Sudo]]
[[it:Sudo]]
+
[[pt:Sudo]]
 
[[ru:Sudo]]
 
[[ru:Sudo]]
[[sr:Sudo]]
 
[[tr:Sudo]]
 
 
[[uk:Sudo]]
 
[[uk:Sudo]]
 
[[zh-hans:Sudo]]
 
[[zh-hans:Sudo]]
13行目: 12行目:
 
{{Related|ユーザーとグループ}}
 
{{Related|ユーザーとグループ}}
 
{{Related|su}}
 
{{Related|su}}
  +
{{Related|doas}}
 
{{Related articles end}}
 
{{Related articles end}}
   
[http://www.gratisoft.us/sudo/ sudo] ("substitute user do") を使うことでシステム管理者は権限を委託できるようになり、root や他のユーザーとして複数のもしくは全てのコマンドを実行する能力を特定のユーザーもしくはユーザーのグループに与えることができます。また sudo を使うとコマンドや引数の記録が残ります。
+
[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 を使うことにより打ち間違いや呼び出されたコマンドのバグによってシステムを破壊してしまう可能性を減らすことができます。
  +
 
Sudo は他のユーザーとしてコマンドを実行するために使うこともできます; さらに、sudo は全てのコマンドとセキュリティ検査のアクセス失敗を記録します。
 
Sudo は他のユーザーとしてコマンドを実行するために使うこともできます; さらに、sudo は全てのコマンドとセキュリティ検査のアクセス失敗を記録します。
   
30行目: 31行目:
 
== 使用方法 ==
 
== 使用方法 ==
   
ユーザーはコマンドの前に {{ic|sudo}} を付けることで、スーパーユーザーもしくはその他の特権がある状態でコマンドを実行できます。
+
ユーザーはコマンドの前に {{ic|sudo}} を付けることで、スーパーユーザー(もしくはその他の)特権がある状態でコマンドを実行できます。
  +
  +
''sudo'' を使うときはコマンドの前に {{ic|sudo}} と空白を付けてください:
  +
  +
$ sudo ''cmd''
   
 
例えば、pacman を root で使いたいなら:
 
例えば、pacman を root で使いたいなら:
36行目: 41行目:
 
$ sudo pacman -Syu
 
$ sudo pacman -Syu
   
詳しくは [http://www.gratisoft.us/sudo/man/sudo.html sudo マニュアル]を見てさい。
+
詳しくは {{man|8|sudo}} を見てください。
   
 
== 設定 ==
 
== 設定 ==
  +
  +
=== デフォルトのスケルトンファイル ===
  +
  +
{{man|5|sudoers|SUDOERS OPTIONS}} は {{ic|/etc/sudoers}} ファイル内の {{ic|Defaults}} コマンドで使用できる全てのオプションをリストアップします。
  +
  +
オプションのリスト (バージョン 1.8.7 のソースコードから解析されたもの) を {{ic|sudoers}} 用に最適化した形式で表示するには [https://gist.github.com/AladW/7eca9799b9ea624eca31] を参照してください。
  +
  +
パスワードのタイムアウトの設定など、より詳しい情報は {{man|5|sudoers}} を見て下さい。
   
 
=== 現在の設定を表示 ===
 
=== 現在の設定を表示 ===
49行目: 62行目:
   
 
{{Warning|
 
{{Warning|
* {{ic|sudoers}} に構文エラーの危険性があるということは絶対避けなくてはいけませんどんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも {{ic|visudo}} を使って編集するようにしてください。
+
* {{ic|sudoers}} に構文エラーの危険性があるということは絶対避けなくてはいけません!どんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも {{ic|visudo}} を使って編集するようにしてください。
* {{Ic|man 8 visudo}} より: ''VISUAL や EDITOR を設定するであらゆログラムを実行できるため、セキュリティホールなる可能性があます''
+
* {{man|8|visudo}} は、ユーザーが選択したエディターのユーザー環境変数を尊重するうに visudo を設定すると、その変数を別の値に設定すだけで、visudo 権限を持つユーザーがログを記録せずに root として任意のコマンドを実行できるようになるため、セキュリティ ホールなる可能性があると警告しています。}}
}}
 
   
 
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行目: 105行目:
 
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}} にあります。詳しくは [http://www.gratisoft.us/sudo/man/sudoers.html sudoers マニュアル] を見て下さい。
+
説明のついた sudoers のサンプルは {{ic|/usr/share/doc/sudo/examples/sudoers}} にあります。詳しくは {{man|5|sudoers}} を見て下さい。
   
 
=== Sudoers デフォルトファイルパーミッション ===
 
=== Sudoers デフォルトファイルパーミッション ===
100行目: 114行目:
 
# chmod -c 0440 /etc/sudoers
 
# chmod -c 0440 /etc/sudoers
   
  +
== ヒントとテクニック ==
=== パスワードキャッシュのタイムアウト ===
 
   
  +
=== パスワードプロンプトのタイムアウトを無効にする ===
キャッシュされたパスワードの有効期間の前にデフォルトのタイムアウトを変えることができます。{{ic|/etc/sudoers}} の timestamp_timeout でこれができます。単位は分です。
 
タイムアウトを20分に設定:
 
   
  +
よくある悩みは、通常のパーミッションで実行され、必要な時にのみ上昇するバックグラウンドターミナルで実行される長時間実行プロセスです。これにより sudo のパスワード入力が促され、気づかれずにタイムアウトし、その時点でプロセスが終了し、完了した作業は失われるか、せいぜいキャッシュされます。一般的なアドバイスは、パスワードなしの sudo を有効にするか、パスワードを記憶する sudo のタイムアウトを延長することです。これらはいずれもセキュリティに悪影響を及ぼします。 '''プロンプト''' タイムアウトを無効にすることもできますが、これは適切なセキュリティ上の目的を果たすものではありません、そこを理解して設定する必要があります。
Defaults:USER_NAME timestamp_timeout=20
 
   
  +
Defaults passwd_timeout=0
{{Tip|sudo が毎回パスワードをきくようにしたいのなら、タイムアウトを 0 に設定してください。パスワードのタイムアウトをなくしたいのなら、0 未満に設定してください。}}
 
   
  +
=== パスワードプロンプトに端末ベルを鳴らす ===
== Tips and tricks ==
 
   
  +
バックグラウンドの端末で sudo プロンプトに注意を引く為に、[[Wikipedia:Bell character|bell character]] を鳴らす方法もあります。
=== ファイル例 ===
 
   
  +
Defaults passprompt="^G[sudo] password for %p: "
この例は screen, tmux, ratpoison などのターミナルマルチプレクサを使っている人や、スクリプトや cron ジョブから sudo を使っている人に役立つと思われます。
 
   
  +
{{ic|^G}} は文字通りベル文字です。 例えば。 [[vim]] で、シーケンスを使用して挿入 {{ic|Ctrl+v}} {{ic|Ctrl+g}} または [[Nano]] {{ic|alt+v}} {{ic|Ctrl+g}}
{{hc|/etc/sudoers|<nowiki>
 
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:"
 
</nowiki>}}
 
   
  +
使っているエイリアスが多すぎて、sudo を使っている時にそれらを root アカウントに持ち越せないことに気づいたかもしれません。しかしながら、エイリアスを全て動作させる簡単な方法があります。以下を {{ic|~/.bashrc}} か {{ic|/etc/bash.bashrc}} に追加するだけです:
=== Bash のタブ補完を有効にする ===
 
   
  +
alias sudo='sudo '
ユーザーが sudoers ファイルに追加された最初のうちは、デフォルトで、{{ic|Tab}} 補完は動作しないようになっています。例えば、通常 John が入力する必要があるのはこれだけです:
 
   
  +
=== ターミナルごとの sudo を無効化 ===
$ fire<{{ic|Tab}}>
 
   
  +
{{Warning|以下を行うとすべてのプロセスがあなたの sudo セッションを使うようになります。}}
シェルが彼のためにコマンドを補完してくれるでしょう:
 
   
  +
sudo のデフォルト設定では、新しいターミナルを開くたびにパスワードを入力する必要がありますが、これを鬱陶しく感じるなら '''tty_tickets''' を無効化して下さい:
$ firefox
 
   
  +
Defaults !tty_tickets
しかしながら、John が sudoers ファイルに追加されると、同じように入力しても:
 
   
  +
=== パスワードの入力回数を減らす ===
$ sudo fire<{{ic|Tab}}>
 
   
  +
5分ごとにパスワードを再入力するのが面倒な場合 (デフォルト)、 {{ic|timestamp_timeout}} に長い値を設定することで変更することができます。(単位:分)。
シェルは何もしません。
 
   
  +
Defaults timestamp_timeout=10
sudo で {{ic|Tab}} 補完を有効にするには、[[公式リポジトリ]]から {{pkg|bash-completion}} パッケージを[[pacman|インストール]]して下さい。詳しくは [[bash#タブ補完]] を見て下さい。
 
   
  +
sudo コマンドを連続してたくさん使う場合は、sudo を使うたびにタイムアウトを更新する方が、より論理的です。
もしくは、以下を {{ic|~/.bashrc}} に追加して下さい:
 
  +
時間をを増やすと、{{ic|timestamp_timeout}} になります。タイムアウトのリフレッシュは {{ic|sudo -v}} で行うことができます。(一方 {{ic|sudo -K}} はすぐに取り消します)
   
  +
以下を {{ic|.bashrc}} に追加して、これを自動化するとよいでしょう。
complete -cf sudo
 
   
  +
alias sudo='sudo -v; sudo '.
=== sudo を使って X11 アプリを実行 ===
 
   
  +
bash の関数を使うことも可能です。詳しくは [https://unix.stackexchange.com/questions/584725/expand-certain-aliases-from-within-sudo-bash-function stackexchange] を参照してください。
sudo が X11 のグラフィカルアプリケーションを実行できるようにするには visudo に以下を追加する必要があります:
 
 
Defaults env_keep += "HOME"
 
 
=== ターミナルごとの sudo を無効化 ===
 
 
{{Warning|以下を行うとすべてのプロセスがあなたの sudo セッションを使うようになります。}}
 
 
sudo のデフォルト設定では、新しいターミナルを開くたびにパスワードを入力する必要がありますが、これを鬱陶しく感じるなら '''tty_tickets''' を無効化して下さい:
 
 
Defaults !tty_tickets
 
   
 
=== 環境変数 ===
 
=== 環境変数 ===
181行目: 169行目:
 
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
 
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
 
</nowiki>}}
 
</nowiki>}}
 
=== root パスに /sbin と /usr/sbin を追加 ===
 
 
管理コマンド ({{ic|/sbin}} や {{ic|/usr/sbin}} 内のコマンド) をフルパスを使わずに sudo で実行したいなら、以下を {{ic|/etc/sudoers}} に追加して下さい:
 
 
Defaults secure_path="/bin:/sbin:/usr/bin:/usr/sbin"
 
 
これで、
 
 
$ sudo /usr/sbin/command
 
 
 
 
$ sudo /sbin/command
 
 
などのコマンドを次で実行できるようになります:
 
 
$ sudo command
 
 
=== エイリアスを渡す ===
 
 
使っているエイリアスが多すぎて、sudo を使っている時にそれらを root アカウントに持ち越せないことに気づいたかもしれませんね。しかしながら、エイリアスを全て動作させる簡単な方法があります。以下を {{ic|~/.bashrc}} か {{ic|/etc/bash.bashrc}} に追加するだけです:
 
 
alias sudo='sudo '
 
 
=== Insults ===
 
 
間違ったパスワードが入力されたときに、デフォルトの "wrong password" メッセージの代わりに侮辱的なメッセージを表示するように sudo を設定できます。{{ic|/etc/sudoers}} 内の Defaults 行を探して既存のオプションの後に "insults" を加えて下さい。以下のようになります:
 
 
#Defaults specification
 
Defaults insults
 
 
テストするために、{{ic|sudo -K}} を入力して現在のセッションを終わらせもう一度 sudo にパスワードを尋ねさせてください。
 
   
 
=== root パスワード ===
 
=== root パスワード ===
225行目: 180行目:
 
sudo をインストール・設定したら、root ログインを無効化できます。root を無効化すれば、攻撃者はユーザーのパスワードだけでなく sudoer として設定されたユーザー名もまず考えなくてはならなくなります。[[Secure Shell#root ログインを制限する]]も参照。
 
sudo をインストール・設定したら、root ログインを無効化できます。root を無効化すれば、攻撃者はユーザーのパスワードだけでなく sudoer として設定されたユーザー名もまず考えなくてはならなくなります。[[Secure Shell#root ログインを制限する]]も参照。
   
  +
{{Warning|
{{Warning|root アカウントを''無効にする前に''ユーザーが sudoer として正しく設定されているか確認して下さい!}}
 
  +
* ルートログインを無効にすることで、自分自身をロックアウトしてしまう可能性がありますのでご注意ください。Sudo は自動的にインストールされませんし、そのデフォルトの設定では、パスワードなしの root アクセスも、自分のパスワードによる root アクセスもできません。root アカウントを無効にする前に、ユーザが sudoer として適切に設定されている ことを確認してください!
  +
* sudoers ファイルをデフォルトで rootpw を使用するように変更した場合、以下のコマンドで root ログインを無効化しないでください!
  +
* すでにロックアウトされている場合は、[[パスワードリカバリ]] を参照してください。
  +
}}
   
 
アカウントをロックするには {{ic|passwd}} を使います:
 
アカウントをロックするには {{ic|passwd}} を使います:
243行目: 202行目:
 
$ 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 ====
260行目: 216行目:
   
 
あるいは {{AUR|kdesudo}} をインストールしてください。コマンドのタブ補完もあります。
 
あるいは {{AUR|kdesudo}} をインストールしてください。コマンドのタブ補完もあります。
  +
  +
=== sudoでハード化する例 ===
  +
  +
例えば、admin, devel, joe の3人のユーザーを作ったとします。''admin'' は journalctl, systemctl, mount, kill, iptables に、''devel'' はパッケージのインストールや設定ファイルの編集に、そして ''joe'' はログインするユーザにそれぞれ使用します。''joe" にリブート、シャットダウン、netctl を使わせるためには、以下のようにします。
  +
  +
{{ic|/etc/pam.d/su}} と {{ic|/etc/pam.d/su-l}} を編集してください。
  +
ユーザが wheel グループに属していることを要求するが、誰もその中に入れないようにする。
  +
#%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
  +
  +
SSH ログインを 'ssh' グループに制限します。''joe'' だけがこのグループの一員になります。
  +
groupadd -r ssh
  +
gpasswd -a joe ssh
  +
echo 'AllowGroups ssh' >> /etc/ssh/sshd_config
  +
  +
[[リスタート]] {{ic|sshd.service}}.
  +
  +
ユーザーを他のグループに追加する。
  +
for g in power network ;do ;gpasswd -a joe $g ;done
  +
for g in network power storage ;do ;gpasswd -a admin $g ;done
  +
  +
デベロッパーが編集できるように、コンフィグにパーミッションを設定します。
  +
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
  +
  +
この設定により、root ユーザーでのログインはほとんど必要なくなります。
  +
  +
''joe'' は自宅の WiFi に接続できます。
  +
sudo netctl start home
  +
sudo poweroff
  +
  +
''joe'' は、他のユーザーとして netctl を使用できません。
  +
sudo -u admin -- netctl start home
  +
  +
''joe'' が journalctl を使ったり、逃亡したプロセスを kill したりする必要があるとき、そのユーザーに切り替えることができます。
  +
sudo -i -u devel
  +
sudo -i -u admin
  +
  +
しかし、''joe'' は root ユーザーに切り替えることはできません。
  +
sudo -i -u root
  +
  +
''joe'' が管理者として gnu-screen のセッションを開始したい場合は、次のようにします。
  +
sudo -i -u admin
  +
admin% chown admin:tty `echo $TTY`
  +
admin% screen
   
 
=== /etc/sudoers.d のドロップインファイルを使って sudo を設定 ===
 
=== /etc/sudoers.d のドロップインファイルを使って sudo を設定 ===
267行目: 290行目:
 
* 新しいエントリに問題があった場合、{{ic|/etc/sudoers}} を編集するのではなく問題のあるファイルを削除するだけですみます。
 
* 新しいエントリに問題があった場合、{{ic|/etc/sudoers}} を編集するのではなく問題のあるファイルを削除するだけですみます。
   
ドロップインファイルのエントリの形式は {{ic|/etc/sudoers}} 自体と同じです。直接編集するときは、{{ic|visudo -f ''/path/to/file''}} を使ってください。詳しくは {{ic|man sudoers}} の '''Including other files from within sudoers''' セクションを参照。
+
ドロップインファイルのエントリの形式は {{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''}
  +
  +
=== 侮辱を有効にする ===
  +
  +
visudo を使用して sudoers ファイルに次の行を追加することにより、sudo でイースターエッグ (侮辱) することができます。
  +
  +
不正なパスワードを入力すると、{{ic|Sorry, try again.}} のメッセージがユーモラスな侮辱に置き換えられます。
  +
  +
{{hc|1=/etc/sudoers|2=
  +
Defaults insults
  +
}}
  +
  +
=== パスワード入力のフィードバックを有効にする ===
  +
  +
デフォルトでは、パスワードを入力する際に視覚的なフィードバックはありません。これは、セキュリティを高めるために意図的に行われています。しかし、視覚的な入力が必要な場合は、この行を追加することで有効にすることができます:
  +
  +
{{hc|/etc/sudoers|2=
  +
Defaults pwfeedback
  +
}}
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
289行目: 346行目:
   
 
sudo の umask が root のデフォルト umask (0022) に設定されデフォルトの挙動が上書きされます。ユーザーによって設定された umask を無視して指定された umask を常時使うようになります。
 
sudo の umask が root のデフォルト umask (0022) に設定されデフォルトの挙動が上書きされます。ユーザーによって設定された umask を無視して指定された umask を常時使うようになります。
 
=== デフォルトスケルトン ===
 
 
sudo の開発者のサイトには {{ic|/etc/sudoers}} ファイルの {{ic|Defaults}} コマンドで使うことができる [http://www.sudo.ws/sudo/sudoers.man.html#x5355444f455253204f5054494f4e53 オプションのリスト] が存在します。
 
 
{{ic|sudoers}} に最適化されたフォーマットのオプションリストは [https://gist.github.com/AladW/7eca9799b9ea624eca31] を見てください (バージョン 1.8.7 のソースコードから解析)。
 

2024年3月13日 (水) 03:28時点における最新版

関連記事

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) を見てください。

設定

デフォルトのスケルトンファイル

sudoers(5) § SUDOERS OPTIONS/etc/sudoers ファイル内の Defaults コマンドで使用できる全てのオプションをリストアップします。

オプションのリスト (バージョン 1.8.7 のソースコードから解析されたもの) を sudoers 用に最適化した形式で表示するには [1] を参照してください。

パスワードのタイムアウトの設定など、より詳しい情報は sudoers(5) を見て下さい。

現在の設定を表示

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

visudo を使う

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

警告:
  • sudoers に構文エラーの危険性があるということは絶対避けなくてはいけません!どんなエラーでも sudo を使用不可能にしてしまいます。エラーを防ぐためにどんなときでも visudo を使って編集するようにしてください。
  • visudo(8) は、ユーザーが選択したエディターのユーザー環境変数を尊重するように visudo を設定すると、その変数を別の値に設定するだけで、visudo 権限を持つユーザーがログを記録せずに root として任意のコマンドを実行できるようになるため、セキュリティ ホールになる可能性があると警告しています。

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

パスワードの入力回数を減らす

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 ログインを制限するも参照。

警告:
  • ルートログインを無効にすることで、自分自身をロックアウトしてしまう可能性がありますのでご注意ください。Sudo は自動的にインストールされませんし、そのデフォルトの設定では、パスワードなしの root アクセスも、自分のパスワードによる root アクセスもできません。root アカウントを無効にする前に、ユーザが sudoer として適切に設定されている ことを確認してください!
  • sudoers ファイルをデフォルトで rootpw を使用するように変更した場合、以下のコマンドで root ログインを無効化しないでください!
  • すでにロックアウトされている場合は、パスワードリカバリ を参照してください。

アカウントをロックするには 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 をインストールしてください。コマンドのタブ補完もあります。

sudoでハード化する例

例えば、admin, devel, joe の3人のユーザーを作ったとします。admin は journalctl, systemctl, mount, kill, iptables に、devel はパッケージのインストールや設定ファイルの編集に、そして joe はログインするユーザにそれぞれ使用します。joe" にリブート、シャットダウン、netctl を使わせるためには、以下のようにします。

/etc/pam.d/su/etc/pam.d/su-l を編集してください。 ユーザが wheel グループに属していることを要求するが、誰もその中に入れないようにする。

#%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

SSH ログインを 'ssh' グループに制限します。joe だけがこのグループの一員になります。

groupadd -r ssh
gpasswd -a joe ssh
echo 'AllowGroups ssh' >> /etc/ssh/sshd_config

リスタート sshd.service.

ユーザーを他のグループに追加する。

for g in power network ;do ;gpasswd -a joe $g ;done
for g in network power storage ;do ;gpasswd -a admin $g ;done

デベロッパーが編集できるように、コンフィグにパーミッションを設定します。

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 

この設定により、root ユーザーでのログインはほとんど必要なくなります。

joe は自宅の WiFi に接続できます。

sudo netctl start home
sudo poweroff

joe は、他のユーザーとして netctl を使用できません。

sudo -u admin -- netctl start home

joe が journalctl を使ったり、逃亡したプロセスを kill したりする必要があるとき、そのユーザーに切り替えることができます。

sudo -i -u devel
sudo -i -u admin

しかし、joe は root ユーザーに切り替えることはできません。

sudo -i -u root

joe が管理者として gnu-screen のセッションを開始したい場合は、次のようにします。

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}

侮辱を有効にする

visudo を使用して sudoers ファイルに次の行を追加することにより、sudo でイースターエッグ (侮辱) することができます。

不正なパスワードを入力すると、Sorry, try again. のメッセージがユーモラスな侮辱に置き換えられます。

/etc/sudoers
Defaults insults

パスワード入力のフィードバックを有効にする

デフォルトでは、パスワードを入力する際に視覚的なフィードバックはありません。これは、セキュリティを高めるために意図的に行われています。しかし、視覚的な入力が必要な場合は、この行を追加することで有効にすることができます:

/etc/sudoers
Defaults pwfeedback

トラブルシューティング

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