Gentoo Logo

Gentoo Sudo(ers) ガイド

目次:

1.  Sudoについて

許可の付与

app-admin/sudoパッケージにより、 システム管理者は実行権限を通常持たない他のユーザに、 アプリケーションを複数実行させる許可を与えることができます。 setuidビットをアプリケーションに用いるのとは異なり、 sudoは、あるコマンドを誰が実行できるのか、 また、いつ実行できるのかということに対し、 より細かな制御を与えてくれます。

sudoで、誰が特定のアプリケーションを実行できるかの明確な許可リストを、 作成できます。 もし、setuidビットをセットすれば、 どのユーザでもこのアプリケーションを実行できてしまうでしょう。 (用いられるパーミッションにもよりますが、 特定のグループに所属するユーザについても同様です) ユーザに対し、アプリケーション実行時にパスワードの提示を求めることは可能であり(おそらく、 そうするべきですが)、 ユーザのロケーション−直接システムからログオンしているか、もしくは 遠隔地からSSHを使用してログオンしているか−をベースに、 許可を微調整することさえできるのです。

活動をロギングする

sudoに関する別の利点は、 アプリケーション実行の試み(成功、失敗に関わらず)を記録してくれることです。 あなたが修正するのに10時間かかった致命的なミスを、 誰が行ったものなのかを追跡するのに、これはとても役に立ちます。

Sudoを設定する

sudoの設定は、/etc/sudoersファイルにより管理されます。 このファイルは、nano /etc/sudoersまたはvim /etc/sudoersを介して、 もしくはあなたのお好みのエディタで、 決して編集されてはいけません。このファイルを変更したい場合は、 visudoを使用するようにします。

このツールは、2人のシステム管理者がこのファイルを同時に編集していないことを保障し、 ファイルのパーミッションを維持し、 また構文チェックを行いファイル中に致命的なミスが無いことを確かめてくれます。

このガイドについて

このガイドは、簡単な紹介を目的としています。sudoパッケージは、 このガイドで述べられているよりもずっと強力なものです。 それは、別ユーザとしてファイルを編集したり(sudoedit)、 スクリプト中から実行したり(つまり、バックグラウンドにおいて、 キーボードではなく標準入力からパスワードを読みます)等の機能も持っています。

より詳細な情報は、sudosudoersのマニュアルページを参照して下さい。

2.  Sudoersの構文

基本構文

sudoにおいて、最も難しい部分は、/etc/sudoersの構文になります。 基本的な構文はこのようになります。

コード表示 2.1: /etc/sudoers基本構文

user  host = commands

この構文は、userにより識別され、かつ、システムhostにログオンしたユーザは、 commandsでリストされたどんなコマンドでもrootとして実行できることを、 sudoに伝えています。 より実例を出した方が、わかりやすいかもしれませんね。 システム上にログオンしているのであれば(SSH経由ではなく)、 ユーザswiftemergeの実行を許可してみます。

コード表示 2.2: /etc/sudoersの実例

swift  localhost = /usr/bin/emerge

警告:権限の昇格を許可するアプリケーションの実行を、 ユーザに許可してはいけません。例えば、 rootとしてemergeの実行をユーザに許可することは、 実際には、システムに対するすべてのrootアクセスを与えることになりかねません。 なぜなら、emergeが不正に操作されて、そのユーザに有利になるように 実システムを変更する可能性があるからです。 もし、sudoユーザを信用しないのであれば、 どんな権限も彼らに与えないで下さい。

注意: 訳注:emergeの大部分の作業は、sandboxと呼ばれる /var/tmp/portageで行われるため安全です。 しかし最後に実システムへマージしますので、その時に不正操作される危険性があります。

ユーザ名はグループ名でも置き換えられます - この場合は、 グループ名を%記号で始めなければなりません。 例えば、wheelグループに所属する誰もが、 emergeの実行を許可されるには、このようにします。

コード表示 2.3: emergeの実行をwheelグループメンバーに許可する

