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 時間掛かった致命的な間違いを、誰がしたかというのを追跡するのに非常に便利です :)
sudo ログは /var/log/auth.log ファイルで確認できるでしょう。
権限の付与
システム管理者は、
app-admin/sudo
パッケージを使うことで他のユーザに、通常実行権限がないアプリケーション(群)を実行させるための権限を与えることができます。アプリケーションの
setuid
ビットとは違って、
sudo
は
誰が'ある特定のコマンドを実行できるか、そして
いつ
できるかといった、より細かな管理を行うことができます。
sudo を使用することで、 誰が あるアプリケーションを使用できるかと行った明確な一覧を作成することができます。もし setuid ビットが実行ファイルに設定されている場合、どのユーザも(あるいは使用されているパーミッション設定によってはある特定のグループのユーザが)そのアプリケーションを実行できます。 sudo を使用することで、ユーザにアプリケーションを実行するためのパスワードを求めることができます(そして多分そうすべきです)。
sudo の設定は /etc/sudoers ファイルによって管理されます。
/etc/sudoers を編集するためには必ず visudo を使用してください。決してこのファイルを、 テキストエディタ 、 シェルリダイレクト 、またはその他の似た方法によって、手動で編集してはいけません。言い換えると、 nano /etc/sudoers 、 vim /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つのファイルを編集する必要があります。
/etc/ldap.conf.sudo
編集が完了したらchmod 400としてください
# 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
/etc/nsswitch.conf
sudoersの行を追加してください
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 の補完を利用したいユーザは、 app-shells/bash-completion パッケージがインストールされていることを確認するべきです。
root
#
emerge --ask app-shells/bash-completion
Zshell での補完
sudo 用の zsh の補完を利用したいユーザは、 app-shells/zsh-completions パッケージをインストールするべきです。
root
#
emerge --ask app-shells/zsh-completions
使い方
特権の列挙
ユーザが現在できることを一覧にして表示するには、 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 で、タイムスタンプを削除します。