.\" Copyright (c) 1994-1996, 1998-2005, 2007-2009 .\" Todd C. Miller .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" Sponsored in part by the Defense Advanced Research Projects .\" Agency (DARPA) and Air Force Research Laboratory, Air Force .\" Materiel Command, USAF, under agreement number F39502-99-1-0512. .\" .\" Japanese Version Copyright (c) 2000-2002 Yuichi SATO .\" and 2009 Yoichi Chonan .\" all rights reserved. .\" Translated Sat Oct 7 14:39:18 JST 2000 .\" by Yuichi SATO .\" Updated & Modified Fri Dec 6 04:40:44 JST 2002 by Yuichi SATO .\" New Translation (sudo-1.6.9p17) Fri Jan 23 10:31:17 JST 2009 .\" by Yoichi Chonan .\" Updated & Modified (sudo-1.7.2p1) Sat Nov 14 21:15:16 JST 2009 .\" by Yoichi Chonan .\" Modified Tue Nov 24 20:00:00 JST 2009 by Yoichi Chonan .\" .\" $Sudo: sudoers.man.in,v 1.80 2009/06/30 12:41:09 millert Exp $ .\" Automatically generated by Pod::Man 2.16 (Pod::Simple 3.05) .\" .\" Standard preamble: .\" ======================================================================== .de Sh \" Subsection heading .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` . ds C' 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "SUDOERS 5" .TH SUDOERS 5 "June 30, 2009" "1.7.2p1" "MAINTENANCE COMMANDS" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "名前" sudoers \- どのユーザが何を実行できるかのリスト .SH "説明" .IX Header "DESCRIPTION" \&\fIsudoers\fR ファイルは二種類のエントリから構成されている。 (要するに変数である) エイリアスと (誰が何を実行できるかを 指定している) ユーザ設定だ。 .IP "[\fB訳注\fR]:" 8 .IX Item "footnote1" 訳者としては、「エイリアス、デフォルト指定、ユーザ設定の三種類の エントリから構成されている」と言った方が実態に合っているのではないかと思う。 .PP 一人のユーザに複数のエントリがマッチするときは、順番に適用される。 複数の指定がマッチしている箇所については、最後にマッチしたものが 使用される (それが一番明示的なマッチだとはかぎらないが)。 .PP 以下では \fIsudoers\fR の文法を拡張 Backus-Naur 記法 (\s-1EBNF\s0) を 使って記述する。\s-1EBNF\s0 がどんなものか知らないからといって、 あきらめないでいただきたい。わりと簡単なものだし、以下に出てくる定義には 詳しい説明を付けておきますから。 .Sh "\s-1EBNF\s0 早わかり" .IX Subsection "Quick guide to EBNF" \&\s-1EBNF\s0 は言語の文法を記述する簡潔で厳密な方法である。 \&\s-1EBNF\s0 の個々の定義は生成規則からできている。たとえば、 .PP .Vb 1 \& シンボル ::= 定義 | 別の定義 1 | 別の定義 2 ... .Ve .PP 個々の生成規則は、ほかの生成規則を参照し、そのようにして言語の文法を 作り上げている。また \s-1EBNF\s0 には以下の演算子が含まれるが、 正規表現で御存じの読者も多いだろう。だが、いわゆる「ワイルドカード」文字と 混同しないでいただきたい。あれは別の意味を持っている。 .ie n .IP "\*(C`?\*(C'" 4 .el .IP "\f(CW\*(C`?\*(C'\fR" 4 .IX Item "?" 直前のシンボル (または、シンボルのグループ) が、あってもなくてもよいことを 意味する。すなわちそのシンボルは、1 回現れてもよいし、1 回も現れないでもよい。 .ie n .IP "\*(C`*\*(C'" 4 .el .IP "\f(CW\*(C`*\*(C'\fR" 4 .IX Item "*" 直前のシンボル (または、シンボルのグループ) が 0 回以上現れる。 .ie n .IP "\*(C`+\*(C'" 4 .el .IP "\f(CW\*(C`+\*(C'\fR" 4 .IX Item "+" 直前のシンボル (または、シンボルのグループ) が 1 回以上現れる。 .PP 丸カッコを使うと、複数のシンボルをグループにまとめることができる。 なお混乱を避けるため、以下の定義で (シンボル名ではなく) 文字どおりの 文字列や記号を示す場合は、それをシングルクォート ('') で囲むことにする。 .Sh "エイリアス" .IX Subsection "Aliases" エイリアスには四種類ある。\f(CW\*(C`User_Alias\*(C'\fR, \&\f(CW\*(C`Runas_Alias\*(C'\fR, \f(CW\*(C`Host_Alias\*(C'\fR, \&\f(CW\*(C`Cmnd_Alias\*(C'\fR である。 .PP .Vb 4 \& Alias ::= \*(AqUser_Alias\*(Aq User_Alias (\*(Aq:\*(Aq User_Alias)* | \& \*(AqRunas_Alias\*(Aq Runas_Alias (\*(Aq:\*(Aq Runas_Alias)* | \& \*(AqHost_Alias\*(Aq Host_Alias (\*(Aq:\*(Aq Host_Alias)* | \& \*(AqCmnd_Alias\*(Aq Cmnd_Alias (\*(Aq:\*(Aq Cmnd_Alias)* \& \& User_Alias ::= NAME \*(Aq=\*(Aq User_List \& \& Runas_Alias ::= NAME \*(Aq=\*(Aq Runas_List \& \& Host_Alias ::= NAME \*(Aq=\*(Aq Host_List \& \& Cmnd_Alias ::= NAME \*(Aq=\*(Aq Cmnd_List \& \& NAME ::= [A\-Z]([A\-Z][0\-9]_)* .Ve .PP 個々のエイリアスの定義は、次の形をとる。 .PP .Vb 1 \& Alias_Type NAME = item1, item2, ... .Ve .PP 上記において、\fIAlias_Type\fR は \f(CW\*(C`User_Alias\*(C'\fR, \&\f(CW\*(C`Runas_Alias\*(C'\fR, \f(CW\*(C`Host_Alias\*(C'\fR, \&\f(CW\*(C`Cmnd_Alias\*(C'\fR のうちの一つである。 \&\f(CW\*(C`NAME\*(C'\fR はアルファベットの大文字、数字、 アンダースコア ('_') からなる文字列であるが、\fB先頭の文字は大文字\fRで なければならない。同じタイプのエイリアス定義を、コロンで (':') つないで、 一行に複数書くこともできる。たとえば、 .PP .Vb 1 \& Alias_Type NAME = item1, item2, item3 : NAME = item4, item5 .Ve .PP 以下では、エイリアスの有効な要素となるものを定義する。 .PP .Vb 2 \& User_List ::= User | \& User \*(Aq,\*(Aq User_List \& \& User ::= \*(Aq!\*(Aq* username | \& \*(Aq!\*(Aq* \*(Aq#\*(Aquid | \& \*(Aq!\*(Aq* \*(Aq%\*(Aqgroup | \& \*(Aq!\*(Aq* \*(Aq+\*(Aqnetgroup | \& \*(Aq!\*(Aq* \*(Aq%:\*(Aqnonunix_group | \& \*(Aq!\*(Aq* User_Alias .Ve .PP \&\f(CW\*(C`User_List\*(C'\fR は一個以上の、ユーザ名、uid ('#' が 頭に付く)、システムグループ名 ('%' が頭に付く) 、ネットグループ名 ('+' が頭に付く)、非 UNIX グループ名 ('%:' が頭に付く)、 \&\f(CW\*(C`User_Alias\*(C'\fR からなる。 リストの各項目の前には一個以上の '!' 演算子を付けてもよい。 奇数個の '!' はその項目の値を否定する。偶数個の場合は互い相殺するだけだ。 .PP ユーザ名、グループ名、ネットグループ名、非 UNIX グループ名は、 ダブルクォートで囲めば、特殊文字をエスケープしないですむ。 ダブルクォートで囲まずに特殊文字を使いたいなら、エスケープした 16 進数を 指定してやればよい。たとえば、スペースなら \ex20 という具合だ。 .PP 非 UNIX グループ名の書式は、利用するサービスの実装によって決まる。たとえば、 \&\s-1Quest Authentication Services\s0 の \s-1AD\s0 バックエンドは、 以下の書式をサポートしている。 .IP "\(bu" 4 同じドメインのグループ: \*(L"Group Name\*(R" .IP "\(bu" 4 任意のドメインのグループ: \*(L"Group Name@FULLY.QUALIFIED.DOMAIN\*(R" .IP "\(bu" 4 グループ \s-1SID:\s0 \*(L"S\-1\-2\-34\-5678901234\-5678901234\-5678901234\-567\*(R" .PP グループ名を囲む引用符は任意であることに注意してほしい。文字列を 引用符で囲まない場合は、スペースや '@' 記号をエスケープするために、 バックスラッシュ (\e) を使わなければならない。 .PP .Vb 2 \& Runas_List ::= Runas_Member | \& Runas_Member \*(Aq,\*(Aq Runas_List \& \& Runas_Member ::= \*(Aq!\*(Aq* username | \& \*(Aq!\*(Aq* \*(Aq#\*(Aquid | \& \*(Aq!\*(Aq* \*(Aq%\*(Aqgroup | \& \*(Aq!\*(Aq* +netgroup | \& \*(Aq!\*(Aq* Runas_Alias .Ve .PP \&\f(CW\*(C`Runas_List\*(C'\fR は \f(CW\*(C`User_List\*(C'\fR に似ている。 違うのは、\f(CW\*(C`User_Alias\*(C'\fR ではなく、 \&\f(CW\*(C`Runas_Alias\*(C'\fR が使えることだ。ユーザ名やグループ名の マッチは文字列として行われることに気を付けてほしい。言い換えると、 二つのユーザ名 (あるいはグループ名) は、かりに同じ uid (gid) を 持っていても、別個のものと見なされるのである。 だから、もし同じ uid を持ったすべてのユーザ名にマッチさせたかったら (たとえば、root と toor がそうだとしよう)、ユーザ名の代わりに uid を 使えばよい (この例なら、#0 である)。 .PP .Vb 2 \& Host_List ::= Host | \& Host \*(Aq,\*(Aq Host_List \& \& Host ::= \*(Aq!\*(Aq* hostname | \& \*(Aq!\*(Aq* ip_addr | \& \*(Aq!\*(Aq* network(/netmask)? | \& \*(Aq!\*(Aq* \*(Aq+\*(Aqnetgroup | \& \*(Aq!\*(Aq* Host_Alias .Ve .PP \&\f(CW\*(C`Host_List\*(C'\fR は一個以上の、ホスト名、\s-1IP\s0 アドレス、 ネットワークアドレス、ネットグループ名 (頭に '+' が付く)、および 他のエイリアスからなる。ここでもまた、'!' 演算子を付けて、項目の値を 否定することができる。ネットワークアドレスにネットマスクを 指定しなかった場合は、\fBsudo\fR がローカルホストの ネットワークインターフェースを一つ一つ参照し、指定された ネットワークアドレスと同じアドレスを持つインターフェースがあれば、 そのネットマスクを使用することになる。ネットマスクの指定は、 標準の \s-1IP\s0 アドレス表記 (たとえば 255.255.255.0 とか ffff:ffff:ffff:ffff:: とか) でもよく、\&\s-1CIDR\s0 表記 (ビット数、 たとえば 24 とか 64 とか) でもよい。ホスト名の一部にシェル風の ワイルドカードを使用することができるが (下記のワイルドカードのセクションを 参照)、使用マシンの \f(CW\*(C`hostname\*(C'\fR コマンドが 完全修飾ドメイン名を返さない場合、ワイルドカードを 利用するには \fIfqdn\fR オプションを使う必要がある。 .PP .Vb 2 \& Cmnd_List ::= Cmnd | \& Cmnd \*(Aq,\*(Aq Cmnd_List \& \& commandname ::= filename | \& filename args | \& filename \*(Aq""\*(Aq \& \& Cmnd ::= \*(Aq!\*(Aq* commandname | \& \*(Aq!\*(Aq* directory | \& \*(Aq!\*(Aq* "sudoedit" | \& \*(Aq!\*(Aq* Cmnd_Alias .Ve .PP \&\f(CW\*(C`Cmnd_List\*(C'\fR は一個以上の、コマンド名、ディレクトリ、 他のエイリアスからなるリストである。コマンド名は絶対パスのファイル名で あり、シェル風のワイルドカードを含んでいても構わない (下記のワイルドカードの セクションを参照)。単にファイル名だけ指定した場合、ユーザはお望みの どんな引き数でも付けてそのコマンドを実行することができる。とは言え、 コマンドライン引き数を (ワイルドカードを含めて) 指定しても構わないし、 また、引き数に \f(CW""\fR を指定して、そのコマンドは \&\fBコマンドライン引き数なし\fRの実行のみが可能だと指示することもできる。 ディレクトリは '/' で終わる絶対パス名である。 \&\f(CW\*(C`Cmnd_List\*(C'\fR に ディレクトリを指定すると、ユーザーはそのディレクトリ内の任意のファイルを 実行できるようになる (だが、そのサブディレクトリにあるファイルは実行できない)。 .PP \&\f(CW\*(C`Cmnd\*(C'\fR がコマンドライン引き数を伴っている場合は、 \&\f(CW\*(C`Cmnd\*(C'\fR 中の引き数は、ユーザがコマンドラインに打ち込む 引き数と正確に一致しなければならない (Cmnd 中の引き数にワイルドカードが あるならば、それがコマンドラインの引き数とマッチしなければならない)。 以下に挙げる文字をコマンド引き数の中で用いるときは、'\e' によって エスケープしなければならないことに注意してほしい。 ',', ':', '=', '\e' が それである。スペシャルコマンド \f(CW"sudoedit"\fR は、ユーザが \&\fBsudo\fR を \fB-e\fR オプション付きで (あるいは、\fBsudoedit\fR という コマンド名で) 実行することを許可するために使用する。この場合、 コマンドライン引き数を取ることができるのは、普通のコマンドとまったく 同様である。 .Sh "デフォルトの指定 (Defaults)" .IX Subsection "Defaults" かなりの設定オプションが、一行以上の \f(CW\*(C`Default_Entry\*(C'\fR 行を 使うことで実行時にデフォルトの値から変更可能だ。その効果の及ぶ範囲は、 任意のホストのすべてのユーザにすることもできるし、ある特定のホストの すべてのユーザ、ある特定のユーザ、ある特定のコマンド、 ある特定のユーザとして実行するコマンドに限定することもできる。 気を付けてほしいのは、コマンドに限定した Defaults 行に コマンドライン引き数まで書くことができないことだ。引き数を指定する必要が ある場合は、\f(CW\*(C`Cmnd_Alias\*(C'\fR を定義して、代わりにそれを 参照すればよい。 .PP .Vb 5 \& Default_Type ::= \*(AqDefaults\*(Aq | \& \*(AqDefaults\*(Aq \*(Aq@\*(Aq Host_List | \& \*(AqDefaults\*(Aq \*(Aq:\*(Aq User_List | \& \*(AqDefaults\*(Aq \*(Aq!\*(Aq Cmnd_List | \& \*(AqDefaults\*(Aq \*(Aq>\*(Aq Runas_List \& \& Default_Entry ::= Default_Type Parameter_List \& \& Parameter_List ::= Parameter | \& Parameter \*(Aq,\*(Aq Parameter_List \& \& Parameter ::= Parameter \*(Aq=\*(Aq Value | \& Parameter \*(Aq+=\*(Aq Value | \& Parameter \*(Aq\-=\*(Aq Value | \& \*(Aq!\*(Aq* Parameter .Ve .PP パラメータは\fBフラグ\fR、\fB整数値\fR、\fB文字列\fR、\fBリスト\fR の どれでもよい。フラグは要するにブーリアン (真偽値) であり、'!' 演算子で off にできる。整数値、文字列、リストのパラメータにも、真偽値として使用して、 それを無効にできるものがいくつか存在する。パラメータの値が複数の単語を 含むときは、値をダブルクオート (\f(CW\*(C`"\*(C'\fR) で囲むとよい。 特殊文字はバックスラッシュ (\f(CW\*(C`\e\*(C'\fR) でエスケープすることが できる。 .PP リストには代入演算子が \f(CW\*(C`\=\*(C'\fR のほかにもう二つある。 \&\f(CW\*(C`+=\*(C'\fR と \f(CW\*(C`\-=\*(C'\fR である。こうした演算子は それぞれリストに付け加えたり、リストから削除したりするのに使用する。 \&\f(CW\*(C`\-=\*(C'\fR 演算子を使って、リストに存在しない要素を 消去しようとしても、エラーにはならない。 .PP Defaults 行の解析は、次の順序で行われる。最初に汎用、Host、User の Defaults が解析され、それから Runas、最後にコマンドの Defaults の順番になる。 .PP Defaults 行で使用できるパラメータのリストについては、 「SUDOERS のオプション」を御覧いただきたい。 .Sh "ユーザの設定 (User Specification)" .IX Subsection "User Specification" .Vb 2 \& User_Spec ::= User_List Host_List \*(Aq=\*(Aq Cmnd_Spec_List \e \& (\*(Aq:\*(Aq Host_List \*(Aq=\*(Aq Cmnd_Spec_List)* \& \& Cmnd_Spec_List ::= Cmnd_Spec | \& Cmnd_Spec \*(Aq,\*(Aq Cmnd_Spec_List \& \& Cmnd_Spec ::= Runas_Spec? Tag_Spec* Cmnd \& \& Runas_Spec ::= \*(Aq(\*(Aq Runas_List? (\*(Aq:\*(Aq Runas_List)? \*(Aq)\*(Aq \& \& Tag_Spec ::= (\*(AqNOPASSWD:\*(Aq | \*(AqPASSWD:\*(Aq | \*(AqNOEXEC:\*(Aq | \*(AqEXEC:\*(Aq | \& \*(AqSETENV:\*(Aq | \*(AqNOSETENV:\*(Aq ) .Ve .PP \&\fBユーザの設定\fRは、あるユーザが指定されたホストで (どのユーザに 変身して) どのコマンドを実行できるかを決定する。デフォルトでは、 コマンドは \fBroot\fR に変身して実行されるが、これはコマンドごとに 変更することができる。 .PP ユーザの設定の基本構造は、「誰が どこで = (誰に変身して) 何を」 である (who where = (as_whom) what)。 構成部分に分けて説明しよう。 .Sh "Runas_Spec (どのユーザやグループに変身できるか)" .IX Subsection "Runas_Spec" \&\f(CW\*(C`Runas_Spec\*(C'\fR は変身の対象となるユーザやグループを 規定している。完全な形の \f(CW\*(C`Runas_Spec\*(C'\fR は、(上で定義して いるように) コロン (':') で区切られ、カッコで囲まれた、二つの \&\f(CW\*(C`Runas_List\*(C'\fR からなっている。 一つ目の \f(CW\*(C`Runas_List\*(C'\fR は、 \&\fBsudo\fR で \fB\-u\fR オプションを使ったときに変身できるユーザを 指している。二番目の方が規定しているのは、\fBsudo\fR の \fB\-g\fR オプションによって指定できるグループのリストだ。 両方の \f(CW\*(C`Runas_List\*(C'\fR が指定されている場合は、 それぞれの \f(CW\*(C`Runas_List\*(C'\fR にリストされているユーザと グループの任意の組み合わせで、コマンドを実行することが可能である。 一つ目の \f(CW\*(C`Runas_List\*(C'\fR だけが指定されているときは、 リスト中のいかなるユーザにでも変身してコマンドを実行できるが、 \&\fB\-g\fR オプションを指定することはできない。 一つ目の \f(CW\*(C`Runas_List\*(C'\fR が空で、二番目だけ指定されている場合は、 \&\fBsudo\fR を実行するユーザの資格で、グループを \&\f(CW\*(C`Runas_List\*(C'\fR にリストされている任意のグループに設定して、 コマンドを実行することができる。\f(CW\*(C`Runas_Spec\*(C'\fR がまったく 指定されていないときは、 \&\fBroot\fR としてコマンドを実行できるが、グループを指定することはできない。 .PP \&\f(CW\*(C`Runas_Spec\*(C'\fR は、それに続くコマンドに対してデフォルトを 定める。それはどういうことかと言うと、次のようなエントリがあったとしよう。 .PP .Vb 1 \& dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm .Ve .PP ユーザ \fBdgb\fR は \fI/bin/ls\fR, \fI/bin/kill\fR, \&\fI/usr/bin/lprm\fR を実行することができる。ただし、\&\fBoperator\fR として実行できるだけだ。たとえば、次のようにである。 .PP .Vb 1 \& $ sudo \-u operator /bin/ls .Ve .PP エントリの後ろの方の \f(CW\*(C`Runas_Spec\*(C'\fR を変更することも可能だ。 上のエントリをこんなふうに書き変えたとしよう。 .PP .Vb 1 \& dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm .Ve .PP すると、ユーザ \fBdgb\fR は、\fI/bin/ls\fR こそ \fBoperator\fR としてだが、 \&\fI/bin/kill\fR や \fI/usr/bin/lprm\fR は \fBroot\fR の資格で 実行できるようになる。 .PP \&\fBdgb\fR が \f(CW\*(C`/bin/ls\*(C'\fR を実行するとき、 変身対象ユーザとグループのどちらでも \fBoperator\fR にできるように、 この記述を拡張することもできる。 .PP .Vb 2 \& dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill, \e \& /usr/bin/lprm .Ve .PP 次の例では、ユーザ \fBtcm\fR が モデムのデバイスファイルにアクセスする コマンドを dialer グループとして実行できるようにしている。 この例では、グループしか指定できないことに注意してほしい。コマンドは ユーザ \fBtcm\fR の資格で実行されるのである。 .PP .Vb 2 \& tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu, \e \& /usr/local/bin/minicom .Ve .Sh "Tag_Spec" .IX Subsection "Tag_Spec" コマンドは 0 個以上のタグを伴うことができる。タグの値としては、 \&\f(CW\*(C`NOPASSWD\*(C'\fR, \f(CW\*(C`PASSWD\*(C'\fR, \&\f(CW\*(C`NOEXEC\*(C'\fR, \f(CW\*(C`EXEC\*(C'\fR, \&\f(CW\*(C`SETENV\*(C'\fR, \f(CW\*(C`NOSETENV\*(C'\fR の六つが可能で ある。ある \f(CW\*(C`Cmnd\*(C'\fR にタグをセットすると、 \&\f(CW\*(C`Cmnd_Spec_List\*(C'\fR 中のそれ以後の \&\f(CW\*(C`Cmnd\*(C'\fR は、反対の意味を持つタグによって変更されないかぎり、 そのタグを継承する (すなわち、\f(CW\*(C`PASSWD\*(C'\fR は \&\f(CW\*(C`NOPASSWD\*(C'\fR を上書きし、\f(CW\*(C`NOEXEC\*(C'\fR は \&\f(CW\*(C`EXEC\*(C'\fR を上書きするわけだ)。 .PP \fI\s-1NOPASSWD\s0 と \s-1PASSWD\s0\fR .IX Subsection "NOPASSWD and PASSWD" .PP デフォルトでは、\fBsudo\fR はコマンドを実行する前に、 ユーザが本人であることを証明するように求める。この振舞いは \&\f(CW\*(C`NOPASSWD\*(C'\fR タグによって変更することができる。 \&\f(CW\*(C`Runas_Spec\*(C'\fR と同様、\f(CW\*(C`NOPASSWD\*(C'\fR タグも \&\f(CW\*(C`Cmnd_Spec_List\*(C'\fR 中のそれに続くコマンドに対して デフォルトを定める。\f(CW\*(C`PASSWD\*(C'\fR の働きは反対であり、 振舞いを元に戻したいときに使える。たとえば、 .PP .Vb 1 \& ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm .Ve .PP とすれば、ユーザ \fBray\fR はマシン rushmore 上で認証をしないでも \&\fBroot\fR として \fI/bin/kill\fR, \fI/bin/ls\fR, \&\fI/usr/bin/lprm\fR を実行できるようになる。もし \fBray\fR が パスワードなしで実行できるコマンドを \fI/bin/kill\fR だけに 絞りたいのなら、エントリはこうなるだろう。 .PP .Vb 1 \& ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm .Ve .PP ただし、ユーザが \fIexempt_group\fR オプションで指定されているグループに 属する場合は、\f(CW\*(C`PASSWD\*(C'\fR タグが効果を持たないことに 注意してほしい。 .PP デフォルトでは、現在使用中のホストに関するユーザのエントリのうちに \&\f(CW\*(C`NOPASSWD\*(C'\fR タグが指定されているものが一つでもあれば、 そのユーザはパスワードなしで \f(CW\*(C`sudo \-l\*(C'\fR を実行できる。 なお、ユーザがパスワードなしで \f(CW\*(C`sudo \-v\*(C'\fR を実行できるのは、 現在使用中のホストに関するそのユーザのエントリのすべてで \&\f(CW\*(C`NOPASSWD\*(C'\fR タグが生きているときのみである。この動作は、 \&\fIverifypw\fR や \fIlistpw\fR オプションによって変更できる。 .PP \fI\s-1NOEXEC\s0 と \s-1EXEC\s0\fR .IX Subsection "NOEXEC and EXEC" .PP \&\fBsudo\fR が \fInoexec\fR サポートつきでコンパイルされ、 下で稼働しているオペレーティングシステムがそれに対応している場合、 \&\f(CW\*(C`NOEXEC\*(C'\fR タグを利用すれば、動的にリンクされた実行ファイルが そこからさらにコマンドを実行するのを防ぐことができる。 .PP 次の例では、ユーザ \fBaaron\fR は \fI/usr/bin/more\fR と \&\fI/usr/bin/vi\fR を実行できるが、シェル・エスケープは利用できない。 .PP .Vb 1 \& aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi .Ve .PP \&\f(CW\*(C`NOEXEC\*(C'\fR がどんなふうに働くのか、お使いのシステムで 利用できるかどうか、などについてさらに詳しく知りたかったら、 「シェル・エスケープを防止する」のセクションを御覧になっていただきたい。 .PP \fI\s-1SETENV\s0 と \s-1NOSETENV\s0\fR .IX Subsection "SETENV and NOSETENV" .PP 上記のタグは \fIsetenv\fR オプションの値をコマンドごとに変更する。 注意すべきは、あるコマンドに対して \f(CW\*(C`SETENV\*(C'\fR が 設定されていると、コマンドラインから設定するどんな環境変数も \fIenv_check\fR, \&\fIenv_delete\fR, \fIenv_keep\fR による規制を受けないということである。 だから、そうした形で環境変数を設定することを許可するのは、 信用できるユーザだけに限るべきだ。なお、マッチするコマンドが \&\fB\s-1ALL\s0\fR だった場合は、暗黙のうちに \f(CW\*(C`SETENV\*(C'\fR タグが そのコマンドに付けられるが、このデフォルトの動作は \&\f(CW\*(C`UNSETENV\*(C'\fR タグを使えば打ち消すことができる。 .Sh "ワイルドカード" .IX Subsection "Wildcards" \&\fIsudoers\fR ファイルでは、ホスト名、コマンドラインのパス名、 コマンドラインの引き数にシェル形式のワイルドカード (メタ文字とか glob キャラクタとも言う) が使用できる。ワイルドカードのマッチングは \&\fB\s-1POSIX\s0\fR の \fIglob\fR\|(3) と \fIfnmatch\fR\|(3) ルーティンを用いて行われる。\fB以下のものは正規表現ではない\fRことに 注意してほしい。 .ie n .IP "\*(C`*\*(C'" 8 .el .IP "\f(CW\*(C`*\*(C'\fR" 8 .IX Item "*" ゼロ個以上の任意の文字にマッチする。 .ie n .IP "\*(C`?\*(C'" 8 .el .IP "\f(CW\*(C`?\*(C'\fR" 8 .IX Item "?" 任意の一文字にマッチする。 .ie n .IP "\*(C`[...]\*(C'" 8 .el .IP "\f(CW\*(C`[...]\*(C'\fR" 8 .IX Item "[...]" 指定された範囲の任意の一文字にマッチする。 .ie n .IP "\*(C`[!...]\*(C'" 8 .el .IP "\f(CW\*(C`[!...]\*(C'\fR" 8 .IX Item "[!...]" 指定された範囲\fB以外\fRの任意の一文字にマッチする。 .ie n .IP "\*(C`\ex\*(C'" 8 .el .IP "\f(CW\*(C`\ex\*(C'\fR" 8 .IX Item "x" \&\*(L"x\*(R" がどんな文字であっても、\*(L"x\*(R" そのものとして 評価する。これは \*(L"*\*(R", \*(L"?\*(R", \*(L"[\*(R", \*(L"}\*(R" といった 特殊文字をエスケープするために使用する。 .PP 使用システムの \fIglob\fR\|(3) や \fIfnmatch\fR\|(3) 関数が \&\s-1POSIX\s0 の文字クラスに対応しているなら、文字クラスも使用できる。 ただし、\f(CW\*(Aq:\*(Aq\fR 文字は、\fIsudoers\fR で特別な意味を 持っているので、エスケープしなければならない。一例を上げると、 .PP .Vb 1 \& /bin/ls [[\e:alpha\e:]]* .Ve .PP 上記は、文字で始まるどんなファイル名にもマッチするだろう。 .PP コマンドのパス名に使われたワイルドカードはフォワードスラッシュ ('/') に\fBマッチしない\fRことに注意してほしい。だが、コマンドライン引き数との マッチングでは、ワイルドカードはスラッシュと\fBしっかりマッチする\fR。 そこで、 .PP .Vb 1 \& /usr/bin/* .Ve .PP というコマンドパスは、\fI/usr/bin/who\fR とマッチするが、 \&\fI/usr/bin/X11/xterm\fR とはマッチしないことになる。 .Sh "ワイルドカード・ルールの例外" .IX Subsection "Exceptions to wildcard rules" 上記ルールには次の例外がある。 .ie n .IP """""" 8 .el .IP "\f(CW``''\fR" 8 .IX Item """""" \&\fIsudoers\fR ファイルのエントリにおいて、空文字列 \f(CW""\fR が唯一 のコマンドライン引き数だった場合は、そのコマンドに\fBいかなる\fR引き数を付 けて実行することも許されないということである。 .Sh "sudoers に他のファイルをインクルードする" .IX Subsection "Including other files from within sudoers" \&\f(CW\*(C`#include\*(C'\fR 命令や \f(CW\*(C`#includedir\*(C'\fR 命令を 使えば、現在解析中の \fIsudoers\fR ファイルに外部にあるほかの \&\fIsudoers\fR ファイルをインクルードすることができる。 .PP この方法を使えば、たとえば、サイト全体で使用する \fIsudoers\fR ファイルの ほかに、マシンごとのローカルな \fIsudoers\fR ファイルを持つことができる。 ここでは、サイト全体の \fIsudoers\fR を \fI/etc/sudoers\fR とし、 マシンごとの方は \fI/etc/sudoers.local\fR とすることにしよう。 \&\fI/etc/sudoers\fR に \fI/etc/sudoers.local\fR をインクルードするには、 \&\fI/etc/sudoers\fR 中に次の行を書き込む。 .Sp .RS 4 \&\f(CW\*(C`#include /etc/sudoers.local\*(C'\fR .RE .PP \&\fBsudo\fR は解析中この行に出会うと、カレントファイル (\fI/etc/sudoers\fR だ) の処理を一時中止し、処理の対象を \&\fI/etc/sudoers.local\fR に切り替える。そして、 \&\fI/etc/sudoers.local\fR の末尾まで達したら、\fI/etc/sudoers\fR の 残りを処理するのだ。インクルードされたファイルがさらに他のファイルを インクルードしてもよい。インクルートのネストには 128 ファイルまでという ハード・リミットがあって、インクルードファイルのループが起きないように なっている。 .PP ファイル名には \f(CW%h\fR エスケープが使える。これはホスト名の短縮形を 示している。たとえば、マシンのホスト名が \*(L"xerxes\*(R" のとき、 .PP \&\f(CW\*(C`#include /etc/sudoers.%h\*(C'\fR .PP と書けば、\fBsudo\fR はファイル \fI/etc/sudoers.xerxes\fR をインクルード することになる。 .PP \&\f(CW\*(C`#includedir\*(C'\fR 命令を使えば、\fIsudo.d\fR ディレクトリを 作っておいて、システムのパッケージ管理者がパッケージをインストールする過程で \&\fIsudoers\fR のルールを記したファイルをそこに入れてやる、といったことが 可能になる。たとえば、次のように書くと、 .PP \&\f(CW\*(C`#includedir /etc/sudoers.d\*(C'\fR .PP \&\fBsudo\fR は \fI/etc/sudoers.d\fR にあるファイルを一つづつ読み込む。 ただし、末尾が \f(CW\*(C`~\*(C'\fR だったり、\f(CW\*(C`.\*(C'\fR 文字を 含んでいたりするファイル名はスキップするが、これは パッケージマネージャや エディタが作った、テンポラリファイルやバックアップファイルを読み込むような 問題を起こさないためである。ファイルは辞書順にソートされて、解析される。 すなわち、\fI/etc/sudoers.d/01_first\fR が \fI/etc/sudoers.d/10_second\fR より前に解析されるということだ。ソートは辞書順であって、数値の順では ないので、\fI/etc/sudoers.d/1_whoops\fR というファイルがあっても、 \&\fI/etc/sudoers.d/10_second\fR \fBより後で\fRロードされることに 注意してほしい。ファイル名の先頭を 0 で埋めて数字の桁を揃えれば、 こうした問題を回避することができる。 .PP 気を付けてほしいが、\f(CW\*(C`#include\*(C'\fR でインクルードされた ファイルとは違って (訳注: \fBvisudo\fR は \fI/etc/sudoers\fR を 編集するとき、\f(CW\*(C`#include\*(C'\fR で指定したファイルがあれば、 続けてそれも編集する)、 \&\fBvisudo\fR が \f(CW\*(C`#includedir\*(C'\fR で指定したディレクトリの ファイルまで編集するのは、シンタクスエラーを含むものがあるときだけである。 とは言え、\fBvisudo\fR を \f(CW\*(C`\-f\*(C'\fR オプション付きで実行して、 ディレクトリ中のファイルを直接編集することは可能だ。 .Sh "ほかの特殊文字と予約語" .IX Subsection "Other special characters and reserved words" パウンド記号 ('#') はコメントを示すのに使用される (例外は、#include 命令の 一部であるときや、ユーザ名に関連して現れ、その後に一個以上の数字が 続くときであり、後者の場合は uid と見なされる)。コメント記号と それに続くテキストは、行末にいたるまで無視される。 .PP 予約語 \fB\s-1ALL\s0\fR は組込みのエイリアスであり、何に対してでも マッチする。\fB\s-1ALL\s0\fR は、\f(CW\*(C`Cmnd_Alias\*(C'\fR, \&\f(CW\*(C`User_Alias\*(C'\fR, \f(CW\*(C`Runas_Alias\*(C'\fR, \&\f(CW\*(C`Host_Alias\*(C'\fR を代わりに使えるところなら、どこでも 使用できる。\fB\s-1ALL\s0\fR という名前のエイリアスを自分で定義しようと してはいけない。組込みのエイリアスの方が、自分で作ったエイリアスより 優先して使われるからだ。\fB\s-1ALL\s0\fR の使用には危険が伴うことが あるのを忘れないでいただきたい。なぜなら、\fB\s-1ALL\s0\fR を コマンドに関して使うと、ユーザにシステム上の\fBどんな\fRコマンドでも 実行することを許してしまうからである。 .PP エクスクラメーションマーク ('!') は、エイリアスでも \&\f(CW\*(C`Cmnd\*(C'\fR の前でも論理 \fInot\fR 演算子として使用できる。 これによってある値を除外することが可能だ。しかしながら、 組込みエイリアス \f(CW\*(C`ALL\*(C'\fR と \f(CW\*(C`!\*(C'\fR を 組み合わせて、「二三のコマンド以外のすべての」コマンドの実行をあるユーザに 許可しようとしても、思いどおりの動きになることはめったにないことに 気を付けてほしい (下記の「セキュリティに関する注意点」を参照)。 .PP 長い行は、行末にバックスラッシュ ('\e') を置けば、継続することができる。 .PP リストにおける要素間やユーザ設定における構文用特殊文字 ('=', ':', '(', ')') の前後に空白文字 (whitespace)を入れることは、 任意である。 .PP 次の文字を単語 (ユーザ名とかホスト名とか) の一部として使うときは、 バックスラッシュ ('\e') でエスケープしなければならない。 \&'@', '!', '=', ':', ',', '(', ')', '\e' がそれである。 .SH "SUDOERS のオプション" .IX Header "SUDOERS OPTIONS" すでに説明したように、\fBsudo\fR の動作は \&\f(CW\*(C`Default_Entry\*(C'\fR 行によって変更することができる。 Defaults に与えることのできるパラメータについて、サポートされているも ののすべてを、タイプ別にまとめて以下に列挙する。 .PP \&\fBフラグ\fR: .IP "always_set_home" 16 .IX Item "always_set_home" これをセットすると、\fBsudo\fR は環境変数 \f(CW\*(C`HOME\*(C'\fR を 変身対象ユーザのホームディレクトリに設定する (\fB\-u\fR オプションが 使用されないかぎり、それは root である)。事実上、暗黙のうちに \fBsudo\fR に \&\fB\-H\fR オプションが常に指定されることになるわけだ。このフラグは デフォルトでは \fIoff\fR である。 .IP "authenticate" 16 .IX Item "authenticate" これをセットすると、ユーザはコマンドの実行を許可される前に、パスワードで (あるいは、ほかの認証方法で) 認証をしなければならない。このデフォルト値は \&\f(CW\*(C`PASSWD\*(C'\fR や \f(CW\*(C`NOPASSWD\*(C'\fR タグで変更できる。 このフラグはデフォルトでは \fIon\fR である。 .IP "closefrom_override" 16 .IX Item "closefrom_override" これをセットすると、ユーザが \fBsudo\fR の \fB\-C\fR オプションを 使用できるようになる。\fB\-C\fR オプションというのは、\fBsudo\fR が 開いたファイルを閉じていくとき、どのファイル・ディスクリプタから クローズしていくかというデフォルトの始点を変更するものだ。このフラグは デフォルトでは \fIoff\fR である。 .IP "env_editor" 16 .IX Item "env_editor" これをセットすると、\fBvisudo\fR はデフォルトのエディタ・リストを 利用する前に、環境変数 \s-1EDITOR\s0 や \s-1VISUAL\s0 の値を 使用するようになる。これがセキュリティホールになりかねないことに 注意してほしい。ユーザが root として任意のコマンドをログに記録されることなく 実行できるようになるからだ。こうした環境変数を利用するときの、 \&\fIenv_editor\fR を有効にするよりも安全な方法は、 \&\fIsudoers\fR ファイルの \f(CW\*(C`editor\*(C'\fR オプションに コロンで区切ったエディタのリストを書いておくことだ。そうすれば、 \&\fBvisudo\fR が \s-1EDITOR\s0 や \s-1VISUAL\s0 を使うのは、 それが \f(CW\*(C`editor\*(C'\fR オプションに指定した値とマッチしたときだけに なる。このフラグはデフォルトでは \fIoff\fR である。 .IP "env_reset" 16 .IX Item "env_reset" これをセットすると、\fBsudo\fR は環境を以下の変数のみを含むように 設定し直す。すなわち、\s-1LOGNAME\s0, \s-1SHELL\s0, \s-1USER\s0, \&\s-1USERNAME\s0 それに \f(CW\*(C`SUDO_*\*(C'\fR である。その後で さらに、\fBsudo\fR を起動するユーザの環境にある変数のうち、 \&\f(CW\*(C`env_keep\*(C'\fR や \f(CW\*(C`env_check\*(C'\fR のリストに マッチするものが追加される。 \f(CW\*(C`env_keep\*(C'\fR や \&\f(CW\*(C`env_check\*(C'\fR のリストにデフォルトでどんな変数が 含まれているかは、root ユーザが \fBsudo\fR を \fI\-V\fR オプション付きで 実行すれば、見ることができる。なお、\fIsudoers\fR ファイルの \&\fIsecure_path\fR オプションが設定されているときは、その値が 環境変数 \f(CW\*(C`PATH\*(C'\fR として使用されることになる。 このフラグはデフォルトでは \fIon\fR である。 .IP "fqdn" 16 .IX Item "fqdn" \&\fIsudoers\fR ファイルで完全修飾ホスト名を使用したかったら、 このフラグをセットするとよい。すなわち、myhost ではなく、 myhost.mydomain.edu を使いたい場合だ。そのときでも、そうしたければ、 短縮形も使える (両方を混ぜて使うことだってできる)。気を付けて ほしいのは、\fIfqdn\fR を 有効にすると、\fBsudo\fR は \s-1DNS\s0 へ 問い合わせをしなければならないので、\s-1DNS\s0 サービスが 稼働していない場合、\fBsudo\fR が使えなくなるかもしれないということだ (たとえば、マシンがネットワークに接続していない場合)。 もう一つ気を付けるべきことがある。 \&\s-1DNS\s0 が知っているホストの正式名を使わなければならないということだ。 言い換えれば、ホストのエイリアス (\f(CW\*(C`CNAME\*(C'\fR のエントリ) を 使ってはいけない。パフォーマンスの問題もあるし、\s-1DNS\s0 からエイリアスを すべて取得する方法はないからでもある。マシンのホスト名が \&(\f(CW\*(C`hostname\*(C'\fR コマンドで返ってくるものが) すでに 完全修飾名になっているならば、\fIfqdn\fR をセットする必要はないだろう。 このフラグはデフォルトでは \fIoff\fR である。 .IP "ignore_dot" 16 .IX Item "ignore_dot" これをセットすると、環境変数 \f(CW\*(C`PATH\*(C'\fR 中に '.' や '' (カレントディレクトリ) があっても、\fBsudo\fR はそれを無視する。 \&\f(CW\*(C`PATH\*(C'\fR そのものは変更されない。このフラグは デフォルトでは \fIoff\fR である。 .IP "ignore_local_sudoers" 16 .IX Item "ignore_local_sudoers" \&\s-1LDAP\s0 の方でこのフラグをセットすると、\fI/etc/sudoers\fR の 解析がスキップされる。このフラグは、ローカルにある sudoers ファイルの 使用を禁じて、\s-1LDAP\s0 のみを使うようにしたい企業のためにある。 たちの悪いオペレータが \fI/etc/sudoers\fR に手を加えて自分の権限を 増やそうとしても、そうした悪だくみは阻止されるわけだ。このオプションが 設定されているときは、\fI/etc/sudoers\fR ファイルは存在する必要すらない。 このオプションは、マッチする \s-1LDAP\s0 の具体的なエントリが 一つもなかったときに、どう振舞うべきかを \fBsudo\fR に指示するものだから、 これを指定した sudoOption は \f(CW\*(C`cn=defaults\*(C'\fR のセクションに なければ意味がない。このフラグはデフォルトでは \fIoff\fR である。 .IP "insults" 16 .IX Item "insults" これをセットすると、不正なパスワードが入力されたとき、 \&\fBsudo\fR がユーザに悪態をつく。このフラグはデフォルトでは \fIoff\fR である。 .IP "log_host" 16 .IX Item "log_host" これをセットすると、ホスト名が (syslog 経由ではない) \fBsudo\fR の ログファイルに記録されることになる。このフラグはデフォルトでは \fIoff\fR である。 .IP "log_year" 16 .IX Item "log_year" これをセットすると、四桁の年が (syslog 経由ではない) \fBsudo\fR の ログファイルに記入されることになる。このフラグはデフォルトでは \fIoff\fR である。 .IP "long_otp_prompt" 16 .IX Item "long_otp_prompt" \&\fBS/Key\fR や \fB\s-1OPIE\s0\fR のような One Time Password (\s-1OTP\s0) スキームを採用しているときにこれを有効にすると、チャレンジを ローカルウィンドウにカット・アンド・ペーストしやすいように、 二行のプロンプトが使用される。デフォルトのプロンプトほど見栄えはよくないが、 こちらの方が便利だと思う人もいる。デフォルトではこのフラグは \fIoff\fR である。 .IP "mail_always" 16 .IX Item "mail_always" ユーザが \fBsudo\fR を実行するたびに、\fImailto\fR ユーザにメールを送る。 このフラグはデフォルトでは \fIoff\fR である。 .IP "mail_badpass" 16 .IX Item "mail_badpass" \&\fBsudo\fR を実行するユーザが正しいパスワードを入力しないと、 \&\fImailto\fR ユーザにメールを送る。このフラグはデフォルトでは \&\fIoff\fR である。 .IP "mail_no_host" 16 .IX Item "mail_no_host" これをセットすると、\fBsudo\fR を起動したユーザが \fIsudoers\fR ファイルに 存在するものの、使用中のホストでコマンドの実行を許可されていない場合、 \&\fImailto\fR ユーザにメールを送付する。このフラグはデフォルトでは \&\fIoff\fR である。 .IP "mail_no_perms" 16 .IX Item "mail_no_perms" これをセットすると、\fBsudo\fR を起動したユーザが \fBsudo\fR の使用を 許可されているが、実行しようとしているコマンドが \fIsudoers\fR ファイルの そのユーザのエントリに登録されていないか、明示的に禁止されている場合、 \&\fImailto\fR ユーザにメールを送付する。このフラグはデフォルトでは \&\fIoff\fR である。 .IP "mail_no_user" 16 .IX Item "mail_no_user" これをセットすると、\fBsudo\fR を起動したユーザが \fIsudoers\fR ファイルに 記載されていない場合、\fImailto\fR ユーザにメールを送付する。 このフラグはデフォルトでは \fIon\fR である。 .IP "noexec" 16 .IX Item "noexec" これをセットすると、\fBsudo\fR を通して実行されるすべてのコマンドが、 \&\f(CW\*(C`EXEC\*(C'\fR タグで無効にされないかぎり、あたかも \&\f(CW\*(C`NOEXEC\*(C'\fR タグが設定されているかのごとく振舞うようになる。 上述の「\fI\s-1NOEXEC\s0 と \s-1EXEC\s0\fR」の説明、および、このマニュアルの 終わりの方にある「シェル・エスケープを防止する」というセクションを 参照してほしい。このフラグはデフォルトでは \fIoff\fR である。 .IP "path_info" 16 .IX Item "path_info" 通常 \fBsudo\fR は、環境変数 \f(CW\*(C`PATH\*(C'\fR 中にコマンドが 見付からないと、ユーザにそのことを知らせる。これを利用すれば、 一般ユーザにアクセス権のない実行ファイルのありかについて情報を 収集できるという理由から、この動作を無効にしたいサイトもあるかもしれない。 その場合の欠点は、実行ファイルが単にユーザの \f(CW\*(C`PATH\*(C'\fR 中に なかっただけの場合でも、実行の許可がないと \fBsudo\fR がユーザに告げる ことになって、実情がわかりにくいかもしれないことである。このフラグは デフォルトでは \fIon\fR である。 .IP "passprompt_override" 16 .IX Item "passprompt_override" 通常、\fIpassprompt\fR オプションによって指定されたパスワードプロンプトが 使用されるのは、\s-1PAM\s0 のようなシステムが用意している パスワードプロンプトが \*(L"Password:\*(R" という文字列にマッチしている ときだけである。\fIpassprompt_override\fR をセットすると、 \&\fIpassprompt\fR が無条件で使われることになる。このフラグは デフォルトでは \fIoff\fR である。 .IP "preserve_groups" 16 .IX Item "preserve_groups" デフォルトでは、\fBsudo\fR は所属グループの初期値として、変身対象ユーザが 所属しているグループのリストを設定する。 \fIpreserve_groups\fR を セットすると、\fBsudo\fR を実行するユーザの所属グループのリストが、 変更されずにそのまま維持される。とは言え、実グループ ID や 実効グループ ID が変身対象ユーザのそれに設定されることに変わりはない。 このフラグはデフォルトでは \fIoff\fR である。 .IP "pwfeedback" 16 .IX Item "pwfeedback" ほかのたいていの Unix プログラムと同様、\fBsudo\fR はパスワードを 読み込むとき、デフォルトでは、ユーザが Return (または Enter) キーを 押すまで、エコーを off にする。この動作にとまどうユーザが存在する。 彼らには \fBsudo\fR が急に反応しなくなったように見えるのだ。 \&\fIpwfeedback\fR をセットすると、ユーザがキーを押すたびに、\fBsudo\fR が 目に見える反応を返すようになる。これには、セキュリティ上の問題が あることに注意してほしい。横で見ている人が、打ち込まれたパスワードの 文字数を特定することができるかもしれないのだ。このフラグはデフォルトでは \&\fIoff\fR である。 .IP "requiretty" 16 .IX Item "requiretty" これをセットすると、\fBsudo\fR が実行されるのは、ユーザが実際の tty に ログインしたときだけになる。すなわち、\fBsudo\fR を実行できるのは、 ログイン・セッションからだけであって、 \&\fIcron\fR\|(8) や cgi-bin スクリプトといった、ほかの方法を介して実行する ことはできないということだ。このフラグは、デフォルトでは \fIoff\fR である。 .IP "root_sudo" 16 .IX Item "root_sudo" これをセットすると、root も \fBsudo\fR を実行できるようになる。 このフラグを無効にすると、ユーザがたとえば \f(CW"sudo sudo /bin/sh"\fR と いったように \fBsudo\fR コマンドを\fB連鎖的に\fR使って、ルートシェルを 獲得することができなくなる。ところで、 \&\fIroot_sudo\fR が off だと、root が \fBsudoedit\fR まで実行できなくなる ことに注意してほしい。 \&\fIroot_sudo\fR を無効にしても、セキュリティが実際に向上するわけではない。 このフラグが存在しているのは、もっぱら歴史的な理由からなのだ。 このフラグはデフォルトでは \fIon\fR である。 .IP "rootpw" 16 .IX Item "rootpw" これをセットすると、\fBsudo\fR はプロンプトで、起動したユーザの パスワードではなく、root のパスワードを要求するようになる。 このフラグはデフォルトでは \fIoff\fR である。 .IP "runaspw" 16 .IX Item "runaspw" これをセットすると、\fBsudo\fR はプロンプトで、起動したユーザの パスワードではなく、\fIsudoers\fR ファイルの \fIrunas_default\fR オプションが 定義しているユーザーの (デフォルトでは \f(CW\*(C`root\*(C'\fR である) パスワードを要求する。このフラグはデフォルトでは \fIoff\fR である。 .IP "set_home" 16 .IX Item "set_home" これがセットされているとき、\fBsudo\fR を \fB\-s\fR オプション付きで 起動すると、環境変数 \f(CW\*(C`HOME\*(C'\fR が変身対象ユーザの (\fB\-u\fR オプションが使用されないかぎり、それは root である) ホームディレクトリに設定される。すなわち、 \fB\-s\fR オプションが \&\fB\-H\fR オプションを事実上兼ねることになるわけだ。このフラグは デフォルトでは \fIoff\fR である。 .IP "set_logname" 16 .IX Item "set_logname" 通常 \fBsudo\fR は環境変数 \f(CW\*(C`LOGNAME\*(C'\fR, \&\f(CW\*(C`USER\*(C'\fR, \f(CW\*(C`USERNAME\*(C'\fR を 変身対象ユーザの名前 (\fB-u\fR オプションが指定されていない場合、 普通は root) にセットする。しかし、プログラムによっては (たとえば、 \&\s-1RCS\s0 リビジョンコントロールシステムがその一つだが) ユーザが 実際には誰であるかを判定するのに \f(CW\*(C`LOGNAME\*(C'\fR を 使用していることがあるので、この振舞いを変更することが望ましい場合もある。 set_logname オプションに '!' を付けて否定することで、それができる。 なお \fIenv_reset\fR オプションを無効にしていない場合、 \&\fIenv_keep\fR リストの項目が \fIset_logname\fR による値を 上書きすることになるので、注意してほしい。このフラグはデフォルトでは \&\fIon\fR である。 .IP "setenv" 16 .IX Item "setenv" これをセットすると、ユーザがコマンドラインから \fIenv_reset\fR オプションを 無効にできるようになる。さらに、コマンドラインから設定する環境変数が \&\fIenv_check\fR, \fIenv_delete\fR, \fIenv_keep\fR による制限を 受けなくなる。それ故、そのようなやり方で変数を設定することを 許可するのは、信用できるユーザのみに限るべきだ。このフラグは デフォルトでは \fIoff\fR である。 .IP "shell_noargs" 16 .IX Item "shell_noargs" これがセットされているとき、\fBsudo\fR を引き数なしで起動すると、 \&\fBsudo\fR は \fB\-s\fR オプションが指定されたかのように振舞う。 すなわち、root ユーザとしてシェルを実行するわけだ (シェルは、 環境変数 \f(CW\*(C`SHELL\*(C'\fR がセットされていれば、それによって決まるし、 セットされていなければ、\fBsudo\fR を起動したユーザの /etc/passwd エントリに 登録されたものになる)。このフラグはデフォルトでは \fIoff\fR である。 .IP "fast_glob" 16 .IX Item "fast_glob" 通常 \fBsudo\fR はパス名のマッチングをするとき、\fIglob\fR\|(3) 関数を 使用して、シェル・スタイルのワイルドカード展開 (glob) を行う。しかし、 \&\fIglob\fR\|(3) はファイルシステムにアクセスするので、指定パターンに よっては、作業を完了するまでに時間がかかることがある。 必要な時にマウントするようになっている (つまりオートマウントの) ネットワーク・ファイル・システムを参照するときは、とりわけ時間がかかる。 \&\fIfast_glob\fR オプションを指定すると、\fBsudo\fR が \&\fIfnmatch\fR\|(3) 関数を使うようになるが、こちらの関数はマッチングの際に ファイルシステムにアクセスしない。\fIfast_glob\fR の欠点は、 \&\fI./ls\fR や \fI../bin/ls\fR のような相対パスに対するマッチが できないことである。このフラグはデフォルトでは \fIoff\fR である。 .IP "stay_setuid" 16 .IX Item "stay_setuid" 通常 \fBsudo\fR がコマンドを実行するとき、実 UID と実効 UID は 変身対象ユーザ (デフォルトでは root) のものにセットされる。このオプションは その振舞いを変更して、\fBsudo\fR を起動したユーザの \s-1UID\s0 が、 そのまま実 \s-1UID\s0 として残るようにする。言い換えると、\fBsudo\fR が setuid ラッパーとして動作するようになるわけだ。プログラムを setuid で 動かすと、危険をもたらしかねないという理由から、ある種の機能を 使えないようにしているシステムでは、このオプションが役に立つかもしれない。 このオプションは、 \fIsetreuid()\fR 関数なり \fIsetresuid()\fR 関数なりを 持っているシステムでのみ有効である。 このフラグはデフォルトでは \fIoff\fR である。 .IP "targetpw" 16 .IX Item "targetpw" これをセットすると、\fBsudo\fR はプロンプトで、起動したユーザのパスワード ではなく、\fB\-u\fR オプションで指定されたユーザ (デフォルトでは root) の パスワードを要求する。この設定をすると、\fB\-u\fR オプションの引き数として、 passwd データベースに登録されていない uid が使えなくなることに注意してほしい。 このフラグはデフォルトでは \fIoff\fR である。 .IP "tty_tickets" 16 .IX Item "tty_tickets" これをセットすると、ユーザは tty ごとに認証をしなければならなくなる。 \&\fBsudo\fR は通常、チケットディレクトリ (訳注:たとえば /var/run/sudo) にある、\fBsudo\fR を実行しているユーザと同じ名前のディ レクトリを認証に使用する。しかし、このフラグが有効になっている場合は、 そのディレクトリにある、ユーザがログインしている tty に対応する名前の ファイルを使用することになるのだ。このフラグはデフォルトでは \fIoff\fR である。 .IP "umask_override" 16 .IX Item "umask_override" これをセットすると、\fBsudo\fR は umask を \fIsudoers\fR の umask オプションで指定されたとおりの値に、変更を加えることなく設定する。 このことによって、ユーザ自身の umask 値よりもっと緩やかな umask 値を \&\fIsudoers\fR で指定することが可能になる。\fBsudo\fR の昔の動作と 同じになるわけだ。 \&\fIumask_override\fR をセットしない場合、現在の \fBsudo\fR は umask を、 ユーザの umask 値と \fIsudoers\fR で指定した umask 値とのビット和に 設定することになっている。このフラグはデフォルトでは \fIoff\fR である。 .\" .IP "use_loginclass" 16 .\" .IX Item "use_loginclass" .\" If set, \fBsudo\fR will apply the defaults specified for the target user's .\" login class if one exists. Only available if \fBsudo\fR is configured with .\" the \-\-with\-logincap option. This flag is \fIoff\fR by default. .\" これをセットすると、\fBsudo\fR は、変身対象ユーザのログインクラスが存 .\" 在するならば、それに対して指定されたデフォルトの値を使うことになる。こ .\" のフラグは、\fBsudo\fR を \-\-with\-logincap オプションを付けて .\" configure したときのみ利用することができる。このフラグはデフォルトでは .\" \&\fIoff\fR である。 .IP "visiblepw" 16 .IX Item "visiblepw" デフォルトでは、ユーザがパスワードを入力しなければならないときに、 使用しているターミナルでエコーの抑制ができなかったら、 \&\fBsudo\fR は実行を拒否するようになっている。これに対し、 \&\fIvisiblepw\fR フラグが設定されていると、パスワードがスクリーンに 表示されてしまう場合でも、\fBsudo\fR はプロンプトを出して、パスワードを 求める。この動作によって、 \&\fIrsh\fR\|(1) は tty を割り当てないにもかかわらず、 \&\f(CW"rsh somehost sudo ls"\fR といった操作の実行が可能になるわけだ。 このフラグはデフォルトでは \fIoff\fR である。 .PP \&\fB整数\fR: .IP "closefrom" 16 .IX Item "closefrom" \&\fBsudo\fR はコマンドを実行する前に、標準入力、標準出力、標準エラー (すなわち、ファイルディスクリプタ 0\-2 である) を除いて、 オープンしたすべてのファイル・ディスクリプタをクローズする。 \&\fIclosefrom\fR オプションを使用すると、0\-2 以外の どのファイル・ディスクリプタからクローズして行くかを指定することができる。 デフォルトは \f(CW3\fR である。 .IP "passwd_tries" 16 .IX Item "passwd_tries" \&\fBsudo\fR が「失敗」をログに記録して終了する前に、ユーザがパスワードを 入力できる回数。デフォルトは \f(CW\*(C`3\*(C'\fR。 .PP \&\fB真偽値としても使用できる整数\fR: .IP "loglinelen" 16 .IX Item "loglinelen" \&\fBsudo\fR 用ログファイルの一行あたりの文字数。この値は、ログファイルを 見やすくするために改行する位置を決めるのに使用される。この値は、 syslog 経由のログファイルには影響せず、直接ファイルにログを書き出すときのみ 効果がある。デフォルトは \f(CW\*(C`80\*(C'\fR である (改行をしないように するには、値を 0 にするか、頭に '!' を付けて、このオプションを否定する)。 .IP "passwd_timeout" 16 .IX Item "passwd_timeout" \&\fBsudo\fR のパスワードプロンプトが時間切れになるまでの分単位の時間。 デフォルトは \f(CW\*(C`5\*(C'\fR である。これを \f(CW0\fR にセットする と、パスワードプロンプトが時間切れなしになる。 .IP "timestamp_timeout" 16 .IX Item "timestamp_timeout" \&\fBsudo\fR がパスワードを再び要求するようになるまでの時間を分単位で 指定する。デフォルトでは \f(CW\*(C`5\*(C'\fR である。これを \f(CW0\fR に セットすると、毎回パスワードを要求するようになる。\f(CW0\fR より小さい値に セットした場合は、ユーザのタイムスタンプが期限切れになることがない。 ユーザが \f(CW\*(C`sudo \-v\*(C'\fR と \f(CW\*(C`sudo \-k\*(C'\fR を 実行することによって、タイムスタンプを自分で作ったり、消したりできるように したかったら、この手を使えばよい。 .IP "umask" 16 .IX Item "umask" コマンドを実行しているときに使用する umask 値。ユーザの umask 値をそのまま 使いたかったら、'!' を頭に付けて、このオプションを否定するか、0777 に セットする。このオプションの値が 0777 以外の場合、実際に使用される umask 値は、ユーザの umask 値と umask オプションで指定する umask 値との ビット和になる。そのことによって、\fBsudo\fR がコマンドを実行するときの umask 値が、ユーザの umask 値より低くならないようになっているわけだ。 なお、umask オプションのデフォルトの値は、\f(CW\*(C`0022\*(C'\fR である。 \&\s-1PAM\s0 を使用しているシステムでは、 \s-1PAM\s0 のデフォルト設定で umask 値を指定することができるが、その場合は、それが \fIsudoers\fR で 指定した値を上書きすることに注意してほしい。 .PP \&\fB文字列\fR: .IP "badpass_message" 16 .IX Item "badpass_message" ユーザが不正なパスワードを入力したときに表示するメッセージ。 \&\fIinsults\fR フラグが有効になっていないかぎり、デフォルトは 「\f(CW\*(C`Sorry, try again.\*(C'\fR」である。 .IP "editor" 16 .IX Item "editor" \&\fBvisudo\fR で使用できるエディタをコロン (':') で区切ったリスト。 \&\fBvisudo\fR は、可能ならば、ユーザの \s-1EDITOR\s0 環境変数と一致し たエディタを選択する。それができないときは、このリストにあるエディタで、 実際に存在し、かつ実行可能な最初のエディタを使用する。デフォルトは使用 システムにおける vi のパスである。 .IP "mailsub" 16 .IX Item "mailsub" \&\fImailto\fR ユーザに送付するメールの件名。エスケープ文字 \f(CW%h\fR はマシンのホスト名に展開される。デフォルトは「\f(CW\*(C`*** SECURITY information for %h ***\*(C'\fR」。 .IP "noexec_file" 16 .IX Item "noexec_file" ライブラリ関数 \fIexecv()\fR, \&\fIexecve()\fR, \fIfexecve()\fR の ダミー版 (エラーを返すだけの関数) が入っている共有ライブラリのパス。 これは、\f(CW\*(C`LD_PRELOAD\*(C'\fR やそれに相当するものを サポートしているシステムで \fInoexec\fR 機能を実現するために使用される。 デフォルトでは \fI/usr/local/libexec/sudo_noexec.so\fR になっている。 .IP "passprompt" 16 .IX Item "passprompt" パスワードを要求するときに使用するデフォルトのプロンプト。\fB-p\fR オ プションや環境変数 \f(CW\*(C`SUDO_PROMPT\*(C'\fR によって変更すること ができる。以下のパーセント (`\f(CW\*(C`%\*(C'\fR') エスケープが使用で きる。 .RS 16 .ie n .IP "%H" 4 .el .IP "\f(CW%H\fR" 4 .IX Item "%H" ドメイン名付きのローカルホスト名に展開 (マシンのホスト名が完全修飾名か、 \&\fIfqdn\fR オプションがセットされている場合に有効) .ie n .IP "%h" 4 .el .IP "\f(CW%h\fR" 4 .IX Item "%h" ドメイン名なしのローカルホスト名に展開 .ie n .IP "%p" 4 .el .IP "\f(CW%p\fR" 4 .IX Item "%p" パスワードを要求されているユーザ名に展開 (\fIsudoers\fR ファイルの \&\fIrootpw\fR, \fItargetpw\fR, \fIrunaspw\fR フラグを尊重する) .ie n .IP "%U" 4 .el .IP "\f(CW%U\fR" 4 .IX Item "%U" 変身対象ユーザの (デフォルトでは root) ログイン名に展開 .ie n .IP "%u" 4 .el .IP "\f(CW%u\fR" 4 .IX Item "%u" \&\fBsudo\fR を起動するユーザのログイン名に展開 .ie n .IP "\*(C`%%\*(C'" 4 .el .IP "\f(CW\*(C`%%\*(C'\fR" 4 .IX Item "%%" 連続した二個の \f(CW\*(C`%\*(C'\fR は、一個の \f(CW\*(C`%\*(C'\fR 文字 そのものを意味する .RE .RS 16 .Sp デフォルトの値は「\f(CW\*(C`Password:\*(C'\fR」である。 .RE .\" .IP "role" 16 .\" .IX Item "role" .\" The default SELinux role to use when constructing a new security .\" context to run the command. The default role may be overridden on .\" a per-command basis in \fIsudoers\fR or via command line options. .\" This option is only available whe \fBsudo\fR is built with SELinux support. .\" コマンドを実行するために SELinux の新しいセキュリティ・コンテキストを .\" 構成するとき、使用するデフォルトのロール。デフォルトのロールは、 .\" \&\fIsudoers\fR ファイルや、コマンドラインオプションを使って、コマンド .\" ごとに変更することができる。このオプションが利用できるのは、\fBsudo\fR .\" が SELinux サポートつきで作成されたときだけである。 .IP "runas_default" 16 .IX Item "runas_default" コマンドラインで \fB-u\fR オプションが指定されていないときの、デフォルトの 変身対象ユーザ。デフォルトでは \f(CW\*(C`root\*(C'\fR になっている。 \fIrunas_default\fR をセットするなら、\f(CW\*(C`Runas_Alias\*(C'\fR を 指定するよりも前にやらなければならないことに注意すること。 .IP "syslog_badpri" 16 .IX Item "syslog_badpri" ユーザが認証に失敗したときに使用する syslog の優先順位 (priority)。デ フォルトでは \f(CW\*(C`alert\*(C'\fR になっている。 .IP "syslog_goodpri" 16 .IX Item "syslog_goodpri" ユーザが認証に成功したときに使用する syslog の優先順位 (priority)。デ フォルトでは \f(CW\*(C`notice\*(C'\fR になっている。 .IP "sudoers_locale" 16 .IX Item "sudoers_locale" sudoers ファイルを解析するときに使用するロケール。ロケールの変更は、 sudoers の解釈に影響があるかもしれないので、注意してほしい。 デフォルトでは \f(CW"C"\fR になっている。 .IP "timestampdir" 16 .IX Item "timestampdir" \&\fBsudo\fR がタイムスタンプ・ファイルを置くディレクトリ。デフォルト は \fI/var/run/sudo\fR である。 .IP "timestampowner" 16 .IX Item "timestampowner" タイムスタンプ・ディレクトリとそこに置かれるタイムスタンプの所有者。デ フォルトは \f(CW\*(C`root\*(C'\fR である。 .\" .IP "type" 16 .\" .IX Item "type" .\" The default SELinux type to use when constructing a new security .\" context to run the command. The default type may be overridden on .\" a per-command basis in \fIsudoers\fR or via command line options. .\" This option is only available whe \fBsudo\fR is built with SELinux support. .\" コマンドを実行するために SELinux の新しいセキュリティ・コンテキストを .\" 構成するとき、使用するデフォルトのタイプ。デフォルトのタイプは、 .\" \&\fIsudoers\fR ファイルや、コマンドラインオプションを使って、コマンド .\" ごとに変更することができる。このオプションが利用できるのは、\fBsudo\fR .\" が SELinux サポートつきで作成されたときだけである。 .PP \&\fB真偽値としても使用できる文字列\fR: .IP "askpass" 12 .IX Item "askpass" \&\fIaskpass\fR で指定するのは、ヘルパー・プログラムの絶対パスである。 このヘルパー・プログラムは、ターミナルを利用できないときに、 ユーザのパスワードを読み込むために使用する。たとえば、\fBsudo\fR が (テキストベースではなく) グラフィカルなアプリケーションから実行される といった場合だ。\fIaskpass\fR で指定されたヘルパー・プログラムは、 渡された引き数をプロンプトとして表示し、ユーザのパスワードを標準出力に 書き出すべきである。 \&\fIaskpass\fR の値は、環境変数 \f(CW\*(C`SUDO_ASKPASS\*(C'\fR で 上書きすることができる。 .IP "env_file" 12 .IX Item "env_file" \&\fIenv_file\fR オプションでファイルの絶対パスを指定すると、 実行するプログラムの環境として設定する変数をそのファイルに格納して おくことができる。このファイルのエントリは \f(CW\*(C`VARIABLE=value\*(C'\fR か \f(CW\*(C`export VARIABLE=value\*(C'\fR の形でなければならない。 変数の値をシングルクォートやダブルクォートで囲んでもよい。 このファイルに含まれる変数は、\fIenv_keep\fR や \fIenv_check\fR のような \&\fBsudo\fR のほかの環境設定の影響を受ける。 .IP "exempt_group" 12 .IX Item "exempt_group" このグループのユーザはパスワードの入力や \fIsecure_path\fR による \&\s-1PATH\s0 の限定を免除されている。このオプションはデフォルトでは セットされていない。 .IP "lecture" 12 .IX Item "lecture" \&\fBsudo\fR はパスワードプロンプトに添えて簡単な訓戒を表示することが できる。このオプションはその訓戒をいつ表示するかを決定する。以下の値が 可能である。 .RS 12 .IP "always" 8 .IX Item "always" いつでも必ず訓戒を表示する .IP "never" 8 .IX Item "never" 訓戒を一切表示しない。 .IP "once" 8 .IX Item "once" ユーザがはじめて \fBsudo\fR を実行したときだけ表示する。 .RE .RS 12 .Sp 値を指定しないと、\fIonce\fR を指定したことになる。頭に '!' を付けて、 このオプションを否定すると、値に \fInever\fR が使用される。 デフォルトの値は \fIonce\fR である。 .RE .IP "lecture_file" 12 .IX Item "lecture_file" 標準の訓戒の代わりに使用する \fBsudo\fR の訓戒を書き込んだファイルがあるなら、 \&\fIlecture_file\fR でそのパスを指定する。\fBsudo\fR はデフォルトでは、 プログラムに埋め込まれた訓戒を使用する。 .IP "listpw" 12 .IX Item "listpw" このオプションは、\fBsudo\fB を\fB\ -l\fR オプション付きで実行したとき、 ユーザがパスワードを要求されるのは、どんな場合かを決定する。 以下のような値が可能である。 .RS 12 .IP "all" 8 .IX Item "all" パスワードを入力しないですむためには、\fIsudoers\fR ファイルの使用中の ホストに対する当該ユーザのエントリのすべてに \&\f(CW\*(C`NOPASSWD\*(C'\fR タグが設定されていなければならない。 .IP "always" 8 .IX Item "always" ユーザは \fB\-l\fR オプションを使用する際に必ずパスワードを入力しなければ ならない。 .IP "any" 8 .IX Item "any" パスワードを入力しないですむためには、\fIsudoers\fR ファイルの使用中の ホストに対する当該ユーザのエントリの少なくとも一つに \&\f(CW\*(C`NOPASSWD\*(C'\fR タグが設定されていなければならない。 .IP "never" 8 .IX Item "never" ユーザは \fB\-l\fR オプションを使用する際にパスワードを入力する必要が まったくない。 .RE .RS 12 .Sp 値を指定しないと、値は \fIany\fR だと見なされる。'!' を頭に付けて、 このオプションを否定すると、値に \fInever\fR が使われることになる。 デフォルトは \fIany\fR である。 .RE .IP "logfile" 12 .IX Item "logfile" \&\fBsudo\fR のログファイルのパス (syslog 経由のログファイルではない)。 パスを指定すると、ファイルへのロギングが on になり、 '!' を頭に付けて、 このオプションを否定すると、off になる。デフォルトでは、\fBsudo\fR は syslog 経由でログを取る。 .IP "mailerflags" 12 .IX Item "mailerflags" メーラを起動するときに使用するフラグ。デフォルトは \fB\-t\fR に なっている。 .IP "mailerpath" 12 .IX Item "mailerpath" 警告メールの送信に使うメール・プログラムのパス。デフォルトは configure したときに見つかった sendmail のパス。 .IP "mailfrom" 12 .IX Item "mailfrom" 警告メールやエラー・メールを送るとき、差出人として使用するアドレス。 \&\fBsudo\fR が \f(CW\*(C`@\*(C'\fR 記号を解釈しないようにするため、 アドレスはダブルクォート (\f(CW\*(C`"\*(C'\fR) で囲むべきである。 デフォルトは、\fBsudo\fR を実行するユーザの名前。 .IP "mailto" 12 .IX Item "mailto" 警告メールやエラー・メールを送付する宛先のアドレス。\fBsudo\fR が \&\f(CW\*(C`@\*(C'\fR 記号を解釈しないようにするため、アドレスは ダブルクォート (\f(CW\*(C`"\*(C'\fR) で囲むべきである。デフォルトは root に なっている。 .IP "secure_path" 12 .IX Item "secure_path" \&\fBsudo\fR から実行されるあらゆるコマンドが使用するパス。 \&\fBsudo\fR を実行するユーザが、無難な環境変数 \f(CW\*(C`PATH\*(C'\fR を 使っているかどうか確信が持てないなら、このオプションを使用するとよいだろう。 もう一つの使用法は、「root のパス」と「一般ユーザのパス」を別のものに しておきたい場合だ。ユーザが \fIexempt_group\fR オプションで指定した グループに属していると、そのユーザは \fIsecure_path\fR の影響を受けない。 このオプションは、デフォルトではセットされていない。 .IP "syslog" 12 .IX Item "syslog" syslog を使ってログを取っている場合の syslog のファシリティ (syslog 経由で ログを取らない場合は、'!' を頭に付けて、このオプションを否定する)。 デフォルトは \f(CW\*(C`local2\*(C'\fR になっている。 .IP "verifypw" 12 .IX Item "verifypw" このオプションは、\fBsudo\fR を \fB\-v\fR オプション付きで実行したとき、 ユーザがパスワードを要求されるのは、どんな場合かを決定する。次のような 値が可能である。 .RS 12 .IP "all" 8 .IX Item "all" パスワードを入力しないですむためには、\fIsudoers\fR ファイルの使用中の ホストに対する当該ユーザのエントリのすべてに \&\f(CW\*(C`NOPASSWD\*(C'\fR タグが設定されていなければならない。 .IP "always" 8 .IX Item "always" ユーザは \fB\-v\fR オプションを使用する際に必ずパスワードを入力しなければ ならない。 .IP "any" 8 .IX Item "any" パスワードを入力しないですむためには、\fIsudoers\fR ファイルの使用中の ホストに対する当該ユーザのエントリの少なくとも一つに \f(CW\*(C`NOPASSWD\*(C'\fR タグが設定されていなければならない。 .IP "never" 8 .IX Item "never" ユーザは \fB\-v\fR オプションを使用する際にパスワードを入力する必要が まったくない。 .RE .RS 12 .Sp 値を指定しないと、値は \fIall\fR だと見なされる。'!' を頭に付けて、 このオプションを否定すると、値に \fInever\fR が使われることになる。 デフォルトは \fIall\fR である。 .RE .PP \&\fB真偽値としても使用できるリスト\fR: .IP "env_check" 16 .IX Item "env_check" 変数の値に \f(CW\*(C`%\*(C'\fR や \f(CW\*(C`/\*(C'\fR が含まれる場合に、 ユーザの環境から取り除かれる環境変数。 この機能は、出来のよくないプログラムに見られる printf 形式のフォーマットの 脆弱性に対処するために利用できる。このオプションの引き数は、 ダブルクォートで囲まれ、スペースで区切られたリストでもよく、 ダブルクォートなしの単一の値でもよい。リストは、\f(CW\*(C`=\*(C'\fR, \&\f(CW\*(C`+=\*(C'\fR, \f(CW\*(C`\-=\*(C'\fR, \f(CW\*(C`!\*(C'\fR 演算子を 使って、それぞれ置き換えたり、追加したり、削除したり、無効にしたり することができる。\fIenv_check\fR で指定された変数は、 \&\fIenv_reset\fR オプショの有効・無効にかかわらず、上記のチェックに パスすれば、環境に保存されることになる。チェックされる環境変数の デフォルトのリストは、root ユーザが \fBsudo\fR に \&\fI\-V\fR オプションを 付けて実行したときに表示される。 .IP "env_delete" 16 .IX Item "env_delete" \&\fIenv_reset\fR オプションが無効になっているときに、ユーザの環境から 取り除かれる環境変数。このオプションの引き数は、ダブルクォートで囲まれ、 スペースで区切られたリストでもよく、ダブルクォートなしの単一の値でもよい。 リストは、\f(CW\*(C`=\*(C'\fR, \f(CW\*(C`+=\*(C'\fR, \f(CW\*(C`\-=\*(C'\fR, \&\f(CW\*(C`!\*(C'\fR 演算子を使って、それぞれ置き換えたり、追加したり、 削除したり、無効にしたりすることができる。取り除かれる環境変数の デフォルトのリストは、root ユーザが \fBsudo\fR に \fI\-V\fR オプションを 付けて実行したときに表示される。留意すべきは、オペレーティングシステムには、 危険をもたらしかねない変数をいかなる setuid プロセス (\fBsudo\fR も その一つ) の環境からも取り除くことにしているものが多いということである。 .IP "env_keep" 16 .IX Item "env_keep" \&\fIenv_reset\fR オプションが有効になっているときでも、ユーザの環境に そのまま保存される環境変数。このオプションによって、\fBsudo\fR から 生み出されるプロセスが受け取る環境を、きめ細かく制御することが可能になる。 このオプションの引き数は、ダブルクォートで囲まれ、スペースで区切られたリ ストでもよく、ダブルクォートなしの単一の値でもよい。リストは、 \&\f(CW\*(C`=\*(C'\fR, \f(CW\*(C`+=\*(C'\fR, \f(CW\*(C`\-=\*(C'\fR, \&\f(CW\*(C`!\*(C'\fR 演算子を使って、それぞれ置き換えたり、 追加したり、削除したり、無効にしたりすることができる。保存される変数の デフォルトのリストは、root ユーザが \fBsudo\fR に \fI\-V\fR オプションを 付けて実行したときに表示される。 .PP \fIsyslog\fR\|(3) 経由でログを記録する場合、\fBsudo\fR は syslog のファ シリティ (facility: \fBsyslog\fR パラメータの値) として次の値を受け付 ける。\fBauthpriv\fR (ただし、\s-1OS\s0 がサポートしているならばだが)、 \&\fBauth\fR, \fBdaemon\fR, \fBuser\fR, \fBlocal0\fR, \fBlocal1\fR, \&\fBlocal2\fR, \fBlocal3\fR, \fBlocal4\fR, \fBlocal5\fR, \&\fBlocal6\fR, \fBlocal7\fR。syslog の優先順位 (priority) については、 次のものに対応している。\fBalert\fR, \fBcrit\fR, \fBdebug\fR, \&\fBemerg\fR, \fBerr\fR, \fBinfo\fR, \fBnotice\fR, \fBwarning\fR。 .SH "ファイル" .IX Header "FILES" .ie n .IP "\fI/etc/sudoers\fR" 24 .el .IP "\fI/etc/sudoers\fR" 24 .IX Item "/etc/sudoers" 誰が何を実行できるかのリスト .IP "\fI/etc/group\fR" 24 .IX Item "/etc/group" ローカルのグループファイル .IP "\fI/etc/netgroup\fR" 24 .IX Item "/etc/netgroup" ネットワークグループのリスト .SH "用例" .IX Header "EXAMPLES" 以下は sudoers エントリの見本である。正直なところ、いささか 凝りすぎの部分もある。まず最初にエイリアスを定義する。 .PP .Vb 4 \& # User alias の指定 \& User_Alias FULLTIMERS = millert, mikef, dowdy \& User_Alias PARTTIMERS = bostley, jwfox, crawl \& User_Alias WEBMASTERS = will, wendy, wim \& \& # Runas alias の指定 \& Runas_Alias OP = root, operator \& Runas_Alias DB = oracle, sybase \& Runas_Alias ADMINGRP = adm, oper \& \& # Host alias の指定 \& Host_Alias SPARC = bigtime, eclipse, moet, anchor :\e \& SGI = grolsch, dandelion, black :\e \& ALPHA = widget, thalamus, foobar :\e \& HPPA = boa, nag, python \& Host_Alias CUNETS = 128.138.0.0/255.255.0.0 \& Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0 \& Host_Alias SERVERS = master, mail, www, ns \& Host_Alias CDROM = orion, perseus, hercules \& \& # Cmnd alias の指定 \& Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\e \& /usr/sbin/restore, /usr/sbin/rrestore \& Cmnd_Alias KILL = /usr/bin/kill \& Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm \& Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown \& Cmnd_Alias HALT = /usr/sbin/halt \& Cmnd_Alias REBOOT = /usr/sbin/reboot \& Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \e \& /usr/local/bin/tcsh, /usr/bin/rsh, \e \& /usr/local/bin/zsh \& Cmnd_Alias SU = /usr/bin/su \& Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less .Ve .PP 以下では、コンパイル時に埋め込まれたデフォルト値のいくつかを変更している。 \&\fBsudo\fR には \fIsyslog\fR\|(3) 経由でログを記録し、ファシリティには すべての場合に \fIauth\fR を使用させたい。フルタイムのスタッフには \&\fBsudo\fR の訓戒を出さないようにしたい。ユーザ \fBmillert\fR は パスワードを入力しないでよい。コマンドを root として実行するときは、 環境変数 \f(CW\*(C`LOGNAME\*(C'\fR, \f(CW\*(C`USER\*(C'\fR, \&\f(CW\*(C`USERNAME\*(C'\fR を変更したくない。さらに、 \&\fI\s-1SERVERS\s0\fR という \f(CW\*(C`Host_Alias\*(C'\fR に属する マシンでは、ローカルなログファイルを副本として作り、ログの記入事項は 数年に渡って保存されるので、ログの各行に間違いなく年度が入るようにする。 最後に \s-1PAGERS\s0 という \f(CW\*(C`Cmnd_Alias\*(C'\fR に属する コマンド (\fI/usr/bin/more\fR, \fI/usr/bin/pg\fR, \fI/usr/bin/less\fR) については、シェル・エスケープを無効にする。 .PP .Vb 7 \& # built-in defaults の変更 \& Defaults syslog=auth \& Defaults>root !set_logname \& Defaults:FULLTIMERS !lecture \& Defaults:millert !authenticate \& Defaults@SERVERS log_year, logfile=/var/log/sudo.log \& Defaults!PAGERS noexec .Ve .PP ユーザ設定が、誰が何を実行できるかを実際に決めている部分だ。 .PP .Vb 2 \& root ALL = (ALL) ALL \& %wheel ALL = (ALL) ALL .Ve .PP \&\fBroot\fR と \fBwheel\fR グループのすべてのユーザには、どのホストでも 任意のユーザとしていかなるコマンドでも実行することを認める。 .PP .Vb 1 \& FULLTIMERS ALL = NOPASSWD: ALL .Ve .PP フルタイムのシステム管理者 (\fBmillert\fR, \fBmikef\fR, \fBdowdy\fR) は、どのホストでも任意のコマンドを認証なしで実行できる。 .PP .Vb 1 \& PARTTIMERS ALL = ALL .Ve .PP パートタイムのシステム管理者 ((\fBbostley\fR, \fBjwfox\fR, \&\fBcrawl\fR) は、どのホストでも任意のコマンドを実行できるが、 その際に認証をしなければならない (このエントリには \&\f(CW\*(C`NOPASSWD\*(C'\fR タグが指定されていないので)。 .PP .Vb 1 \& jack CSNETS = ALL .Ve .PP ユーザ \fBjack\fR は、\fI\s-1CSNETS\s0\fR というエイリアスに属するマシンで 任意のコマンドを実行できる (すなわち、ネットワークが \f(CW128.138.243.0\fR, \&\f(CW128.138.204.0\fR, \f(CW128.138.242.0\fR のマシンだ)。この内、 \&\f(CW128.138.204.0\fR にのみ class C のネットワークであることを示す 明示的な (\s-1CIDR\s0 表記の) netmask がある。\fI\s-1CSNETS\s0\fR の ほかのネットワークについては、ローカルマシンの netmask がマッチングの際に 使われることになる。 .PP .Vb 1 \& lisa CUNETS = ALL .Ve .PP ユーザ \fBlisa\fR はエイリアスが \fI\s-1CUNETS\s0\fR のいかなるホストでも 任意のコマンドを実行することができる (すなわち、 \f(CW128.138.0.0\fR という class B ネットワークのマシンだ)。 .PP .Vb 2 \& operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\e \& sudoedit /etc/printcap, /usr/oper/bin/ .Ve .PP ユーザ \fBoperator\fR は、用途が簡単な保守管理に限定されたコマンドを 実行できる。この場合それは、バックアップしたり、プロセスを kill したり、 印刷システムを操作したり、システムをシャットダウンしたりするのに 関係するコマンドと、\fI/usr/oper/bin/\fR ディレクトリにある任意のコマンド である。 .PP .Vb 1 \& joe ALL = /usr/bin/su operator .Ve .PP ユーザ \fBjoe\fR は \fIsu\fR\|(1) を使って operator になることしか できない。 .PP .Vb 1 \& %opers ALL = (: ADMINGRP) /usr/sbin/ .Ve .PP \&\fBopers\fR グループのユーザは、\fI/usr/sbin/\fR にあるコマンドを 自分自身の資格で、 \&\f(CW\*(C`Runas_Alias\*(C'\fR \fI\s-1ADMINGRP\s0\fR に属する 任意のグループ (すなわち、\fBadm\fR か \fBoper\fR グループ) として 実行できる。(訳注: 実のところ、sudo-1.7.2p1 では、 \&\fI/etc/sudoers\fR で変身可能グループに \f(CW\*(C`Runas_Alias\*(C'\fR を まだ指定できないようだ。今のところ、この例で言うなら、\fI\s-1ADMINGRP\s0\fR ではなく、\fBadm\fR や \fBoper\fR を直接指定しなければならない。) .PP .Vb 1 \& pete HPPA = /usr/bin/passwd [A\-Za\-z]*, !/usr/bin/passwd root .Ve .PP ユーザ \fBpete\fR は \fI\s-1HPPA\s0\fR に属するマシンで root 以外なら 誰のパスワードでも変更することを許されている。上記の指定は、 \&\fIpasswd\fR\|(1) がコマンドラインで複数のユーザ名を受け付けないことを 前提としている点に注意してほしい。 .PP .Vb 1 \& bob SPARC = (OP) ALL : SGI = (OP) ALL .Ve .PP ユーザ \fBbob\fR は \fI\s-1SPARC\s0\fR や \fI\s-1SGI\s0\fR に属する マシンで \f(CW\*(C`Runas_Alias\*(C'\fR \fI\s-1OP\s0\fR に登録されている 任意のユーザとして (\fBroot\fR と \fBoperator\fR である) どんなコマンドでも 実行できる。 .PP .Vb 1 \& jim +biglab = ALL .Ve .PP ユーザ \fBjim\fR は \fIbiglab\fR ネットグループに属するマシンで どんなコマンドでも実行できる。\fBsudo\fR は、\*(L"biglab\*(R" に '+' の 接頭辞が付いているので、それをネットグループだと認識する。 .PP .Vb 1 \& +secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser .Ve .PP \&\fBsecretaries\fR ネットグループのユーザは、ユーザの追加や削除は もちろん、プリンタの管理にも協力する必要がある。そこで、すべてのマシンで その種のコマンドの実行を認められている。 .PP .Vb 1 \& fred ALL = (DB) NOPASSWD: ALL .Ve .PP ユーザ \fBfred\fR は \f(CW\*(C`Runas_Alias\*(C'\fR \fI\s-1DB\s0\fR の 任意のユーザとして (\fBoracle\fR か \fBsybase\fR だ) パスワードを 入力しないでもコマンドを実行することができる。 .PP .Vb 1 \& john ALPHA = /usr/bin/su [!\-]*, !/usr/bin/su *root* .Ve .PP ユーザ \fBjohn\fR は \fI\s-1ALPHA\s0\fR に属するマシンで \fIsu\fR\|(1) を 使って root 以外の誰にでもなることができるが、su にオプションを 指定することは許されていない。 .PP .Vb 1 \& jen ALL, !SERVERS = ALL .Ve .PP ユーザ \fBjen\fR は \f(CW\*(C`Host_Alias\*(C'\fR \fI\s-1SERVERS\s0\fR に 属するマシン (master, mail, www, ns) を除くいかなるマシンでも 任意のコマンドを実行できる。 .PP .Vb 1 \& jill SERVERS = /usr/bin/, !SU, !SHELLS .Ve .PP \&\fBjill\fR は \f(CW\*(C`Host_Alias\*(C'\fR \fI\s-1SERVERS\s0\fR の いかなるマシンでも \fI/usr/bin/\fR ディレクトリにある任意のコマンドを 実行できるが、\fI\s-1SU\s0\fR や \fI\s-1SHELLS\s0\fR という \&\f(CW\*(C`Cmnd_Aliases\*(C'\fR に属するコマンドは実行できない。 .PP .Vb 1 \& steve CSNETS = (operator) /usr/local/op_commands/ .Ve .PP ユーザ \fBsteve\fR はディレクトリ \fI/usr/local/op_commands/\fR にある 任意のコマンドを実行できるが、operator というユーザとして実行できるだけだ。 .PP .Vb 1 \& matt valkyrie = KILL .Ve .PP \&\fBmatt\fR も自分用のワークステーション valkyrie で ハングしたプロセスの kill ぐらいはできる必要がある。 .PP .Vb 1 \& WEBMASTERS www = (www) ALL, (root) /usr/bin/su www .Ve .PP ホスト www で \f(CW\*(C`User_Alias\*(C'\fR \fI\s-1WEBMASTERS\s0\fR に 属するいかなるユーザも (will, wendy, wim だ)、ユーザ www (web ページの 所有者) として任意のコマンドを実行することができる。 単に \fIsu\fR\|(1) で www になってもよい。 .PP .Vb 2 \& ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\e \& /sbin/mount \-o nosuid\e,nodev /dev/cd0a /CDROM .Ve .PP いかなるユーザも \f(CW\*(C`Host_Alias\*(C'\fR が \s-1CDROM\s0 の マシンで (orion, perseus, hercules)、パスワードを入力することなく CD-ROM をマウント、アンマウントできる。上記のコマンドを打ち込むのは ユーザにとっていささか面倒なので、シェルスクリプトとして カプセル化してしまうのがよいだろう。 .IP "[\fB訳注\fR]:" 8 .IX Item "footnote2" 当然と言えば当然だが、sudo は自ホストの /etc/sudoers しか読まない。 そこで、こういうことになる。AAA というホストに aaa というユーザが いるとしよう。ホスト AAA の /etc/sudoers に「ホスト BBB でユーザ aaa は sudo を介して /bin/ls を実行できる」という記述があったとしても、 ユーザ aaa がホスト AAA から telnet や ssh を使ったとき、ホスト BBB 上で sudo 経由で ls を実行できるわけではない。それができるためには、 ホスト BBB の /etc/sudoers に「BBB でユーザ aaa は sudo を介して /bin/ls を 実行できる」という記述がなければならないのだ。ホスト BBB で実行する sudo は BBB の sudo であり、BBB の sudo は BBB の /etc/sudoers しか 読まないのだから。 .Sp それでは、何故、上記の「用例」で自ホスト以外の設定が行われて いるのか? そもそも、sudoers の書式で自ホスト以外のホストを 指定できるのは、何故なのか? それは、管理しているサイトの すべてのホストの設定を記した sudoers ファイルを一つ作って、それを すべてのホストにコピーして使う、そういった使い方を想定しているからだ。 もし、サイト中のすべてのホストの設定を一ヶ所にまとめて置き、 それをすべてのホストに共有させたいのなら (すなわち、sudo の設定の 集中管理がしたいのなら)、LDAP の採用を考えるべきである。 .SH "セキュリティに関する注意点" .IX Header "SECURITY NOTES" 一般的に言って、演算子 '!' を使用して \f(CW\*(C`ALL\*(C'\fR から コマンドの「引き算」をすることは、あまり効果がない。ユーザは実行したい コマンドを名前を変えてコピーし、それからそれを実行するするといった ちょっとした手段で、裏をかくことができるからだ。たとえば、 .PP .Vb 1 \& bill ALL = ALL, !SU, !SHELLS .Ve .PP という行は、\fI\s-1SU\s0\fR や \fI\s-1SHELLS\s0\fR に列記されている コマンドの \fBbill\fR による実行を本当に阻止することにはならない。 なぜなら、\fBbill\fR としては、そうしたコマンドを単に名前を変えて コピーすればよいし、エディタやほかのプログラムからシェル・エスケープを 利用することもできるからだ。だから、この種の制限はやった方がまし程度に 考えておくべきだ (そして、しっかりした運用方針によって制限の実効力を 上げるべきである)。 .SH "シェル・エスケープを防止する" .IX Header "PREVENTING SHELL ESCAPES" \&\fBsudo\fR があるプログラムを実行してしまうと、そのプログラムは、 ほかのプログラムの実行も含めて、何でも自由に好きなことができる。 このことがセキュリティ上の問題になりかねないのは、プログラムが シェル・エスケープを許しているのは珍しいことではなく、そのために ユーザが \fBsudo\fR のアクセス制御やロギングをすり抜けることが 可能になるからだ。よく使うプログラムでシェル・エスケープを 許しているものには、次のようなものがある。 (当然ながら) シェル、エディタ、ページャ、メーラ、ターミナル。 .PP この問題に対処するには、基本的に二つの方法がある。 .IP "制限" 10 .IX Item "restrict" ユーザに任意のコマンドの実行を許すようなコマンドに対して、ユーザが アクセスできないようにする。エディタの場合は、制限モードと称して、 シェル・エスケープが使えないモードを持っているものも多い。 もっとも、\fBsudo\fR 経由でエディタを使うのなら、 \&\fBsudoedit\fR を使用する方がよりすぐれた対策である。 シェル・エスケープを提供するプログラムはたくさんあるので、 それを提供しないプログラムのみを使用するようにユーザを制限するのは、 たいてい実現不可能である。 .IP "noexec" 10 .IX Item "noexec" 共有ライブラリをサポートしている多くのシステムには、環境変数 (たいていは \&\f(CW\*(C`LD_PRELOAD\*(C'\fR) で別の共有ライブラリを指定することによって、 デフォルトのライブラリ関数を置き換える能力がある。 そういったシステムでは、\fBsudo\fR の \fInoexec\fR 機能を使えば、 \&\fBsudo\fR から実行されるプログラムが、何かほかのプログラムを実行するのを 防ぐことができる。とは言え、これが当てはまるのは、動的にリンクされた ネイティブなプログラムだけだということに気を付けてほしい。 静的にリンクされたプログラムや、バイナリ・エミュレーションのもとで 動くほかの OS のプログラムには効果がない。 .Sp \&\fBsudo\fR が \fInoexec\fR に対応しているかどうかを知りたかったら、 root ユーザになって次のように実行してみればよい。 .Sp .Vb 1 \& sudo \-V | grep "dummy exec" .Ve .Sp その出力にこんなふうに始まる行があれば、 .Sp .Vb 1 \& File containing dummy exec functions: .Ve .Sp そのときは、たぶん \fBsudo\fR が標準ライブラリにある exec ファミリーの関数を、 単にエラーを返すだけの自分自身の関数で置き換えられるということだ。 残念ながら、\fInoexec\fR が有効かどうか、コンパイル時に確かめる 絶対確実な方法はない。\fInoexec\fR は SunOS, Solaris, *BSD, Linux, \&\s-1IRIX\s0, Tru64 \s-1UNIX\s0, MacOS X, HP-UX 11.x で使えるはずだ。 \&\s-1AIX\s0 と UnixWare では使えないことがわかっている。環境変数 \&\f(CW\*(C`LD_PRELOAD\*(C'\fR をサポートしているたいていの OS なら、 \&\fInoexec\fR が使えると思う。使用しているオペレーティングシステムの マニュアルページを調べて、ダイナミック・リンカについて (通例 ld.so, ld.so.1, dyld, dld.sl, rld, loader といった名前になっている) \&\f(CW\*(C`LD_PRELOAD\*(C'\fR がサポートされているかどうか確認してほしい。 .Sp あるコマンドに対して \fInoexec\fR を有効にするには、 上記「ユーザの設定」セクションで述べたように、\f(CW\*(C`NOEXEC\*(C'\fR タグを 使用する。そのときの例を再掲しよう。 .Sp .Vb 1 \& aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi .Ve .Sp この例では、ユーザ \fBaaron\fR 対して、\fInoexec\fR を有効にした上で、 \&\fI/usr/bin/more\fR と \fI/usr/bin/vi\fR の実行を許可している。 このようにすれば、この二つのコマンドから (シェルのような) ほかのコマンドを 実行することができなくなるわけだ。使用しているシステムが \fInoexec\fR に 対応する能力があるかどうか、よくわからない場合は、取りあえず \&\fInoexec\fR を試して、効果があるかどうか確かめてみればよい。それなら いつだってできるはずだ。 .PP 注意してほしいが、シェル・エスケープの禁止は万能薬ではない。ルートの権限で 動いているプログラムには、ほかにも、危険性のあるさまざまな作業 (ファイルの 中身を入れ替えるとか、上書きするとか) が可能であり、思いがけずに 権限を拡大してしまうこともありえるのだ。特にエディタについて言うと、 ユーザには \fBsudoedit\fR を実行する許可を与えるのが、より安全な方法である。 .SH "関連項目" .IX Header "SEE ALSO" \&\fIrsh\fR\|(1), \fIsu\fR\|(1), \fIfnmatch\fR\|(3), \fIglob\fR\|(3), \fIsudo\fR\|(8), \fIvisudo\fR\|(8) .SH "警告" .IX Header "CAVEATS" \&\fIsudoers\fR ファイルの編集には、\fB必ず\fR \fBvisudo\fR コマンドを 使うべきだ。そうすれば、\fBvisudo\fR がファイルをロックし、文法のチェッ クをやってくれる。\fIsudoers\fR ファイルに文法的な間違いがあると、 \&\fBsudo\fR が動かないので、\fIsudoers\fR ファイルには文法エラーが絶 対にあってはならないのだ。 .PP ネットグループを (ユーザについてではなく) マシンについて使用し、 \&\fInetgroup\fR ファイルに完全修飾ホスト名を記載する場合は (たいてい そうするものだが)、そのマシンのホスト名を \f(CW\*(C`hostname\*(C'\fR コマンドが出力する通りの完全修飾名で書くか、さもなければ \&\fIsudoers\fR ファイルで \fIfqdn\fR オプションを使うかしなければなら ない。 .SH "バグ" .IX Header "BUGS" \&\fBsudo\fR にバグを発見したと思ったら、下記のページにアクセスして、 バグレポートを提出していただきたい。 .br http://www.sudo.ws/sudo/bugs/ .SH "サポート" .IX Header "SUPPORT" ある程度の無料サポートが sudo-users メーリングリストを通して利用できる。 購読やアーカイブの検索には下記 URL を御覧になること。 .br http://www.sudo.ws/mailman/listinfo/sudo\-users .SH "免責" .IX Header "DISCLAIMER" \&\fBsudo\fR は「現状のまま」提供される。明示的な、あるいは黙示的な いかなる保証も、商品性や特定目的への適合性についての黙示的な保証を含め、 またそれのみに止まらず、これを否認する。詳細な全文については、 \&\fBsudo\fR と一緒に配布されている \s-1LICENSE\s0 ファイルや 下記 Web ページを御覧いただきたい。 .br http://www.sudo.ws/sudo/license.html