sudo
sudo コマンドは特権の昇格をシンプル・安全に管理します。たとえば一般ユーザーが特定(もしくはすべて)のコマンドを root や他のユーザーで(パスワードなしも含め)実行できるようにします。
ユーザーに完全なroot特権を渡さずに、特権の必要な操作を許可するためにはsudoを使うとよいでしょう。sudoを使うことで誰が何をすることができるかを制御できます。
この記事は手短な説明です。app-admin/sudo はここで述べられているよりも非常にパワフルです。違うユーザーとしてファイルを編集したり(sudoedit)、スクリプトの中から実行(つまりバックグラウンドで実行可能で、キーボードなどの代わりに標準入力からパスワードを読み込めます)するなど、特別な機能を備えています。
さらなる情報に関しては、sudoやsudoersのマニュアルを参照してください。
インストール
sudo は system 集合の一部ではないので、必要な場合は手動でインストールする必要があります。
sudo がインストールされていない場合でも、su コマンドはいつでも利用できるはずです。
USE フラグ
USE flags for app-admin/sudo Allows users or groups to run commands as other users
+secure-path
|
Replace PATH variable with compile time secure paths |
+sendmail
|
Allow sudo to send emails with sendmail |
gcrypt
|
Use message digest functions from dev-libs/libgcrypt instead of sudo's |
ldap
|
Add LDAP support (Lightweight Directory Access Protocol) |
nls
|
Add Native Language Support (using gettext - GNU locale utilities) |
offensive
|
Let sudo print insults when the user types the wrong password |
pam
|
Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip |
sasl
|
Add support for the Simple Authentication and Security Layer |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
skey
|
Enable S/Key (Single use password) authentication support |
ssl
|
Add support for SSL/TLS connections (Secure Socket Layer / Transport Layer Security) |
sssd
|
Add System Security Services Daemon support |
verify-sig
|
Verify upstream signatures on distfiles |
Emerge
root #
emerge --ask app-admin/sudo
設定
アクティビティのログを記録する
sudoのもう一つの利点は、(成功したかしないかにかかわらず)アプリケーションを実行しようとする試みをログに記録できることです。これは、直すのに10時間掛かった致命的な間違いを、誰がしたかというのを追跡するのに非常に便利です:)
権限の付与
システム管理者は、app-admin/sudoパッケージを使うことで他のユーザに、通常実行権限がないアプリケーション(群)を実行させるための権限を与えることができます。アプリケーションのsetuid
ビットとは違って、sudoは誰が'ある特定のコマンドを実行できるか、そしていつできるかといった、より細かな管理を行うことができます。
sudoを使用することで、誰があるアプリケーションを使用できるかと行った明確な一覧を作成することができます。もしsetuidビットが実行ファイルに設定されている場合、どのユーザも(あるいは使用されているパーミッション設定によってはある特定のグループのユーザが)そのアプリケーションを実行できます。sudoを使用することで、ユーザにアプリケーションを実行するためのパスワードを求めることができます(そして多分そうすべきです)。
sudo の設定は /etc/sudoers ファイルによって管理されます。
/etc/sudoers ファイルを nano /etc/sudoers や vim /etc/sudoers やその他のエディタで編集してはいけません。/etc/sudoers ファイルの内容を変えたい時は、いつも visudo を使うようにしてください。このツールは、複数のシステム管理者が同時にこのファイルを編集しないようにし、ファイルのパーミッション設定を保存し、そしてファイルに致命的な間違いがないようにいくつか文法チェックを行います。
基本的な構文
sudoの最も難解な部分が/etc/sudoersの構文です。基本的な構文を示します。
user host = command
この行は、host
からログインしているuser
というユーザーは command
というコマンドを実行してもよい、ということをsudoに示します(カンマ区切りのコマンドのリストを書くこともできます)。
もっと現実的な例を挙げればより明確になるかもしれません:larryに、彼がlocalhostからログインしている時emergeの実行を許可する:
larry localhost = /usr/bin/emerge
ホスト名はhostnameの出力と一致させます。
最も単純な場合、コマンドは完全修飾パスとなります、従って
emerge
ではなく/usr/bin/emerge
です。パスはワイルドカードを含むこともでき、ディレクトリ全体を指すことも可能です。詳しくはmanページを参照してください。一般ユーザに対して特権の昇格を許可できるアプリケーションの実行を許可しないでください。例えば、あるユーザーに emerge を root で実行させるというのは完全な root 権限を与えるのと同義です。なぜなら emerge はユーザーの意のままにファイルシステムを変更することができるからです。信用できない sudo ユーザーに特権を与えてはいけません。
ユーザー名の代わりにグループ名を使うこともできます。この場合はグループ名の頭に%
をつけてください。wheelグループのメンバーにemergeの実行を許可する場合はこのように書きます。
%wheel localhost = /usr/bin/emerge
特定のマシンの特定のユーザに2つ以上のコマンドを実行可能にさせるために、一行に複数のコマンドを並べることができます。例えばlarryにemergeだけでなくebuildとemerge-webrsyncの実行も許可する場合はこう書きます。
larry localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync
単に実行ファイルの名前だけではなく、(パラメータや引数を含めた) 正確なコマンドラインを指定することもできます。これは、あるツールの使用を特定のコマンドオプションの組み合わせにまで制限するのに便利です。sudo では、シェルスタイルのワイルドカード (メタあるいはグロブとしても知られる) を sudoers ファイルのパスネームやコマンドライン引数に使用することができます。これらは正規表現ではないことに注意してください。
これは、emergeにアクセスする完全な力を与えられたユーザが初めてsudoを実行した時の例です:
user $
sudo emerge -uDN world
あなたはシステム管理者から通常の講習を受けたはずです。 これは通常、以下の3点に要約されます: #1) 他人のプライバシーを尊重すること。 #2) タイプする前に考えること。 #3) 大いなる力には大いなる責任が伴うこと。 パスワード: ## (rootではなくユーザーのパスワードを入力します!)
sudoが要求するパスワードはユーザー自身のパスワードです。この手順を踏むことで、うっかりログインしたまま席を離れてしまった時に不正利用されないようにします。
sudoは
${PATH}
を変更しません。sudoで実行するコマンドはユーザ自身の環境内で実行されます。このため、例えば/sbinなどに置かれたツールを実行したい時は、次のように完全なパスをsudoに渡さなければなりません。
user $
sudo /usr/sbin/emerge-webrsync
LDAPでの基本文法
LDAPサポートのためにはldap
とpam
のUSEフラグが必要となります。
sudoをLDAPと一緒に使用する場合、sudoはLDAPサーバからも設定を読み込みます。従って2つのファイルを編集する必要があります。
# See ldap.conf(5) and README.LDAP for details
# This file should only be readable by root
# supported directives: host, port, ssl, ldap_version
# uri, binddn, bindpw, sudoers_base, sudoers_debug
# tls_{checkpeer,cacertfile,cacertdir,randfile,ciphers,cert,key}
host ldap.example.com
port 389
base dc=example,dc=com
uri ldap://ldap.example.com/
#uri ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock
ldap_version 3
#ssl start_tls
sudoers_base ou=SUDOers,dc=example,dc=com
#sudoers_debug 2
bind_policy soft
sudoers: ldap files
以下のLDAPのエントリを、sudoのために追加する必要があります。
セキュリティの理由で、sudoersのブランチがツリーの最上位に来るよう設計されています。これによって別のアクセス権限でLDAPからこのブランチへの読み込み/書き込みを許可することになります。
version: 1
DN: ou=SUDOers,dc=example,dc=com
objectClass: organizationalUnit
objectClass: top
objectClass: domainRelatedObject
associatedDomain: example.com
ou: SUDOers
DN: cn=defaults,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOption: env_reset
DN: cn=root,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: root
sudoCommand: ALL
sudoHost: ALL
sudoUser: root
DN: cn=%wheel,ou=SUDOers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: %wheel
sudoCommand: ALL
sudoHost: ALL
sudoOption: !authenticate
sudoUser: %wheel
version: 1
DN: cn=wheel,ou=Group,dc=example,dc=com
objectClass: top
objectClass: posixGroup
cn: wheel
description: Wheel Group
gidNumber: 10
memberUid: useradmin1
memberUid: root
The configuration on the sudoer on LDAP are similar to files with some different. Please read more about sudo with LDAP on the link below.[1]
エイリアスを用いる
より大きな環境では、すべてのユーザ(またはホスト、あるいはコマンド)を何回も何回も打ち込むのは恐ろしいタスクとなります。/etc/sudoersの管理を楽にするに、エイリアスを定義することができます。エイリアスの定義の構文は極めて単純です:
Host_Alias hostalias = hostname1, hostname2, ...
User_Alias useralias = user1, user2, ...
Cmnd_Alias cmndalias = command1, command2, ...
どの場所でも、いつでも機能するエイリアスの1つにALL
エイリアスがあります(エイリアスとそうでないものを分かりやすく区別するために、エイリアスに大文字を使用することが推奨されています)。ALL
エイリアスはありうるすべての設定へのエイリアスです。
ALL
エイリアスの使用例として、すべてのユーザにもしそのユーザがローカルでログインしている場合にshutdownコマンドの実行を認める例がこちらです:
ALL localhost = /sbin/shutdown
ユーザlarryが、彼がどこからログインしているかに関わらず、emergeコマンドをrootとして実行するのを認める例:
larry ALL = /usr/bin/emerge
より興味深いものとして、ソフトウェア管理アプリケーション(emergeやebuildのようなもの)をシステムで実行できるユーザの組と、rootを除いたすべてのユーザのパスワードを変更できる管理グループを定義するというものがあります!
User_Alias SOFTWAREMAINTAINERS = larry, john, danny
User_Alias PASSWORDMAINTAINERS = larry, sysop
Cmnd_Alias SOFTWARECOMMANDS = /usr/bin/emerge, /usr/bin/ebuild
Cmnd_Alias PASSWORDCOMMANDS = /usr/bin/passwd [a-zA-Z0-9_-]*, !/usr/bin/passwd root
SOFTWAREMAINTAINERS localhost = SOFTWARECOMMANDS
PASSWORDMAINTAINERS localhost = PASSWORDCOMMANDS
非ルートでの実行
ユーザに別の非ルートのユーザとしてアプリケーションを実行させることも可能です。これはアプリケーションが別のユーザとして実行されていて(例えばウェブサーバ用のapache)、ある特定のユーザにそのユーザとして(ゾンビプロセスをkillするような)特権的なステップを踏ませたい時に非常に興味深いものとなります。
/etc/sudoers内で、コマンドのリストの前にユーザのリストを(
と)
で囲んでください:
users hosts = (run-as) commands
larryに、ユーザapacheあるいはユーザgorgとしてkillの実行を認める例:
Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill
larry ALL = (apache, gorg) KILL
この組を使うことで、ユーザはアプリケーションをどのユーザとして実行したいかをsudo -uで選択することが出来ます:
user $
sudo -u apache pkill apache
Runas_Alias
命令を使用して、アプリケーションを実際に実行するユーザのエイリアスを作成することができます。使用方法は今まで見てきた他の_Alias
と同じです。
パスワードとデフォルトの設定
デフォルトでは、sudoはユーザを認証するためにユーザのパスワードを尋ねます。一旦パスワードが入力されると、sudoはパスワードを5分間記憶し、ユーザに仕事に集中させ、繰り返しパスワードを入力させないようにします。
勿論、この振る舞いは変更することができます:あるユーザに対するデフォルトの振る舞いを変更するには、/etc/sudoersのDefaults:
指示文を設定してください。
例えば、デフォルトの5分から0分(記憶させない)に変更する場合:
Defaults:larry timestamp_timeout=0
-1
をセットすることで、パスワードは(システムが再起動されるまで)永遠に記憶されます。
別の設定として、sudoを実行するユーザ個人のパスワードではなく、実際のコマンドを実行するユーザのパスワードを求めるというものがあります。これはrunaspw
を使用することで設定できます。また、以下の例では再試行の回数(sudoの失敗までにユーザがどのくらいの回数までパスワードを再入力できるか)を、デフォルトの3の代わりに2
に設定しています:
Defaults:john runaspw, passwd_tries=2
他の興味深い機能として、DISPLAY
変数の値をセットしたままにすることで、グラフィカルツールを起動できるというものがあります:
Defaults:john env_keep=DISPLAY
何十ものデフォルトの設定を、Defaults:
命令を使用して変更することができます。sudoersのマニュアルページを開き、Defaults
を探してください。
ユーザに全くパスワードを求めずにあるコマンドのセットの実行を認める場合、コマンドをNOPASSWD:
で始めてください、次のような感じです:
larry localhost = NOPASSWD: /usr/bin/emerge
bash での補完
bashでsudoの補完を行いたいユーザは、このコマンドを一回だけ実行する必要があります。
user $
echo "complete -cf sudo" >> $HOME/.bashrc
Zshell での補完
sudo用のzshの補完を利用したいユーザは、以下の内容を.zprofileと.zshrcにそれぞれ追加することで利用できます:
if [[ $EUID != 0 ]]; then
typeset -xT SUDO_PATH sudo_path
typeset -U sudo_path
sudo_path=({,/usr/local,/usr}/sbin(N-/))
alias sudo="sudo env PATH=\"SUDO_PATH:$PATH\""
fi
zstyle ':completion:*:sudo:*' environ PATH="$SUDO_PATH:$PATH"
以上の変更によって、/sbin、/usr/sbinそして/usr/local/sbinにあるすべてのコマンドを、sudoと打った場合に補完として利用することができるようになります。
This alias will disrupt sudo configurations specifying commands like
larry localhost = NOPASSWD: /usr/bin/emerge
使い方
特権の列挙
ユーザが現在できることを一覧にして表示するには、sudo -lを実行してください:
user $
sudo -l
User larry may run the following commands on this host: (root) /usr/libexec/xfsm-shutdown-helper (root) /usr/bin/emerge (root) /usr/bin/passwd [a-zA-Z0-9_-]* (root) !/usr/bin/passwd root (apache) /usr/bin/pkill (apache) /bin/kill
/etc/sudoers内にある、パスワードの入力を必要としないすべてのコマンドは、そのエントリを一覧として表示することに対してもパスワードは求められません。そうでなければ、sudoがパスワードを記憶していない時、sudoにパスワードを求められるでしょう。
パスワードタイムアウトの延長
デフォルトでは、ユーザがsudoに認証を行うためにパスワードを入力した際、パスワードは5分間記憶されます。もしユーザがこの時間を延長したい場合、sudo -vを実行することでタイムスタンプをリセットし、sudoが再度パスワードを尋ねるまで新たに5分間を得ることができます。
user $
sudo -v
これと逆のことを行うコマンドはsudo -kで、タイムスタンプを削除します。
関連項目
- doas — provides a way to perform commands as another user.
- su — used to adopt the privileges of other users from the system