%wheel  localhost = /usr/bin/emerge

先ほどの一文を拡張し、 複数のコマンドを許可することもできます。(コマンドごとに一つずつ登録していくのではなくて) 例えば、同じユーザにemergeだけでなく、 ebuildemerge-webrsyncの実行をrootとして許可するには以下のようにします。

コード表示 2.4: 複数のコマンド

swift  localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync

また、そのツール自身ではなく、厳密なコマンドを指定することも可能です。 これは、特定のツールの使用を指定された一連のコマンドオプションのみに制限できるため、とても便利です。 同様に、sudoではシェルスタイルのワイルドカード(またの名をメタキャラクタ、 もしくはglob)をsudoersファイルのパス名、さらにはコマンドライン引数において使用できます。 但し、これは正規表現ではないということには注意して下さい。

それでは、テストしてみましょう。

コード表示 2.5: sudoを使用したシステムアップデートの試み

$ sudo emerge -uDN world

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

Password: (ユーザのパスワードを入力して下さい、rootのではありません!)

sudoが要求するパスワードはユーザ自身のパスワードです。 これにより、あなたがうっかり開いたままにしてしまった端末を、 他の人達が悪用できないことを保障してくれます。

sudoが、${PATH}変数を変更しないことは知っておくべきでしょう。 sudoの後に置いたどんなコマンドでもあなたの環境変数から、 扱われるのです。 ユーザに対し、例えば/sbinにあるツールを実行させたいのであれば、 このように、sudoに対して、絶対パスを与えてあげなくてはいけません。

コード表示 2.6: ツールに対し、絶対パスを使用する

$ sudo /usr/sbin/emerge-webrsync

エイリアスを使用する

より大きな環境においては、すべてのユーザ(または、ホストやコマンド)を、 何度も何度も入力しなくてはいけないのは、気の遠くなる作業になりえます。 /etc/sudoersの管理を簡単にするために、 エイリアスを定義できます。エイリアスを宣言するフォーマットは、 極めてシンプルです。

コード表示 2.7: /etc/sudoersにおいて、エイリアスを宣言する

Host_Alias hostalias = hostname1, hostname2, ...
User_Alias useralias = user1, user2, ...
Cmnd_Alias cmndalias = command1, command2, ...

どの位置でも有効なエイリアスの一つにALLエイリアスがあります。 (エイリアスとエイリアスでないものとをうまく区別できるよう、 エイリアスには大文字の使用を薦めます。)あなたがきっと推測したように、 ALLエイリアスは、あらゆる可能性を含んだ設定に対し指定するエイリアスです。

サンプルでは、ALLエイリアスを使用して、ローカルにログオンしているのであれば、 どのユーザでもshutdownコマンドを実行できるよう許可しています。

コード表示 2.8: どのユーザにもシャットダウンの実行を許可する

ALL  localhost = /sbin/shutdown

次の例では、ユーザswiftに、どこからログインしているかに関わらず、 rootとしてemergeコマンドを実行できるよう許可しています。

コード表示 2.9: ロケーションに関わらず、ユーザにアプリケーションの実行を許可する

swift   ALL = /usr/bin/emerge

より興味深いことは、 管理で使用するアプリケーション(emergeebuildのような)を、 システム上で実行できる一連のユーザを定義したり、 どのユーザ(rootを除いてね!)のパスワードでも変更できる管理者グループを定義することです。

コード表示 2.10: ユーザとコマンドにエイリアスを使用する

User_Alias  SOFTWAREMAINTAINERS = swift, john, danny
User_Alias  PASSWORDMAINTAINERS = swift, 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

非ルートユーザによる実行

ユーザに、別の非ルートユーザとしてアプリケーションを実行させることもできます。 もし、あなたがアプリケーションを別のユーザとして実行していて(例えば、Webサーバ におけるapache)、そのユーザ権限で、 特定のユーザにシステム管理(ゾンビプロセスを終了させたり)をさせたいのであれば、 これはとても興味深いかもしれません。

/etc/sudoers中において、コマンド前の()の間に、 一人または複数のユーザを記載してやります。

コード表示 2.11: 非ルートユーザでの実行構文

users  hosts = (run-as) commands

例えば、swiftkillツールの実行を、 apachegorgユーザとして許可するには、このようにします。

コード表示 2.12: 非ルートユーザでの実行例

Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill

swift   ALL = (apache, gorg) KILL

この設定では、ユーザはsudo -uを実行し アプリケーションを実行したいユーザを選択し、 そのユーザとしてアプリケーションを実行します。

コード表示 2.13: pkillをapacheユーザとして実行

$ sudo -u apache pkill apache

Runas_Alias指示文を使用することで、ユーザ用のエイリアスを設定し、 アプリケーションを実行することもできます。 その使用法は、今までに見てきた他の_Alias指示文と全く同じです。

パスワードとデフォルト設定

デフォルトでは、 sudoはユーザ自身のパスワードを使用して、 ユーザ認証を行います。一旦、パスワードが入力されると、 sudoは5分間、それを記憶しておきます。そのため、 ユーザは自分の仕事に集中でき、パスワードを再入力しなくてすみます。

もちろん、この動作は変更できます。Defaults:指示文を、 /etc/sudoers中に定義し、そのデフォルト動作をユーザ用に、 変えることができます。

例えば、デフォルトの5分を0分(記憶させない)にするには以下のようにします。

コード表示 2.14: タイムアウトの値を変更する

Defaults:swift  timestamp_timeout=0

-1に設定すると、パスワードは無期限(システムがリブートするまで)に記憶されます。

異なる環境では、ユーザ個人のパスワードではなく、 コマンドが実行されるべきユーザのパスワードが要求されることになるかもしれません。 これは、runaspwを使用することで達成されます。以下の例では、 リトライ(sudoが失敗する前に、 ユーザは何回パスワードを入力できるか)の回数もデフォルトの3回ではなく、 2回に設定しています。

コード表示 2.15: ユーザのパスワードではなく、rootのパスワードを要求する

Defaults:john   runaspw, passwd_tries=2

別の興味深い機能に、グラフィカルツールを実行できるよう、 DISPLAY変数をセットしておくことがあげらます。

コード表示 2.16: DISPLAY変数をセットしておく

Defaults:john env_keep=DISPLAY

多数のデフォルト設定を、Defaults:指示文を使って変更できます。 sudoのマニュアルページを開いて、Defaultsを探して下さい。

しかしながら、何があってもパスワードなしで、 ユーザに特定の一連のコマンドを実行させるのを許可したいのであれば、 以下のように、コマンドをNOPASSWD:で始める必要があります。

コード表示 2.17: パスワードを聞かずに、rootとしてemergeの実行を許可する

swift     localhost = NOPASSWD: /usr/bin/emerge

3.  Sudoを使う

特権を表示する

自分自身にどんな権限があるのかを知るには、 sudo -lとします。

コード表示 3.1: 権限を表示する

$ sudo -l
User swift 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に対し認証されれば、 そのことは5分間記憶されます。もし、この期間を延長したければ、 ユーザはsudo -vを実行し、タイムスタンプをリセットすることで、 sudoが、パスワードを問い返す前に、もう5分間延長できます。

コード表示 3.2: パスワードのタイムアウトを延長する

$ sudo -v

その逆はタイムスタンプを短縮することで、sudo -kを使用します。



印刷

ページの更新日 2006年 7月 14日

この翻訳はすでにメンテナンスされていません。

要約: 一部の人たちに対し、すべてのrootアクセスを与えずに、 特定のシステム管理を行わせたい場合は、 sudoの使用は最も良い選択になります。 sudoで、誰が何をできるかを制御できます。 このガイドでは、このすばらしいツールを少しだけ紹介しています。

Sven Vermeulen
Author

村上 卓
翻訳

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.