SUDOERS(5) MAINTENANCE COMMANDS SUDOERS(5) 名前 sudoers - どのユーザが何を実行できるかのリスト 説明 sudoers ファイルは二種類のエントリから構成されている。 (要するに変数で ある) エイリアスと (誰が何を実行できるかを指定している) ユーザ設定だ。 [訳注]: 訳者としては、「エイリアス、デフォルト指定、ユーザ設定の三種類 のエントリから構成されている」と言った方が実態に合っているので はないかと思う。 一人のユーザに複数のエントリがマッチするときは、順番に適用される。複数 の指定がマッチしている箇所については、最後にマッチしたものが使用される (それが一番明示的なマッチだとはかぎらないが)。 以下では sudoers の文法を拡張 Backus-Naur 記法 (EBNF) を使って記述する 。EBNF がどんなものか知らないからといって、あきらめないでいただきたい。 わりと簡単なものだし、以下に出てくる定義には詳しい説明を付けておきます から。 EBNF 早わかり EBNF は言語の文法を記述する簡潔で厳密な方法である。 EBNF の個々の定義は 生成規則からできている。たとえば、 シンボル ::= 定義 | 別の定義 1 | 別の定義 2 ... 個々の生成規則は、ほかの生成規則を参照し、そのようにして言語の文法を作 り上げている。また EBNF には以下の演算子が含まれるが、正規表現で御存じ の読者も多いだろう。だが、いわゆる「ワイルドカード」文字と混同しないで いただきたい。あれは別の意味を持っている。 ? 直前のシンボル (または、シンボルのグループ) が、あってもなくてもよ いことを意味する。すなわちそのシンボルは、1 回現れてもよいし、1 回 も現れないでもよい。 * 直前のシンボル (または、シンボルのグループ) が 0 回以上現れる。 + 直前のシンボル (または、シンボルのグループ) が 1 回以上現れる。 丸カッコを使うと、複数のシンボルをグループにまとめることができる。なお 混乱を避けるため、以下の定義で (シンボル名ではなく) 文字どおりの文字列 や記号を示す場合は、それをシングルクォート (’’) で囲むことにする。 エイリアス エイリアスには四種類ある。User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias である。 Alias ::= 'User_Alias' User_Alias (':' User_Alias)* | 'Runas_Alias' Runas_Alias (':' Runas_Alias)* | 'Host_Alias' Host_Alias (':' Host_Alias)* | 'Cmnd_Alias' Cmnd_Alias (':' Cmnd_Alias)* User_Alias ::= NAME '=' User_List Runas_Alias ::= NAME '=' Runas_List Host_Alias ::= NAME '=' Host_List Cmnd_Alias ::= NAME '=' Cmnd_List NAME ::= [A-Z]([A-Z][0-9]_)* 個々のエイリアスの定義は、次の形をとる。 Alias_Type NAME = item1, item2, ... 上記において、Alias_Type は User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias のうちの一つである。 NAME はアルファベットの大文字、数字、ア ンダースコア (’_’) からなる文字列であるが、先頭の文字は大文字でなければ ならない。同じタイプのエイリアス定義を、コロンで (’:’) つないで、一行に 複数書くこともできる。たとえば、 Alias_Type NAME = item1, item2, item3 : NAME = item4, item5 以下では、エイリアスの有効な要素となるものを定義する。 User_List ::= User | User ',' User_List User ::= '!'* username | '!'* '#'uid | '!'* '%'group | '!'* '+'netgroup | '!'* '%:'nonunix_group | '!'* User_Alias User_List は一個以上の、ユーザ名、uid (’#’ が頭に付く)、システムグルー プ名 (’%’ が頭に付く) 、ネットグループ名 (’+’ が頭に付く)、非 UNIX グル ープ名 (’%:’ が頭に付く)、 User_Alias からなる。リストの各項目の前には 一個以上の ’!’ 演算子を付けてもよい。奇数個の ’!’ はその項目の値を否定 する。偶数個の場合は互い相殺するだけだ。 ユーザ名、グループ名、ネットグループ名、非 UNIX グループ名は、ダブルク ォートで囲めば、特殊文字をエスケープしないですむ。ダブルクォートで囲ま ずに特殊文字を使いたいなら、エスケープした 16 進数を指定してやればよい 。たとえば、スペースなら \x20 という具合だ。 非 UNIX グループ名の書式は、利用するサービスの実装によって決まる。たと えば、 Quest Authentication Services の AD バックエンドは、以下の書式を サポートしている。 · 同じドメインのグループ: "Group Name" · 任意のドメインのグループ: "Group Name@FULLY.QUALIFIED.DOMAIN" · グループ SID: "S-1-2-34-5678901234-5678901234-5678901234-567" グループ名を囲む引用符は任意であることに注意してほしい。文字列を引用符 で囲まない場合は、スペースや ’@’ 記号をエスケープするために、バックスラ ッシュ (\) を使わなければならない。 Runas_List ::= Runas_Member | Runas_Member ',' Runas_List Runas_Member ::= '!'* username | '!'* '#'uid | '!'* '%'group | '!'* +netgroup | '!'* Runas_Alias Runas_List は User_List に似ている。違うのは、User_Alias ではなく、 Runas_Alias が使えることだ。ユーザ名やグループ名のマッチは文字列として 行われることに気を付けてほしい。言い換えると、二つのユーザ名 (あるいは グループ名) は、かりに同じ uid (gid) を持っていても、別個のものと見なさ れるのである。だから、もし同じ uid を持ったすべてのユーザ名にマッチさせ たかったら (たとえば、root と toor がそうだとしよう)、ユーザ名の代わり に uid を使えばよい (この例なら、#0 である)。 Host_List ::= Host | Host ',' Host_List Host ::= '!'* hostname | '!'* ip_addr | '!'* network(/netmask)? | '!'* '+'netgroup | '!'* Host_Alias Host_List は一個以上の、ホスト名、IP アドレス、ネットワークアドレス、ネ ットグループ名 (頭に ’+’ が付く)、および他のエイリアスからなる。ここで もまた、’!’ 演算子を付けて、項目の値を否定することができる。ネットワー クアドレスにネットマスクを指定しなかった場合は、sudo がローカルホストの ネットワークインターフェースを一つ一つ参照し、指定されたネットワークア ドレスと同じアドレスを持つインターフェースがあれば、そのネットマスクを 使用することになる。ネットマスクの指定は、標準の IP アドレス表記 (たと えば 255.255.255.0 とか ffff:ffff:ffff:ffff:: とか) でもよく、CIDR 表記 (ビット数、たとえば 24 とか 64 とか) でもよい。ホスト名の一部にシェル風 のワイルドカードを使用することができるが (下記のワイルドカードのセクシ ョンを参照)、使用マシンの hostname コマンドが完全修飾ドメイン名を返さな い場合、ワイルドカードを利用するには fqdn オプションを使う必要がある。 Cmnd_List ::= Cmnd | Cmnd ',' Cmnd_List commandname ::= filename | filename args | filename '""' Cmnd ::= '!'* commandname | '!'* directory | '!'* "sudoedit" | '!'* Cmnd_Alias Cmnd_List は一個以上の、コマンド名、ディレクトリ、他のエイリアスからな るリストである。コマンド名は絶対パスのファイル名であり、シェル風のワイ ルドカードを含んでいても構わない (下記のワイルドカードのセクションを参 照)。単にファイル名だけ指定した場合、ユーザはお望みのどんな引き数でも付 けてそのコマンドを実行することができる。とは言え、コマンドライン引き数 を (ワイルドカードを含めて) 指定しても構わないし、また、引き数に "" を 指定して、そのコマンドは コマンドライン引き数なしの実行のみが可能だと指 示することもできる。ディレクトリは ’/’ で終わる絶対パス名である。 Cmnd_List にディレクトリを指定すると、ユーザーはそのディレクトリ内の任 意のファイルを実行できるようになる (だが、そのサブディレクトリにあるフ ァイルは実行できない)。 Cmnd がコマンドライン引き数を伴っている場合は、 Cmnd 中の引き数は、ユー ザがコマンドラインに打ち込む引き数と正確に一致しなければならない (Cmnd 中の引き数にワイルドカードがあるならば、それがコマンドラインの引き数と マッチしなければならない)。以下に挙げる文字をコマンド引き数の中で用いる ときは、’\’ によってエスケープしなければならないことに注意してほしい。 ’,’, ’:’, ’=’, ’\’ がそれである。スペシャルコマンド "sudoedit" は、ユー ザが sudo を -e オプション付きで (あるいは、sudoedit というコマンド名 で) 実行することを許可するために使用する。この場合、コマンドライン引き 数を取ることができるのは、普通のコマンドとまったく同様である。 デフォルトの指定 (Defaults) かなりの設定オプションが、一行以上の Default_Entry 行を使うことで実行時 にデフォルトの値から変更可能だ。その効果の及ぶ範囲は、任意のホストのす べてのユーザにすることもできるし、ある特定のホストのすべてのユーザ、あ る特定のユーザ、ある特定のコマンド、ある特定のユーザとして実行するコマ ンドに限定することもできる。気を付けてほしいのは、コマンドに限定した Defaults 行にコマンドライン引き数まで書くことができないことだ。引き数を 指定する必要がある場合は、Cmnd_Alias を定義して、代わりにそれを参照すれ ばよい。 Default_Type ::= 'Defaults' | 'Defaults' '@' Host_List | 'Defaults' ':' User_List | 'Defaults' '!' Cmnd_List | 'Defaults' '>' Runas_List Default_Entry ::= Default_Type Parameter_List Parameter_List ::= Parameter | Parameter ',' Parameter_List Parameter ::= Parameter '=' Value | Parameter '+=' Value | Parameter '-=' Value | '!'* Parameter パラメータはフラグ、整数値、文字列、リスト のどれでもよい。フラグは要す るにブーリアン (真偽値) であり、’!’ 演算子で off にできる。整数値、文字 列、リストのパラメータにも、真偽値として使用して、それを無効にできるも のがいくつか存在する。パラメータの値が複数の単語を含むときは、値をダブ ルクオート (") で囲むとよい。特殊文字はバックスラッシュ (\) でエスケー プすることができる。 リストには代入演算子が = のほかにもう二つある。 += と -= である。こうし た演算子はそれぞれリストに付け加えたり、リストから削除したりするのに使 用する。 -= 演算子を使って、リストに存在しない要素を消去しようとしても 、エラーにはならない。 Defaults 行の解析は、次の順序で行われる。最初に汎用、Host、User の Defaults が解析され、それから Runas、最後にコマンドの Defaults の順番に なる。 Defaults 行で使用できるパラメータのリストについては、「SUDOERS のオプシ ョン」を御覧いただきたい。 ユーザの設定 (User Specification) User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \ (':' Host_List '=' Cmnd_Spec_List)* Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List Cmnd_Spec ::= Runas_Spec? Tag_Spec* Cmnd Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' | 'SETENV:' | 'NOSETENV:' ) ユーザの設定は、あるユーザが指定されたホストで (どのユーザに変身して) どのコマンドを実行できるかを決定する。デフォルトでは、コマンドは root に変身して実行されるが、これはコマンドごとに変更することができる。 ユーザの設定の基本構造は、「誰が どこで = (誰に変身して) 何を」である (who where = (as_whom) what)。構成部分に分けて説明しよう。 Runas_Spec (どのユーザやグループに変身できるか) Runas_Spec は変身の対象となるユーザやグループを規定している。完全な形の Runas_Spec は、(上で定義しているように) コロン (’:’) で区切られ、カッコ で囲まれた、二つの Runas_List からなっている。一つ目の Runas_List は、 sudo で -u オプションを使ったときに変身できるユーザを指している。二番目 の方が規定しているのは、sudo の -g オプションによって指定できるグループ のリストだ。両方の Runas_List が指定されている場合は、それぞれの Runas_List にリストされているユーザとグループの任意の組み合わせで、コマ ンドを実行することが可能である。一つ目の Runas_List だけが指定されてい るときは、リスト中のいかなるユーザにでも変身してコマンドを実行できるが 、 -g オプションを指定することはできない。一つ目の Runas_List が空で、 二番目だけ指定されている場合は、 sudo を実行するユーザの資格で、グルー プを Runas_List にリストされている任意のグループに設定して、コマンドを 実行することができる。Runas_Spec がまったく指定されていないときは、 root としてコマンドを実行できるが、グループを指定することはできない。 Runas_Spec は、それに続くコマンドに対してデフォルトを定める。それはどう いうことかと言うと、次のようなエントリがあったとしよう。 dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm ユーザ dgb は /bin/ls, /bin/kill, /usr/bin/lprm を実行することができる 。ただし、operator として実行できるだけだ。たとえば、次のようにである。 $ sudo -u operator /bin/ls エントリの後ろの方の Runas_Spec を変更することも可能だ。上のエントリを こんなふうに書き変えたとしよう。 dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm すると、ユーザ dgb は、/bin/ls こそ operator としてだが、 /bin/kill や /usr/bin/lprm は root の資格で実行できるようになる。 dgb が /bin/ls を実行するとき、変身対象ユーザとグループのどちらでも operator にできるように、この記述を拡張することもできる。 dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill, \ /usr/bin/lprm 次の例では、ユーザ tcm が モデムのデバイスファイルにアクセスするコマン ドを dialer グループとして実行できるようにしている。この例では、グルー プしか指定できないことに注意してほしい。コマンドはユーザ tcm の資格で実 行されるのである。 tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu, \ /usr/local/bin/minicom Tag_Spec コマンドは 0 個以上のタグを伴うことができる。タグの値としては、 NOPASSWD, PASSWD, NOEXEC, EXEC, SETENV, NOSETENV の六つが可能である。あ る Cmnd にタグをセットすると、 Cmnd_Spec_List 中のそれ以後の Cmnd は、 反対の意味を持つタグによって変更されないかぎり、そのタグを継承する (す なわち、PASSWD は NOPASSWD を上書きし、NOEXEC は EXEC を上書きするわけ だ)。 NOPASSWD と PASSWD デフォルトでは、sudo はコマンドを実行する前に、ユーザが本人であることを 証明するように求める。この振舞いは NOPASSWD タグによって変更することが できる。 Runas_Spec と同様、NOPASSWD タグも Cmnd_Spec_List 中のそれに続 くコマンドに対してデフォルトを定める。PASSWD の働きは反対であり、振舞い を元に戻したいときに使える。たとえば、 ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm とすれば、ユーザ ray はマシン rushmore 上で認証をしないでも root として /bin/kill, /bin/ls, /usr/bin/lprm を実行できるようになる。もし ray がパ スワードなしで実行できるコマンドを /bin/kill だけに絞りたいのなら、エン トリはこうなるだろう。 ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm ただし、ユーザが exempt_group オプションで指定されているグループに属す る場合は、PASSWD タグが効果を持たないことに注意してほしい。 デフォルトでは、現在使用中のホストに関するユーザのエントリのうちに NOPASSWD タグが指定されているものが一つでもあれば、そのユーザはパスワー ドなしで sudo -l を実行できる。なお、ユーザがパスワードなしで sudo -v を実行できるのは、現在使用中のホストに関するそのユーザのエントリのすべ てで NOPASSWD タグが生きているときのみである。この動作は、 verifypw や listpw オプションによって変更できる。 NOEXEC と EXEC sudo が noexec サポートつきでコンパイルされ、下で稼働しているオペレーテ ィングシステムがそれに対応している場合、 NOEXEC タグを利用すれば、動的 にリンクされた実行ファイルがそこからさらにコマンドを実行するのを防ぐこ とができる。 次の例では、ユーザ aaron は /usr/bin/more と /usr/bin/vi を実行できるが 、シェル・エスケープは利用できない。 aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi NOEXEC がどんなふうに働くのか、お使いのシステムで利用できるかどうか、な どについてさらに詳しく知りたかったら、「シェル・エスケープを防止する」 のセクションを御覧になっていただきたい。 SETENV と NOSETENV 上記のタグは setenv オプションの値をコマンドごとに変更する。注意すべき は、あるコマンドに対して SETENV が設定されていると、コマンドラインから 設定するどんな環境変数も env_check, env_delete, env_keep による規制を受 けないということである。だから、そうした形で環境変数を設定することを許 可するのは、信用できるユーザだけに限るべきだ。なお、マッチするコマンド が ALL だった場合は、暗黙のうちに SETENV タグがそのコマンドに付けられる が、このデフォルトの動作は UNSETENV タグを使えば打ち消すことができる。 ワイルドカード sudoers ファイルでは、ホスト名、コマンドラインのパス名、コマンドライン の引き数にシェル形式のワイルドカード (メタ文字とか glob キャラクタとも 言う) が使用できる。ワイルドカードのマッチングは POSIX の glob(3) と fnmatch(3) ルーティンを用いて行われる。以下のものは正規表現ではないこと に注意してほしい。 * ゼロ個以上の任意の文字にマッチする。 ? 任意の一文字にマッチする。 [...] 指定された範囲の任意の一文字にマッチする。 [!...] 指定された範囲以外の任意の一文字にマッチする。 \x "x" がどんな文字であっても、"x" そのものとして評価する。これは "*", "?", "[", "}" といった特殊文字をエスケープするために使用す る。 使用システムの glob(3) や fnmatch(3) 関数が POSIX の文字クラスに対応し ているなら、文字クラスも使用できる。ただし、':' 文字は、sudoers で特別 な意味を持っているので、エスケープしなければならない。一例を上げると、 /bin/ls [[\:alpha\:]]* 上記は、文字で始まるどんなファイル名にもマッチするだろう。 コマンドのパス名に使われたワイルドカードはフォワードスラッシュ (’/’) に マッチしないことに注意してほしい。だが、コマンドライン引き数とのマッチ ングでは、ワイルドカードはスラッシュとしっかりマッチする。そこで、 /usr/bin/* というコマンドパスは、/usr/bin/who とマッチするが、 /usr/bin/X11/xterm とはマッチしないことになる。 ワイルドカード・ルールの例外 上記ルールには次の例外がある。 "" sudoers ファイルのエントリにおいて、空文字列 "" が唯一のコマン ドライン引き数だった場合は、そのコマンドにいかなる引き数を付け て実行することも許されないということである。 sudoers に他のファイルをインクルードする #include 命令や #includedir 命令を使えば、現在解析中の sudoers ファイル に外部にあるほかの sudoers ファイルをインクルードすることができる。 この方法を使えば、たとえば、サイト全体で使用する sudoers ファイルのほか に、マシンごとのローカルな sudoers ファイルを持つことができる。ここでは 、サイト全体の sudoers を /etc/sudoers とし、マシンごとの方は /etc/sudoers.local とすることにしよう。 /etc/sudoers に /etc/sudoers.local をインクルードするには、 /etc/sudoers 中に次の行を書 き込む。 #include /etc/sudoers.local sudo は解析中この行に出会うと、カレントファイル (/etc/sudoers だ) の処 理を一時中止し、処理の対象を /etc/sudoers.local に切り替える。そして、 /etc/sudoers.local の末尾まで達したら、/etc/sudoers の残りを処理するの だ。インクルードされたファイルがさらに他のファイルをインクルードしても よい。インクルートのネストには 128 ファイルまでというハード・リミットが あって、インクルードファイルのループが起きないようになっている。 ファイル名には %h エスケープが使える。これはホスト名の短縮形を示してい る。たとえば、マシンのホスト名が "xerxes" のとき、 #include /etc/sudoers.%h と書けば、sudo はファイル /etc/sudoers.xerxes をインクルードすることに なる。 #includedir 命令を使えば、sudo.d ディレクトリを作っておいて、システムの パッケージ管理者がパッケージをインストールする過程で sudoers のルールを 記したファイルをそこに入れてやる、といったことが可能になる。たとえば、 次のように書くと、 #includedir /etc/sudoers.d sudo は /etc/sudoers.d にあるファイルを一つづつ読み込む。ただし、末尾が ~ だったり、. 文字を含んでいたりするファイル名はスキップするが、これは パッケージマネージャやエディタが作った、テンポラリファイルやバックアッ プファイルを読み込むような問題を起こさないためである。ファイルは辞書順 にソートされて、解析される。すなわち、/etc/sudoers.d/01_first が /etc/sudoers.d/10_second より前に解析されるということだ。ソートは辞書順 であって、数値の順ではないので、/etc/sudoers.d/1_whoops というファイル があっても、 /etc/sudoers.d/10_second より後でロードされることに注意し てほしい。ファイル名の先頭を 0 で埋めて数字の桁を揃えれば、こうした問題 を回避することができる。 気を付けてほしいが、#include でインクルードされたファイルとは違って (訳 注: visudo は /etc/sudoers を編集するとき、#include で指定したファイル があれば、続けてそれも編集する)、 visudo が #includedir で指定したディ レクトリのファイルまで編集するのは、シンタクスエラーを含むものがあると きだけである。とは言え、visudo を -f オプション付きで実行して、ディレク トリ中のファイルを直接編集することは可能だ。 ほかの特殊文字と予約語 パウンド記号 (’#’) はコメントを示すのに使用される (例外は、#include 命 令の一部であるときや、ユーザ名に関連して現れ、その後に一個以上の数字が 続くときであり、後者の場合は uid と見なされる)。コメント記号とそれに続 くテキストは、行末にいたるまで無視される。 予約語 ALL は組込みのエイリアスであり、何に対してでもマッチする。ALL は 、Cmnd_Alias, User_Alias, Runas_Alias, Host_Alias を代わりに使えるとこ ろなら、どこでも使用できる。ALL という名前のエイリアスを自分で定義しよ うとしてはいけない。組込みのエイリアスの方が、自分で作ったエイリアスよ り優先して使われるからだ。ALL の使用には危険が伴うことがあるのを忘れな いでいただきたい。なぜなら、ALL をコマンドに関して使うと、ユーザにシス テム上のどんなコマンドでも実行することを許してしまうからである。 エクスクラメーションマーク (’!’) は、エイリアスでも Cmnd の前でも論理 not 演算子として使用できる。これによってある値を除外することが可能だ。 しかしながら、組込みエイリアス ALL と ! を組み合わせて、「二三のコマン ド以外のすべての」コマンドの実行をあるユーザに許可しようとしても、思い どおりの動きになることはめったにないことに気を付けてほしい (下記の「セ キュリティに関する注意点」を参照)。 長い行は、行末にバックスラッシュ (’\’) を置けば、継続することができる。 リストにおける要素間やユーザ設定における構文用特殊文字 (’=’, ’:’, ’(’, ’)’) の前後に空白文字 (whitespace)を入れることは、任意である。 次の文字を単語 (ユーザ名とかホスト名とか) の一部として使うときは、バッ クスラッシュ (’\’) でエスケープしなければならない。 ’@’, ’!’, ’=’, ’:’, ’,’, ’(’, ’)’, ’\’ がそれである。 SUDOERS のオプション すでに説明したように、sudo の動作は Default_Entry 行によって変更するこ とができる。 Defaults に与えることのできるパラメータについて、サポート されているもののすべてを、タイプ別にまとめて以下に列挙する。 フラグ: always_set_home これをセットすると、sudo は環境変数 HOME を変身対象ユー ザのホームディレクトリに設定する (-u オプションが使用さ れないかぎり、それは root である)。事実上、暗黙のうちに sudo に -H オプションが常に指定されることになるわけだ。 このフラグはデフォルトでは off である。 authenticate これをセットすると、ユーザはコマンドの実行を許可される 前に、パスワードで (あるいは、ほかの認証方法で) 認証を しなければならない。このデフォルト値は PASSWD や NOPASSWD タグで変更できる。このフラグはデフォルトでは on である。 closefrom_override これをセットすると、ユーザが sudo の -C オプションを使 用できるようになる。-C オプションというのは、sudo が開 いたファイルを閉じていくとき、どのファイル・ディスクリ プタからクローズしていくかというデフォルトの始点を変更 するものだ。このフラグはデフォルトでは off である。 env_editor これをセットすると、visudo はデフォルトのエディタ・リス トを利用する前に、環境変数 EDITOR や VISUAL の値を使用 するようになる。これがセキュリティホールになりかねない ことに注意してほしい。ユーザが root として任意のコマン ドをログに記録されることなく実行できるようになるからだ 。こうした環境変数を利用するときの、 env_editor を有効 にするよりも安全な方法は、 sudoers ファイルの editor オ プションにコロンで区切ったエディタのリストを書いておく ことだ。そうすれば、 visudo が EDITOR や VISUAL を使う のは、それが editor オプションに指定した値とマッチした ときだけになる。このフラグはデフォルトでは off である。 env_reset これをセットすると、sudo は環境を以下の変数のみを含むよ うに設定し直す。すなわち、LOGNAME, SHELL, USER, USERNAME それに SUDO_* である。その後でさらに、sudo を 起動するユーザの環境にある変数のうち、 env_keep や env_check のリストにマッチするものが追加される。 env_keep や env_check のリストにデフォルトでどんな変数 が含まれているかは、root ユーザが sudo を -V オプション 付きで実行すれば、見ることができる。なお、sudoers ファ イルの secure_path オプションが設定されているときは、そ の値が環境変数 PATH として使用されることになる。このフ ラグはデフォルトでは on である。 fqdn sudoers ファイルで完全修飾ホスト名を使用したかったら、 このフラグをセットするとよい。すなわち、myhost ではなく 、 myhost.mydomain.edu を使いたい場合だ。そのときでも、 そうしたければ、短縮形も使える (両方を混ぜて使うことだ ってできる)。気を付けてほしいのは、fqdn を 有効にすると 、sudo は DNS へ問い合わせをしなければならないので、DNS サービスが稼働していない場合、sudo が使えなくなるかもし れないということだ (たとえば、マシンがネットワークに接 続していない場合)。もう一つ気を付けるべきことがある。 DNS が知っているホストの正式名を使わなければならないと いうことだ。言い換えれば、ホストのエイリアス (CNAME の エントリ) を使ってはいけない。パフォーマンスの問題もあ るし、DNS からエイリアスをすべて取得する方法はないから でもある。マシンのホスト名が (hostname コマンドで返って くるものが) すでに完全修飾名になっているならば、fqdn を セットする必要はないだろう。このフラグはデフォルトでは off である。 ignore_dot これをセットすると、環境変数 PATH 中に ’.’ や ’’ (カレ ントディレクトリ) があっても、sudo はそれを無視する。 PATH そのものは変更されない。このフラグはデフォルトでは off である。 ignore_local_sudoers LDAP の方でこのフラグをセットすると、/etc/sudoers の解 析がスキップされる。このフラグは、ローカルにある sudoers ファイルの使用を禁じて、LDAP のみを使うようにし たい企業のためにある。たちの悪いオペレータが /etc/sudoers に手を加えて自分の権限を増やそうとしても、 そうした悪だくみは阻止されるわけだ。このオプションが設 定されているときは、/etc/sudoers ファイルは存在する必要 すらない。このオプションは、マッチする LDAP の具体的な エントリが一つもなかったときに、どう振舞うべきかを sudo に指示するものだから、これを指定した sudoOption は cn=defaults のセクションになければ意味がない。このフラ グはデフォルトでは off である。 insults これをセットすると、不正なパスワードが入力されたとき、 sudo がユーザに悪態をつく。このフラグはデフォルトでは off である。 log_host これをセットすると、ホスト名が (syslog 経由ではない) sudo のログファイルに記録されることになる。このフラグは デフォルトでは off である。 log_year これをセットすると、四桁の年が (syslog 経由ではない) sudo のログファイルに記入されることになる。このフラグは デフォルトでは off である。 long_otp_prompt S/Key や OPIE のような One Time Password (OTP) スキーム を採用しているときにこれを有効にすると、チャレンジをロ ーカルウィンドウにカット・アンド・ペーストしやすいよう に、二行のプロンプトが使用される。デフォルトのプロンプ トほど見栄えはよくないが、こちらの方が便利だと思う人も いる。デフォルトではこのフラグは off である。 mail_always ユーザが sudo を実行するたびに、mailto ユーザにメールを 送る。このフラグはデフォルトでは off である。 mail_badpass sudo を実行するユーザが正しいパスワードを入力しないと、 mailto ユーザにメールを送る。このフラグはデフォルトでは off である。 mail_no_host これをセットすると、sudo を起動したユーザが sudoers フ ァイルに存在するものの、使用中のホストでコマンドの実行 を許可されていない場合、 mailto ユーザにメールを送付す る。このフラグはデフォルトでは off である。 mail_no_perms これをセットすると、sudo を起動したユーザが sudo の使用 を許可されているが、実行しようとしているコマンドが sudoers ファイルのそのユーザのエントリに登録されていな いか、明示的に禁止されている場合、 mailto ユーザにメー ルを送付する。このフラグはデフォルトでは off である。 mail_no_user これをセットすると、sudo を起動したユーザが sudoers フ ァイルに記載されていない場合、mailto ユーザにメールを送 付する。このフラグはデフォルトでは on である。 noexec これをセットすると、sudo を通して実行されるすべてのコマ ンドが、 EXEC タグで無効にされないかぎり、あたかも NOEXEC タグが設定されているかのごとく振舞うようになる。 上述の「NOEXEC と EXEC」の説明、および、このマニュアル の終わりの方にある「シェル・エスケープを防止する」とい うセクションを参照してほしい。このフラグはデフォルトで は off である。 path_info 通常 sudo は、環境変数 PATH 中にコマンドが見付からない と、ユーザにそのことを知らせる。これを利用すれば、一般 ユーザにアクセス権のない実行ファイルのありかについて情 報を収集できるという理由から、この動作を無効にしたいサ イトもあるかもしれない。その場合の欠点は、実行ファイル が単にユーザの PATH 中になかっただけの場合でも、実行の 許可がないと sudo がユーザに告げることになって、実情が わかりにくいかもしれないことである。このフラグはデフォ ルトでは on である。 passprompt_override 通常、passprompt オプションによって指定されたパスワード プロンプトが使用されるのは、PAM のようなシステムが用意 しているパスワードプロンプトが "Password:" という文字列 にマッチしているときだけである。passprompt_override を セットすると、 passprompt が無条件で使われることになる 。このフラグはデフォルトでは off である。 preserve_groups デフォルトでは、sudo は所属グループの初期値として、変身 対象ユーザが所属しているグループのリストを設定する。 preserve_groups をセットすると、sudo を実行するユーザの 所属グループのリストが、変更されずにそのまま維持される 。とは言え、実グループ ID や実効グループ ID が変身対象 ユーザのそれに設定されることに変わりはない。このフラグ はデフォルトでは off である。 pwfeedback ほかのたいていの Unix プログラムと同様、sudo はパスワー ドを読み込むとき、デフォルトでは、ユーザが Return (また は Enter) キーを押すまで、エコーを off にする。この動作 にとまどうユーザが存在する。彼らには sudo が急に反応し なくなったように見えるのだ。 pwfeedback をセットすると 、ユーザがキーを押すたびに、sudo が目に見える反応を返す ようになる。これには、セキュリティ上の問題があることに 注意してほしい。横で見ている人が、打ち込まれたパスワー ドの文字数を特定することができるかもしれないのだ。この フラグはデフォルトでは off である。 requiretty これをセットすると、sudo が実行されるのは、ユーザが実際 の tty にログインしたときだけになる。すなわち、sudo を 実行できるのは、ログイン・セッションからだけであって、 cron(8) や cgi-bin スクリプトといった、ほかの方法を介し て実行することはできないということだ。このフラグは、デ フォルトでは off である。 root_sudo これをセットすると、root も sudo を実行できるようになる 。このフラグを無効にすると、ユーザがたとえば "sudo sudo /bin/sh" といったように sudo コマンドを連鎖的に使って、 ルートシェルを獲得することができなくなる。ところで、 root_sudo が off だと、root が sudoedit まで実行できな くなることに注意してほしい。 root_sudo を無効にしても、 セキュリティが実際に向上するわけではない。このフラグが 存在しているのは、もっぱら歴史的な理由からなのだ。この フラグはデフォルトでは on である。 rootpw これをセットすると、sudo はプロンプトで、起動したユーザ のパスワードではなく、root のパスワードを要求するように なる。このフラグはデフォルトでは off である。 runaspw これをセットすると、sudo はプロンプトで、起動したユーザ のパスワードではなく、sudoers ファイルの runas_default オプションが定義しているユーザーの (デフォルトでは root である) パスワードを要求する。このフラグはデフォルトで は off である。 set_home これがセットされているとき、sudo を -s オプション付きで 起動すると、環境変数 HOME が変身対象ユーザの (-u オプシ ョンが使用されないかぎり、それは root である) ホームデ ィレクトリに設定される。すなわち、 -s オプションが -H オプションを事実上兼ねることになるわけだ。このフラグは デフォルトでは off である。 set_logname 通常 sudo は環境変数 LOGNAME, USER, USERNAME を変身対象 ユーザの名前 (-u オプションが指定されていない場合、普通 は root) にセットする。しかし、プログラムによっては (た とえば、 RCS リビジョンコントロールシステムがその一つだ が) ユーザが実際には誰であるかを判定するのに LOGNAME を 使用していることがあるので、この振舞いを変更することが 望ましい場合もある。 set_logname オプションに ’!’ を付 けて否定することで、それができる。なお env_reset オプシ ョンを無効にしていない場合、 env_keep リストの項目が set_logname による値を上書きすることになるので、注意し てほしい。このフラグはデフォルトでは on である。 setenv これをセットすると、ユーザがコマンドラインから env_reset オプションを無効にできるようになる。さらに、 コマンドラインから設定する環境変数が env_check, env_delete, env_keep による制限を受けなくなる。それ故、 そのようなやり方で変数を設定することを許可するのは、信 用できるユーザのみに限るべきだ。このフラグはデフォルト では off である。 shell_noargs これがセットされているとき、sudo を引き数なしで起動する と、 sudo は -s オプションが指定されたかのように振舞う 。すなわち、root ユーザとしてシェルを実行するわけだ (シ ェルは、環境変数 SHELL がセットされていれば、それによっ て決まるし、セットされていなければ、sudo を起動したユー ザの /etc/passwd エントリに登録されたものになる)。この フラグはデフォルトでは off である。 fast_glob 通常 sudo はパス名のマッチングをするとき、glob(3) 関数 を使用して、シェル・スタイルのワイルドカード展開 (glob) を行う。しかし、 glob(3) はファイルシステムにアクセスす るので、指定パターンによっては、作業を完了するまでに時 間がかかることがある。必要な時にマウントするようになっ ている (つまりオートマウントの) ネットワーク・ファイル ・システムを参照するときは、とりわけ時間がかかる。 fast_glob オプションを指定すると、sudo が fnmatch(3) 関 数を使うようになるが、こちらの関数はマッチングの際にフ ァイルシステムにアクセスしない。fast_glob の欠点は、 ./ls や ../bin/ls のような相対パスに対するマッチができ ないことである。このフラグはデフォルトでは off である。 stay_setuid 通常 sudo がコマンドを実行するとき、実 UID と実効 UID は変身対象ユーザ (デフォルトでは root) のものにセットさ れる。このオプションはその振舞いを変更して、sudo を起動 したユーザの UID が、そのまま実 UID として残るようにす る。言い換えると、sudo が setuid ラッパーとして動作する ようになるわけだ。プログラムを setuid で動かすと、危険 をもたらしかねないという理由から、ある種の機能を使えな いようにしているシステムでは、このオプションが役に立つ かもしれない。このオプションは、 setreuid() 関数なり setresuid() 関数なりを持っているシステムでのみ有効であ る。このフラグはデフォルトでは off である。 targetpw これをセットすると、sudo はプロンプトで、起動したユーザ のパスワードではなく、-u オプションで指定されたユーザ ( デフォルトでは root) のパスワードを要求する。この設定を すると、-u オプションの引き数として、 passwd データベー スに登録されていない uid が使えなくなることに注意してほ しい。このフラグはデフォルトでは off である。 tty_tickets これをセットすると、ユーザは tty ごとに認証をしなければ ならなくなる。 sudo は通常、チケットディレクトリ (訳注 :たとえば /var/run/sudo) にある、sudo を実行しているユ ーザと同じ名前のディレクトリを認証に使用する。しかし、 このフラグが有効になっている場合は、そのディレクトリに ある、ユーザがログインしている tty に対応する名前のファ イルを使用することになるのだ。このフラグはデフォルトで は off である。 umask_override これをセットすると、sudo は umask を sudoers の umask オプションで指定されたとおりの値に、変更を加えることな く設定する。このことによって、ユーザ自身の umask 値より もっと緩やかな umask 値を sudoers で指定することが可能 になる。sudo の昔の動作と同じになるわけだ。 umask_override をセットしない場合、現在の sudo は umask を、ユーザの umask 値と sudoers で指定した umask 値との ビット和に設定することになっている。このフラグはデフォ ルトでは off である。 visiblepw デフォルトでは、ユーザがパスワードを入力しなければなら ないときに、使用しているターミナルでエコーの抑制ができ なかったら、 sudo は実行を拒否するようになっている。こ れに対し、 visiblepw フラグが設定されていると、パスワー ドがスクリーンに表示されてしまう場合でも、sudo はプロン プトを出して、パスワードを求める。この動作によって、 rsh(1) は tty を割り当てないにもかかわらず、 "rsh somehost sudo ls" といった操作の実行が可能になるわけだ 。このフラグはデフォルトでは off である。 整数: closefrom sudo はコマンドを実行する前に、標準入力、標準出力、標準 エラー (すなわち、ファイルディスクリプタ 0-2 である) を 除いて、オープンしたすべてのファイル・ディスクリプタを クローズする。 closefrom オプションを使用すると、0-2 以 外のどのファイル・ディスクリプタからクローズして行くか を指定することができる。デフォルトは 3 である。 passwd_tries sudo が「失敗」をログに記録して終了する前に、ユーザがパ スワードを入力できる回数。デフォルトは 3。 真偽値としても使用できる整数: loglinelen sudo 用ログファイルの一行あたりの文字数。この値は、ログ ファイルを見やすくするために改行する位置を決めるのに使 用される。この値は、 syslog 経由のログファイルには影響 せず、直接ファイルにログを書き出すときのみ効果がある。 デフォルトは 80 である (改行をしないようにするには、値 を 0 にするか、頭に ’!’ を付けて、このオプションを否定 する)。 passwd_timeout sudo のパスワードプロンプトが時間切れになるまでの分単位 の時間。デフォルトは 5 である。これを 0 にセットすると 、パスワードプロンプトが時間切れなしになる。 timestamp_timeout sudo がパスワードを再び要求するようになるまでの時間を分 単位で指定する。デフォルトでは 5 である。これを 0 にセ ットすると、毎回パスワードを要求するようになる。0 より 小さい値にセットした場合は、ユーザのタイムスタンプが期 限切れになることがない。ユーザが sudo -v と sudo -k を 実行することによって、タイムスタンプを自分で作ったり、 消したりできるようにしたかったら、この手を使えばよい。 umask コマンドを実行しているときに使用する umask 値。ユーザの umask 値をそのまま使いたかったら、’!’ を頭に付けて、こ のオプションを否定するか、0777 にセットする。このオプシ ョンの値が 0777 以外の場合、実際に使用される umask 値は 、ユーザの umask 値と umask オプションで指定する umask 値とのビット和になる。そのことによって、sudo がコマンド を実行するときの umask 値が、ユーザの umask 値より低く ならないようになっているわけだ。なお、umask オプション のデフォルトの値は、0022 である。 PAM を使用しているシ ステムでは、 PAM のデフォルト設定で umask 値を指定する ことができるが、その場合は、それが sudoers で指定した値 を上書きすることに注意してほしい。 文字列: badpass_message ユーザが不正なパスワードを入力したときに表示するメッセ ージ。 insults フラグが有効になっていないかぎり、デフォ ルトは「Sorry, try again.」である。 editor visudo で使用できるエディタをコロン (’:’) で区切ったリ スト。 visudo は、可能ならば、ユーザの EDITOR 環境変数 と一致したエディタを選択する。それができないときは、こ のリストにあるエディタで、実際に存在し、かつ実行可能な 最初のエディタを使用する。デフォルトは使用システムにお ける vi のパスである。 mailsub mailto ユーザに送付するメールの件名。エスケープ文字 %h はマシンのホスト名に展開される。デフォルトは「*** SECURITY information for %h ***」。 noexec_file ライブラリ関数 execv(), execve(), fexecve() のダミー版 (エラーを返すだけの関数) が入っている共有ライブラリのパ ス。これは、LD_PRELOAD やそれに相当するものをサポートし ているシステムで noexec 機能を実現するために使用される 。デフォルトでは /usr/local/libexec/sudo_noexec.so にな っている。 passprompt パスワードを要求するときに使用するデフォルトのプロンプ ト。-p オプションや環境変数 SUDO_PROMPT によって変更す ることができる。以下のパーセント (‘%’) エスケープが使用 できる。 %H ドメイン名付きのローカルホスト名に展開 (マシンのホ スト名が完全修飾名か、 fqdn オプションがセットされ ている場合に有効) %h ドメイン名なしのローカルホスト名に展開 %p パスワードを要求されているユーザ名に展開 (sudoers ファイルの rootpw, targetpw, runaspw フラグを尊重す る) %U 変身対象ユーザの (デフォルトでは root) ログイン名に 展開 %u sudo を起動するユーザのログイン名に展開 %% 連続した二個の % は、一個の % 文字そのものを意味す る デフォルトの値は「Password:」である。 runas_default コマンドラインで -u オプションが指定されていないときの 、デフォルトの変身対象ユーザ。デフォルトでは root にな っている。 runas_default をセットするなら、Runas_Alias を指定するよりも前にやらなければならないことに注意する こと。 syslog_badpri ユーザが認証に失敗したときに使用する syslog の優先順位 (priority)。デフォルトでは alert になっている。 syslog_goodpri ユーザが認証に成功したときに使用する syslog の優先順位 (priority)。デフォルトでは notice になっている。 sudoers_locale sudoers ファイルを解析するときに使用するロケール。ロケ ールの変更は、 sudoers の解釈に影響があるかもしれないの で、注意してほしい。デフォルトでは "C" になっている。 timestampdir sudo がタイムスタンプ・ファイルを置くディレクトリ。デフ ォルトは /var/run/sudo である。 timestampowner タイムスタンプ・ディレクトリとそこに置かれるタイムスタ ンプの所有者。デフォルトは root である。 真偽値としても使用できる文字列: askpass askpass で指定するのは、ヘルパー・プログラムの絶対パスであ る。このヘルパー・プログラムは、ターミナルを利用できないと きに、ユーザのパスワードを読み込むために使用する。たとえば 、sudo が (テキストベースではなく) グラフィカルなアプリケー ションから実行されるといった場合だ。askpass で指定されたヘ ルパー・プログラムは、渡された引き数をプロンプトとして表示 し、ユーザのパスワードを標準出力に書き出すべきである。 askpass の値は、環境変数 SUDO_ASKPASS で上書きすることがで きる。 env_file env_file オプションでファイルの絶対パスを指定すると、実行す るプログラムの環境として設定する変数をそのファイルに格納し ておくことができる。このファイルのエントリは VARIABLE=value か export VARIABLE=value の形でなければならない。変数の値を シングルクォートやダブルクォートで囲んでもよい。このファイ ルに含まれる変数は、env_keep や env_check のような sudo の ほかの環境設定の影響を受ける。 exempt_group このグループのユーザはパスワードの入力や secure_path による PATH の限定を免除されている。このオプションはデフォルトでは セットされていない。 lecture sudo はパスワードプロンプトに添えて簡単な訓戒を表示すること ができる。このオプションはその訓戒をいつ表示するかを決定す る。以下の値が可能である。 always いつでも必ず訓戒を表示する never 訓戒を一切表示しない。 once ユーザがはじめて sudo を実行したときだけ表示する。 値を指定しないと、once を指定したことになる。頭に ’!’ を付 けて、このオプションを否定すると、値に never が使用される。 デフォルトの値は once である。 lecture_file 標準の訓戒の代わりに使用する sudo の訓戒を書き込んだファイ ルがあるなら、 lecture_file でそのパスを指定する。sudo はデ フォルトでは、プログラムに埋め込まれた訓戒を使用する。 listpw このオプションは、sudo を -l オプション付きで実行したとき、 ユーザがパスワードを要求されるのは、どんな場合かを決定する 。以下のような値が可能である。 all パスワードを入力しないですむためには、sudoers ファ イルの使用中のホストに対する当該ユーザのエントリの すべてに NOPASSWD タグが設定されていなければならな い。 always ユーザは -l オプションを使用する際に必ずパスワード を入力しなければならない。 any パスワードを入力しないですむためには、sudoers ファ イルの使用中のホストに対する当該ユーザのエントリの 少なくとも一つに NOPASSWD タグが設定されていなけれ ばならない。 never ユーザは -l オプションを使用する際にパスワードを入 力する必要がまったくない。 値を指定しないと、値は any だと見なされる。’!’ を頭に付けて 、このオプションを否定すると、値に never が使われることにな る。デフォルトは any である。 logfile sudo のログファイルのパス (syslog 経由のログファイルではな い)。パスを指定すると、ファイルへのロギングが on になり、 ’!’ を頭に付けて、このオプションを否定すると、off になる。 デフォルトでは、sudo は syslog 経由でログを取る。 mailerflags メーラを起動するときに使用するフラグ。デフォルトは -t にな っている。 mailerpath 警告メールの送信に使うメール・プログラムのパス。デフォルト は configure したときに見つかった sendmail のパス。 mailfrom 警告メールやエラー・メールを送るとき、差出人として使用する アドレス。 sudo が @ 記号を解釈しないようにするため、アドレ スはダブルクォート (") で囲むべきである。デフォルトは、sudo を実行するユーザの名前。 mailto 警告メールやエラー・メールを送付する宛先のアドレス。sudo が @ 記号を解釈しないようにするため、アドレスはダブルクォート (") で囲むべきである。デフォルトは root になっている。 secure_path sudo から実行されるあらゆるコマンドが使用するパス。 sudo を 実行するユーザが、無難な環境変数 PATH を使っているかどうか 確信が持てないなら、このオプションを使用するとよいだろう。 もう一つの使用法は、「root のパス」と「一般ユーザのパス」を 別のものにしておきたい場合だ。ユーザが exempt_group オプシ ョンで指定したグループに属していると、そのユーザは secure_path の影響を受けない。このオプションは、デフォルト ではセットされていない。 syslog syslog を使ってログを取っている場合の syslog のファシリティ (syslog 経由でログを取らない場合は、’!’ を頭に付けて、この オプションを否定する)。デフォルトは authpriv になっている。 verifypw このオプションは、sudo を -v オプション付きで実行したとき、 ユーザがパスワードを要求されるのは、どんな場合かを決定する 。次のような値が可能である。 all パスワードを入力しないですむためには、sudoers ファ イルの使用中のホストに対する当該ユーザのエントリの すべてに NOPASSWD タグが設定されていなければならな い。 always ユーザは -v オプションを使用する際に必ずパスワード を入力しなければならない。 any パスワードを入力しないですむためには、sudoers ファ イルの使用中のホストに対する当該ユーザのエントリの 少なくとも一つに NOPASSWD タグが設定されていなけれ ばならない。 never ユーザは -v オプションを使用する際にパスワードを入 力する必要がまったくない。 値を指定しないと、値は all だと見なされる。’!’ を頭に付けて 、このオプションを否定すると、値に never が使われることにな る。デフォルトは all である。 真偽値としても使用できるリスト: env_check 変数の値に % や / が含まれる場合に、ユーザの環境から取 り除かれる環境変数。この機能は、出来のよくないプログラ ムに見られる printf 形式のフォーマットの脆弱性に対処す るために利用できる。このオプションの引き数は、ダブルク ォートで囲まれ、スペースで区切られたリストでもよく、ダ ブルクォートなしの単一の値でもよい。リストは、=, +=, -=, ! 演算子を使って、それぞれ置き換えたり、追加したり 、削除したり、無効にしたりすることができる。env_check で指定された変数は、 env_reset オプショの有効・無効にか かわらず、上記のチェックにパスすれば、環境に保存される ことになる。チェックされる環境変数のデフォルトのリスト は、root ユーザが sudo に -V オプションを付けて実行した ときに表示される。 env_delete env_reset オプションが無効になっているときに、ユーザの 環境から取り除かれる環境変数。このオプションの引き数は 、ダブルクォートで囲まれ、スペースで区切られたリストで もよく、ダブルクォートなしの単一の値でもよい。リストは 、=, +=, -=, ! 演算子を使って、それぞれ置き換えたり、追 加したり、削除したり、無効にしたりすることができる。取 り除かれる環境変数のデフォルトのリストは、root ユーザが sudo に -V オプションを付けて実行したときに表示される。 留意すべきは、オペレーティングシステムには、危険をもた らしかねない変数をいかなる setuid プロセス (sudo もその 一つ) の環境からも取り除くことにしているものが多いとい うことである。 env_keep env_reset オプションが有効になっているときでも、ユーザ の環境にそのまま保存される環境変数。このオプションによ って、sudo から生み出されるプロセスが受け取る環境を、き め細かく制御することが可能になる。このオプションの引き 数は、ダブルクォートで囲まれ、スペースで区切られたリス トでもよく、ダブルクォートなしの単一の値でもよい。リス トは、 =, +=, -=, ! 演算子を使って、それぞれ置き換えた り、追加したり、削除したり、無効にしたりすることができ る。保存される変数のデフォルトのリストは、root ユーザが sudo に -V オプションを付けて実行したときに表示される。 syslog(3) 経由でログを記録する場合、sudo は syslog のファシリティ (facility: syslog パラメータの値) として次の値を受け付ける。authpriv ( ただし、OS がサポートしているならばだが)、 auth, daemon, user, local0, local1, local2, local3, local4, local5, local6, local7。syslog の優先順 位 (priority) については、次のものに対応している。alert, crit, debug, emerg, err, info, notice, warning。 ファイル /etc/sudoers 誰が何を実行できるかのリスト /etc/group ローカルのグループファイル /etc/netgroup ネットワークグループのリスト 用例 以下は sudoers エントリの見本である。正直なところ、いささか凝りすぎの部 分もある。まず最初にエイリアスを定義する。 # 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 :\ SGI = grolsch, dandelion, black :\ ALPHA = widget, thalamus, foobar :\ 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,\ /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, \ /usr/local/bin/tcsh, /usr/bin/rsh, \ /usr/local/bin/zsh Cmnd_Alias SU = /usr/bin/su Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less 以下では、コンパイル時に埋め込まれたデフォルト値のいくつかを変更してい る。 sudo には syslog(3) 経由でログを記録し、ファシリティにはすべての場 合に auth を使用させたい。フルタイムのスタッフには sudo の訓戒を出さな いようにしたい。ユーザ millert はパスワードを入力しないでよい。コマンド を root として実行するときは、環境変数 LOGNAME, USER, USERNAME を変更し たくない。さらに、 SERVERS という Host_Alias に属するマシンでは、ローカ ルなログファイルを副本として作り、ログの記入事項は数年に渡って保存され るので、ログの各行に間違いなく年度が入るようにする。最後に PAGERS とい う Cmnd_Alias に属するコマンド (/usr/bin/more, /usr/bin/pg, /usr/bin/less) については、シェル・エスケープを無効にする。 # 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 ユーザ設定が、誰が何を実行できるかを実際に決めている部分だ。 root ALL = (ALL) ALL %wheel ALL = (ALL) ALL root と wheel グループのすべてのユーザには、どのホストでも任意のユーザ としていかなるコマンドでも実行することを認める。 FULLTIMERS ALL = NOPASSWD: ALL フルタイムのシステム管理者 (millert, mikef, dowdy) は、どのホストでも任 意のコマンドを認証なしで実行できる。 PARTTIMERS ALL = ALL パートタイムのシステム管理者 ((bostley, jwfox, crawl) は、どのホストで も任意のコマンドを実行できるが、その際に認証をしなければならない (この エントリには NOPASSWD タグが指定されていないので)。 jack CSNETS = ALL ユーザ jack は、CSNETS というエイリアスに属するマシンで任意のコマンドを 実行できる (すなわち、ネットワークが 128.138.243.0, 128.138.204.0, 128.138.242.0 のマシンだ)。この内、 128.138.204.0 にのみ class C のネッ トワークであることを示す明示的な (CIDR 表記の) netmask がある。CSNETS のほかのネットワークについては、ローカルマシンの netmask がマッチングの 際に使われることになる。 lisa CUNETS = ALL ユーザ lisa はエイリアスが CUNETS のいかなるホストでも任意のコマンドを 実行することができる (すなわち、 128.138.0.0 という class B ネットワー クのマシンだ)。 operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\ sudoedit /etc/printcap, /usr/oper/bin/ ユーザ operator は、用途が簡単な保守管理に限定されたコマンドを実行でき る。この場合それは、バックアップしたり、プロセスを kill したり、印刷シ ステムを操作したり、システムをシャットダウンしたりするのに関係するコマ ンドと、/usr/oper/bin/ ディレクトリにある任意のコマンドである。 joe ALL = /usr/bin/su operator ユーザ joe は su(1) を使って operator になることしかできない。 %opers ALL = (: ADMINGRP) /usr/sbin/ opers グループのユーザは、/usr/sbin/ にあるコマンドを自分自身の資格で、 Runas_Alias ADMINGRP に属する任意のグループ (すなわち、adm か oper グル ープ) として実行できる。(訳注: 実のところ、sudo-1.7.2p1 では、 /etc/sudoers で変身可能グループに Runas_Alias をまだ指定できないようだ 。今のところ、この例で言うなら、ADMINGRP ではなく、adm や oper を直接指 定しなければならない。) pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root ユーザ pete は HPPA に属するマシンで root 以外なら誰のパスワードでも変 更することを許されている。上記の指定は、 passwd(1) がコマンドラインで複 数のユーザ名を受け付けないことを前提としている点に注意してほしい。 bob SPARC = (OP) ALL : SGI = (OP) ALL ユーザ bob は SPARC や SGI に属するマシンで Runas_Alias OP に登録されて いる任意のユーザとして (root と operator である) どんなコマンドでも実行 できる。 jim +biglab = ALL ユーザ jim は biglab ネットグループに属するマシンでどんなコマンドでも実 行できる。sudo は、"biglab" に ’+’ の接頭辞が付いているので、それをネッ トグループだと認識する。 +secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser secretaries ネットグループのユーザは、ユーザの追加や削除はもちろん、プ リンタの管理にも協力する必要がある。そこで、すべてのマシンでその種のコ マンドの実行を認められている。 fred ALL = (DB) NOPASSWD: ALL ユーザ fred は Runas_Alias DB の任意のユーザとして (oracle か sybase だ) パスワードを入力しないでもコマンドを実行することができる。 john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* ユーザ john は ALPHA に属するマシンで su(1) を使って root 以外の誰にで もなることができるが、su にオプションを指定することは許されていない。 jen ALL, !SERVERS = ALL ユーザ jen は Host_Alias SERVERS に属するマシン (master, mail, www, ns) を除くいかなるマシンでも任意のコマンドを実行できる。 jill SERVERS = /usr/bin/, !SU, !SHELLS jill は Host_Alias SERVERS のいかなるマシンでも /usr/bin/ ディレクトリ にある任意のコマンドを実行できるが、SU や SHELLS という Cmnd_Aliases に 属するコマンドは実行できない。 steve CSNETS = (operator) /usr/local/op_commands/ ユーザ steve はディレクトリ /usr/local/op_commands/ にある任意のコマン ドを実行できるが、operator というユーザとして実行できるだけだ。 matt valkyrie = KILL matt も自分用のワークステーション valkyrie でハングしたプロセスの kill ぐらいはできる必要がある。 WEBMASTERS www = (www) ALL, (root) /usr/bin/su www ホスト www で User_Alias WEBMASTERS に属するいかなるユーザも (will, wendy, wim だ)、ユーザ www (web ページの所有者) として任意のコマンドを 実行することができる。単に su(1) で www になってもよい。 ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\ /sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM いかなるユーザも Host_Alias が CDROM のマシンで (orion, perseus, hercules)、パスワードを入力することなく CD-ROM をマウント、アンマウント できる。上記のコマンドを打ち込むのはユーザにとっていささか面倒なので、 シェルスクリプトとしてカプセル化してしまうのがよいだろう。 [訳注]: 当然と言えば当然だが、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 しか読まないの だから。 それでは、何故、上記の「用例」で自ホスト以外の設定が行われてい るのか? そもそも、sudoers の書式で自ホスト以外のホストを指定で きるのは、何故なのか? それは、管理しているサイトのすべてのホス トの設定を記した sudoers ファイルを一つ作って、それをすべてのホ ストにコピーして使う、そういった使い方を想定しているからだ。も し、サイト中のすべてのホストの設定を一ヶ所にまとめて置き、それ をすべてのホストに共有させたいのなら (すなわち、sudo の設定の集 中管理がしたいのなら)、LDAP の採用を考えるべきである。 セキュリティに関する注意点 一般的に言って、演算子 ’!’ を使用して ALL からコマンドの「引き算」をす ることは、あまり効果がない。ユーザは実行したいコマンドを名前を変えてコ ピーし、それからそれを実行するするといったちょっとした手段で、裏をかく ことができるからだ。たとえば、 bill ALL = ALL, !SU, !SHELLS という行は、SU や SHELLS に列記されているコマンドの bill による実行を本 当に阻止することにはならない。なぜなら、bill としては、そうしたコマンド を単に名前を変えてコピーすればよいし、エディタやほかのプログラムからシ ェル・エスケープを利用することもできるからだ。だから、この種の制限はや った方がまし程度に考えておくべきだ (そして、しっかりした運用方針によっ て制限の実効力を上げるべきである)。 シェル・エスケープを防止する sudo があるプログラムを実行してしまうと、そのプログラムは、ほかのプログ ラムの実行も含めて、何でも自由に好きなことができる。このことがセキュリ ティ上の問題になりかねないのは、プログラムがシェル・エスケープを許して いるのは珍しいことではなく、そのためにユーザが sudo のアクセス制御やロ ギングをすり抜けることが可能になるからだ。よく使うプログラムでシェル・ エスケープを許しているものには、次のようなものがある。 (当然ながら) シ ェル、エディタ、ページャ、メーラ、ターミナル。 この問題に対処するには、基本的に二つの方法がある。 制限 ユーザに任意のコマンドの実行を許すようなコマンドに対して、ユ ーザがアクセスできないようにする。エディタの場合は、制限モー ドと称して、シェル・エスケープが使えないモードを持っているも のも多い。もっとも、sudo 経由でエディタを使うのなら、 sudoedit を使用する方がよりすぐれた対策である。シェル・エスケ ープを提供するプログラムはたくさんあるので、それを提供しない プログラムのみを使用するようにユーザを制限するのは、たいてい 実現不可能である。 noexec 共有ライブラリをサポートしている多くのシステムには、環境変数 (たいていは LD_PRELOAD) で別の共有ライブラリを指定することに よって、デフォルトのライブラリ関数を置き換える能力がある。そ ういったシステムでは、sudo の noexec 機能を使えば、 sudo から 実行されるプログラムが、何かほかのプログラムを実行するのを防 ぐことができる。とは言え、これが当てはまるのは、動的にリンク されたネイティブなプログラムだけだということに気を付けてほし い。静的にリンクされたプログラムや、バイナリ・エミュレーショ ンのもとで動くほかの OS のプログラムには効果がない。 sudo が noexec に対応しているかどうかを知りたかったら、 root ユーザになって次のように実行してみればよい。 sudo -V | grep "dummy exec" その出力にこんなふうに始まる行があれば、 File containing dummy exec functions: そのときは、たぶん sudo が標準ライブラリにある exec ファミリ ーの関数を、単にエラーを返すだけの自分自身の関数で置き換えら れるということだ。残念ながら、noexec が有効かどうか、コンパイ ル時に確かめる絶対確実な方法はない。noexec は SunOS, Solaris, *BSD, Linux, IRIX, Tru64 UNIX, MacOS X, HP-UX 11.x で使えるは ずだ。 AIX と UnixWare では使えないことがわかっている。環境変 数 LD_PRELOAD をサポートしているたいていの OS なら、 noexec が使えると思う。使用しているオペレーティングシステムのマニュ アルページを調べて、ダイナミック・リンカについて (通例 ld.so, ld.so.1, dyld, dld.sl, rld, loader といった名前になっている) LD_PRELOAD がサポートされているかどうか確認してほしい。 あるコマンドに対して noexec を有効にするには、上記「ユーザの 設定」セクションで述べたように、NOEXEC タグを使用する。そのと きの例を再掲しよう。 aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi この例では、ユーザ aaron 対して、noexec を有効にした上で、 /usr/bin/more と /usr/bin/vi の実行を許可している。このように すれば、この二つのコマンドから (シェルのような) ほかのコマン ドを実行することができなくなるわけだ。使用しているシステムが noexec に対応する能力があるかどうか、よくわからない場合は、取 りあえず noexec を試して、効果があるかどうか確かめてみればよ い。それならいつだってできるはずだ。 注意してほしいが、シェル・エスケープの禁止は万能薬ではない。ルートの権 限で動いているプログラムには、ほかにも、危険性のあるさまざまな作業 (フ ァイルの中身を入れ替えるとか、上書きするとか) が可能であり、思いがけず に権限を拡大してしまうこともありえるのだ。特にエディタについて言うと、 ユーザには sudoedit を実行する許可を与えるのが、より安全な方法である。 関連項目 rsh(1), su(1), fnmatch(3), glob(3), sudo(8), visudo(8) 警告 sudoers ファイルの編集には、必ず visudo コマンドを使うべきだ。そうすれ ば、visudo がファイルをロックし、文法のチェックをやってくれる。sudoers ファイルに文法的な間違いがあると、 sudo が動かないので、sudoers ファイ ルには文法エラーが絶対にあってはならないのだ。 ネットグループを (ユーザについてではなく) マシンについて使用し、 netgroup ファイルに完全修飾ホスト名を記載する場合は (たいていそうするも のだが)、そのマシンのホスト名を hostname コマンドが出力する通りの完全修 飾名で書くか、さもなければ sudoers ファイルで fqdn オプションを使うかし なければならない。 バグ sudo にバグを発見したと思ったら、下記のページにアクセスして、バグレポー トを提出していただきたい。 http://www.sudo.ws/sudo/bugs/ サポート ある程度の無料サポートが sudo-users メーリングリストを通して利用できる 。購読やアーカイブの検索には下記 URL を御覧になること。 http://www.sudo.ws/mailman/listinfo/sudo-users 免責 sudo は「現状のまま」提供される。明示的な、あるいは黙示的ないかなる保証 も、商品性や特定目的への適合性についての黙示的な保証を含め、またそれの みに止まらず、これを否認する。詳細な全文については、 sudo と一緒に配布 されている LICENSE ファイルや下記 Web ページを御覧いただきたい。 http://www.sudo.ws/sudo/license.html 1.7.2p1 June 30, 2009 SUDOERS(5)
SUDOERS(5) BSD File Formats Manual SUDOERS(5) NAME sudoers - default sudo security policy module DESCRIPTION The sudoers policy module determines a user’s sudo privileges. It is the default sudo policy plugin. The policy is driven by the /etc/sudoers file or, optionally in LDAP. The policy format is described in detail in the SUDOERS FILE FORMAT section. For information on storing sudoers pol- icy information in LDAP, please see sudoers.ldap(5). Authentication and logging The sudoers security policy requires that most users authenticate them- selves before they can use sudo. A password is not required if the invoking user is root, if the target user is the same as the invoking user, or if the policy has disabled authentication for the user or com- mand. Unlike su(1), when sudoers requires authentication, it validates the invoking user’s credentials, not the target user’s (or root’s) cre- dentials. This can be changed via the rootpw, targetpw and runaspw flags, described later. If a user who is not listed in the policy tries to run a command via sudo, mail is sent to the proper authorities. The address used for such mail is configurable via the mailto Defaults entry (described later) and defaults to root. Note that mail will not be sent if an unauthorized user tries to run sudo with the -l or -v option. This allows users to determine for themselves whether or not they are allowed to use sudo. If sudo is run by root and the SUDO_USER environment variable is set, the sudoers policy will use this value to determine who the actual user is. This can be used by a user to log commands through sudo even when a root shell has been invoked. It also allows the -e option to remain useful even when invoked via a sudo-run script or program. Note, however, that the sudoers lookup is still done for root, not the user specified by SUDO_USER. sudoers uses time stamp files for credential caching. Once a user has been authenticated, the time stamp is updated and the user may then use sudo without a password for a short period of time (5 minutes unless overridden by the timeout option). By default, sudoers uses a tty-based time stamp which means that there is a separate time stamp for each of a user’s login sessions. The tty_tickets option can be disabled to force the use of a single time stamp for all of a user’s sessions. sudoers can log both successful and unsuccessful attempts (as well as errors) to syslog(3), a log file, or both. By default, sudoers will log via syslog(3) but this is changeable via the syslog and logfile Defaults settings. sudoers also supports logging a command’s input and output streams. I/O logging is not on by default but can be enabled using the log_input and log_output Defaults flags as well as the LOG_INPUT and LOG_OUTPUT command tags. Command environment Since environment variables can influence program behavior, sudoers pro- vides a means to restrict which variables from the user’s environment are inherited by the command to be run. There are two distinct ways sudoers can deal with environment variables. By default, the env_reset option is enabled. This causes commands to be executed with a new, minimal environment. On AIX (and Linux systems without PAM), the environment is initialized with the contents of the /etc/environment file. The new environment contains the TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_* variables in addi- tion to variables from the invoking process permitted by the env_check and env_keep options. This is effectively a whitelist for environment variables. If, however, the env_reset option is disabled, any variables not explic- itly denied by the env_check and env_delete options are inherited from the invoking process. In this case, env_check and env_delete behave like a blacklist. Since it is not possible to blacklist all potentially dan- gerous environment variables, use of the default env_reset behavior is encouraged. In all cases, environment variables with a value beginning with () are removed as they could be interpreted as bash functions. The list of environment variables that sudo allows or denies is contained in the out- put of “sudo -V” when run as root. Note that the dynamic linker on most operating systems will remove vari- ables that can control dynamic linking from the environment of setuid executables, including sudo. Depending on the operating system this may include _RLD*, DYLD_*, LD_*, LDR_*, LIBPATH, SHLIB_PATH, and others. These type of variables are removed from the environment before sudo even begins execution and, as such, it is not possible for sudo to preserve them. As a special case, if sudo’s -i option (initial login) is specified, sudoers will initialize the environment regardless of the value of env_reset. The DISPLAY, PATH and TERM variables remain unchanged; HOME, MAIL, SHELL, USER, and LOGNAME are set based on the target user. On AIX (and Linux systems without PAM), the contents of /etc/environment are also included. All other environment variables are removed. Finally, if the env_file option is defined, any variables present in that file will be set to their specified values as long as they would not con- flict with an existing environment variable. SUDOERS FILE FORMAT The sudoers file is composed of two types of entries: aliases (basically variables) and user specifications (which specify who may run what). When multiple entries match for a user, they are applied in order. Where there are multiple matches, the last match is used (which is not neces- sarily the most specific match). The sudoers grammar will be described below in Extended Backus-Naur Form (EBNF). Don’t despair if you are unfamiliar with EBNF; it is fairly sim- ple, and the definitions below are annotated. Quick guide to EBNF EBNF is a concise and exact way of describing the grammar of a language. Each EBNF definition is made up of production rules. E.g., symbol ::= definition | alternate1 | alternate2 ... Each production rule references others and thus makes up a grammar for the language. EBNF also contains the following operators, which many readers will recognize from regular expressions. Do not, however, con- fuse them with “wildcard” characters, which have different meanings. ? Means that the preceding symbol (or group of symbols) is optional. That is, it may appear once or not at all. * Means that the preceding symbol (or group of symbols) may appear zero or more times. + Means that the preceding symbol (or group of symbols) may appear one or more times. Parentheses may be used to group symbols together. For clarity, we will use single quotes (’’) to designate what is a verbatim character string (as opposed to a symbol name). Aliases There are four kinds of aliases: User_Alias, Runas_Alias, Host_Alias and Cmnd_Alias. Alias ::= ’User_Alias’ User_Alias (’:’ User_Alias)* | ’Runas_Alias’ Runas_Alias (’:’ Runas_Alias)* | ’Host_Alias’ Host_Alias (’:’ Host_Alias)* | ’Cmnd_Alias’ Cmnd_Alias (’:’ Cmnd_Alias)* User_Alias ::= NAME ’=’ User_List Runas_Alias ::= NAME ’=’ Runas_List Host_Alias ::= NAME ’=’ Host_List Cmnd_Alias ::= NAME ’=’ Cmnd_List NAME ::= [A-Z]([A-Z][0-9]_)* Each alias definition is of the form Alias_Type NAME = item1, item2, ... where Alias_Type is one of User_Alias, Runas_Alias, Host_Alias, or Cmnd_Alias. A NAME is a string of uppercase letters, numbers, and under- score characters (‘_’). A NAME must start with an uppercase letter. It is possible to put several alias definitions of the same type on a single line, joined by a colon (‘:’). E.g., Alias_Type NAME = item1, item2, item3 : NAME = item4, item5 The definitions of what constitutes a valid alias member follow. User_List ::= User | User ’,’ User_List User ::= ’!’* user name | ’!’* #uid | ’!’* %group | ’!’* %#gid | ’!’* +netgroup | ’!’* %:nonunix_group | ’!’* %:#nonunix_gid | ’!’* User_Alias A User_List is made up of one or more user names, user ids (prefixed with ‘#’), system group names and ids (prefixed with ‘%’ and ‘%#’ respec- tively), netgroups (prefixed with ‘+’), non-Unix group names and IDs (prefixed with ‘%:’ and ‘%:#’ respectively) and User_Aliases. Each list item may be prefixed with zero or more ‘!’ operators. An odd number of ‘!’ operators negate the value of the item; an even number just cancel each other out. A user name, uid, group, gid, netgroup, nonunix_group or nonunix_gid may be enclosed in double quotes to avoid the need for escaping special char- acters. Alternately, special characters may be specified in escaped hex mode, e.g. \x20 for space. When using double quotes, any prefix charac- ters must be included inside the quotes. The actual nonunix_group and nonunix_gid syntax depends on the underlying group provider plugin (see the group_plugin description below). For instance, the QAS AD plugin supports the following formats: · Group in the same domain: "%:Group Name" · Group in any domain: "%:Group Name@FULLY.QUALIFIED.DOMAIN" · Group SID: "%:S-1-2-34-5678901234-5678901234-5678901234-567" Note that quotes around group names are optional. Unquoted strings must use a backslash (‘\’) to escape spaces and special characters. See Other special characters and reserved words for a list of characters that need to be escaped. Runas_List ::= Runas_Member | Runas_Member ’,’ Runas_List Runas_Member ::= ’!’* user name | ’!’* #uid | ’!’* %group | ’!’* %#gid | ’!’* %:nonunix_group | ’!’* %:#nonunix_gid | ’!’* +netgroup | ’!’* Runas_Alias A Runas_List is similar to a User_List except that instead of User_Aliases it can contain Runas_Aliases. Note that user names and groups are matched as strings. In other words, two users (groups) with the same uid (gid) are considered to be distinct. If you wish to match all user names with the same uid (e.g. root and toor), you can use a uid instead (#0 in the example given). Host_List ::= Host | Host ’,’ Host_List Host ::= ’!’* host name | ’!’* ip_addr | ’!’* network(/netmask)? | ’!’* +netgroup | ’!’* Host_Alias A Host_List is made up of one or more host names, IP addresses, network numbers, netgroups (prefixed with ‘+’) and other aliases. Again, the value of an item may be negated with the ‘!’ operator. If you do not specify a netmask along with the network number, sudo will query each of the local host’s network interfaces and, if the network number corre- sponds to one of the hosts’s network interfaces, the corresponding net- mask will be used. The netmask may be specified either in standard IP address notation (e.g. 255.255.255.0 or ffff:ffff:ffff:ffff::), or CIDR notation (number of bits, e.g. 24 or 64). A host name may include shell- style wildcards (see the Wildcards section below), but unless the host name command on your machine returns the fully qualified host name, you’ll need to use the fqdn option for wildcards to be useful. Note that sudo only inspects actual network interfaces; this means that IP address 127.0.0.1 (localhost) will never match. Also, the host name “localhost” will only match if that is the actual host name, which is usually only the case for non-networked systems. Cmnd_List ::= Cmnd | Cmnd ’,’ Cmnd_List command name ::= file name | file name args | file name ’""’ Cmnd ::= ’!’* command name | ’!’* directory | ’!’* "sudoedit" | ’!’* Cmnd_Alias A Cmnd_List is a list of one or more command names, directories, and other aliases. A command name is a fully qualified file name which may include shell-style wildcards (see the Wildcards section below). A sim- ple file name allows the user to run the command with any arguments he/she wishes. However, you may also specify command line arguments (including wildcards). Alternately, you can specify "" to indicate that the command may only be run without command line arguments. A directory is a fully qualified path name ending in a ‘/’. When you specify a directory in a Cmnd_List, the user will be able to run any file within that directory (but not in any sub-directories therein). If a Cmnd has associated command line arguments, then the arguments in the Cmnd must match exactly those given by the user on the command line (or match the wildcards if there are any). Note that the following char- acters must be escaped with a ‘\’ if they are used in command arguments: ‘,’, ‘:’, ‘=’, ‘\’. The special command “sudoedit” is used to permit a user to run sudo with the -e option (or as sudoedit). It may take com- mand line arguments just as a normal command does. Defaults Certain configuration options may be changed from their default values at run-time via one or more Default_Entry lines. These may affect all users on any host, all users on a specific host, a specific user, a specific command, or commands being run as a specific user. Note that per-command entries may not include command line arguments. If you need to specify arguments, define a Cmnd_Alias and reference that instead. Default_Type ::= ’Defaults’ | ’Defaults’ ’@’ Host_List | ’Defaults’ ’:’ User_List | ’Defaults’ ’!’ Cmnd_List | ’Defaults’ ’>’ Runas_List Default_Entry ::= Default_Type Parameter_List Parameter_List ::= Parameter | Parameter ’,’ Parameter_List Parameter ::= Parameter ’=’ Value | Parameter ’+=’ Value | Parameter ’-=’ Value | ’!’* Parameter Parameters may be flags, integer values, strings, or lists. Flags are implicitly boolean and can be turned off via the ‘!’ operator. Some integer, string and list parameters may also be used in a boolean context to disable them. Values may be enclosed in double quotes ("") when they contain multiple words. Special characters may be escaped with a back- slash (‘\’). Lists have two additional assignment operators, += and -=. These opera- tors are used to add to and delete from a list respectively. It is not an error to use the -= operator to remove an element that does not exist in a list. Defaults entries are parsed in the following order: generic, host and user Defaults first, then runas Defaults and finally command defaults. See SUDOERS OPTIONS for a list of supported Defaults parameters. User specification User_Spec ::= User_List Host_List ’=’ Cmnd_Spec_List \ (’:’ Host_List ’=’ Cmnd_Spec_List)* Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ’,’ Cmnd_Spec_List Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Tag_Spec* Cmnd Runas_Spec ::= ’(’ Runas_List? (’:’ Runas_List)? ’)’ SELinux_Spec ::= (’ROLE=role’ | ’TYPE=type’) Tag_Spec ::= (’NOPASSWD:’ | ’PASSWD:’ | ’NOEXEC:’ | ’EXEC:’ | ’SETENV:’ | ’NOSETENV:’ | ’LOG_INPUT:’ | ’NOLOG_INPUT:’ | ’LOG_OUTPUT:’ | ’NOLOG_OUTPUT:’) A user specification determines which commands a user may run (and as what user) on specified hosts. By default, commands are run as root, but this can be changed on a per-command basis. The basic structure of a user specification is “who where = (as_whom) what”. Let’s break that down into its constituent parts: Runas_Spec A Runas_Spec determines the user and/or the group that a command may be run as. A fully-specified Runas_Spec consists of two Runas_Lists (as defined above) separated by a colon (‘:’) and enclosed in a set of paren- theses. The first Runas_List indicates which users the command may be run as via sudo’s -u option. The second defines a list of groups that can be specified via sudo’s -g option. If both Runas_Lists are speci- fied, the command may be run with any combination of users and groups listed in their respective Runas_Lists. If only the first is specified, the command may be run as any user in the list but no -g option may be specified. If the first Runas_List is empty but the second is specified, the command may be run as the invoking user with the group set to any listed in the Runas_List. If both Runas_Lists are empty, the command may only be run as the invoking user. If no Runas_Spec is specified the com- mand may be run as root and no group may be specified. A Runas_Spec sets the default for the commands that follow it. What this means is that for the entry: dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm The user dgb may run /bin/ls, /bin/kill, and /usr/bin/lprm—but only as operator. E.g., $ sudo -u operator /bin/ls It is also possible to override a Runas_Spec later on in an entry. If we modify the entry like so: dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm Then user dgb is now allowed to run /bin/ls as operator, but /bin/kill and /usr/bin/lprm as root. We can extend this to allow dgb to run /bin/ls with either the user or group set to operator: dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill,\ /usr/bin/lprm Note that while the group portion of the Runas_Spec permits the user to run as command with that group, it does not force the user to do so. If no group is specified on the command line, the command will run with the group listed in the target user’s password database entry. The following would all be permitted by the sudoers entry above: $ sudo -u operator /bin/ls $ sudo -u operator -g operator /bin/ls $ sudo -g operator /bin/ls In the following example, user tcm may run commands that access a modem device file with the dialer group. tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu,\ /usr/local/bin/minicom Note that in this example only the group will be set, the command still runs as user tcm. E.g. $ sudo -g dialer /usr/bin/cu Multiple users and groups may be present in a Runas_Spec, in which case the user may select any combination of users and groups via the -u and -g options. In this example: alan ALL = (root, bin : operator, system) ALL user alan may run any command as either user root or bin, optionally set- ting the group to operator or system. SELinux_Spec On systems with SELinux support, sudoers entries may optionally have an SELinux role and/or type associated with a command. If a role or type is specified with the command it will override any default values specified in sudoers. A role or type specified on the command line, however, will supersede the values in sudoers. Tag_Spec A command may have zero or more tags associated with it. There are ten possible tag values: NOPASSWD, PASSWD, NOEXEC, EXEC, SETENV, NOSETENV, LOG_INPUT, NOLOG_INPUT, LOG_OUTPUT and NOLOG_OUTPUT. Once a tag is set on a Cmnd, subsequent Cmnds in the Cmnd_Spec_List, inherit the tag unless it is overridden by the opposite tag (in other words, PASSWD overrides NOPASSWD and NOEXEC overrides EXEC). NOPASSWD and PASSWD By default, sudo requires that a user authenticate him or herself before running a command. This behavior can be modified via the NOPASSWD tag. Like a Runas_Spec, the NOPASSWD tag sets a default for the commands that follow it in the Cmnd_Spec_List. Conversely, the PASSWD tag can be used to reverse things. For example: ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm as root on the machine rushmore without authenticating himself. If we only want ray to be able to run /bin/kill without a password the entry would be: ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm Note, however, that the PASSWD tag has no effect on users who are in the group specified by the exempt_group option. By default, if the NOPASSWD tag is applied to any of the entries for a user on the current host, he or she will be able to run “sudo -l” without a password. Additionally, a user may only run “sudo -v” without a pass- word if the NOPASSWD tag is present for all a user’s entries that pertain to the current host. This behavior may be overridden via the verifypw and listpw options. NOEXEC and EXEC If sudo has been compiled with noexec support and the underlying operat- ing system supports it, the NOEXEC tag can be used to prevent a dynami- cally-linked executable from running further commands itself. In the following example, user aaron may run /usr/bin/more and /usr/bin/vi but shell escapes will be disabled. aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi See the Preventing shell escapes section below for more details on how NOEXEC works and whether or not it will work on your system. SETENV and NOSETENV These tags override the value of the setenv option on a per-command basis. Note that if SETENV has been set for a command, the user may dis- able the env_reset option from the command line via the -E option. Addi- tionally, environment variables set on the command line are not subject to the restrictions imposed by env_check, env_delete, or env_keep. As such, only trusted users should be allowed to set variables in this man- ner. If the command matched is ALL, the SETENV tag is implied for that command; this default may be overridden by use of the NOSETENV tag. LOG_INPUT and NOLOG_INPUT These tags override the value of the log_input option on a per-command basis. For more information, see the description of log_input in the SUDOERS OPTIONS section below. LOG_OUTPUT and NOLOG_OUTPUT These tags override the value of the log_output option on a per-command basis. For more information, see the description of log_output in the SUDOERS OPTIONS section below. Wildcards sudo allows shell-style wildcards (aka meta or glob characters) to be used in host names, path names and command line arguments in the sudoers file. Wildcard matching is done via the POSIX glob(3) and fnmatch(3) routines. Note that these are not regular expressions. * Matches any set of zero or more characters. ? Matches any single character. [...] Matches any character in the specified range. [!...] Matches any character not in the specified range. \x For any character ‘x’, evaluates to ‘x’. This is used to escape special characters such as: ‘*’, ‘?’, ‘[’, and ‘]’. POSIX character classes may also be used if your system’s glob(3) and fnmatch(3) functions support them. However, because the ‘:’ character has special meaning in sudoers, it must be escaped. For example: /bin/ls [[alpha]]* Would match any file name beginning with a letter. Note that a forward slash (‘/’) will not be matched by wildcards used in the path name. This is to make a path like: /usr/bin/* match /usr/bin/who but not /usr/bin/X11/xterm. When matching the command line arguments, however, a slash does get matched by wildcards since command line arguments may contain arbitrary strings and not just path names. Wildcards in command line arguments should be used with care. Because command line arguments are matched as a single, concatenated string, a wildcard such as ‘?’ or ‘*’ can match multiple words. For example, while a sudoers entry like: %operator ALL = /bin/cat /var/log/messages* will allow command like: $ sudo cat /var/log/messages.1 It will also allow: $ sudo cat /var/log/messages /etc/shadow which is probably not what was intended. Exceptions to wildcard rules The following exceptions apply to the above rules: "" If the empty string "" is the only command line argument in the sudoers entry it means that command is not allowed to be run with any arguments. sudoedit Command line arguments to the sudoedit built-in command should always be path names, so a forward slash (‘/’) will not be matched by a wildcard. Including other files from within sudoers It is possible to include other sudoers files from within the sudoers file currently being parsed using the #include and #includedir direc- tives. This can be used, for example, to keep a site-wide sudoers file in addi- tion to a local, per-machine file. For the sake of this example the site-wide sudoers will be /etc/sudoers and the per-machine one will be /etc/sudoers.local. To include /etc/sudoers.local from within /etc/sudoers we would use the following line in /etc/sudoers: #include /etc/sudoers.local When sudo reaches this line it will suspend processing of the current file (/etc/sudoers) and switch to /etc/sudoers.local. Upon reaching the end of /etc/sudoers.local, the rest of /etc/sudoers will be processed. Files that are included may themselves include other files. A hard limit of 128 nested include files is enforced to prevent include file loops. If the path to the include file is not fully-qualified (does not begin with a ‘/’, it must be located in the same directory as the sudoers file it was included from. For example, if /etc/sudoers contains the line: #include sudoers.local the file that will be included is /etc/sudoers.local. The file name may also include the %h escape, signifying the short form of the host name. In other words, if the machine’s host name is “xerxes”, then #include /etc/sudoers.%h will cause sudo to include the file /etc/sudoers.xerxes. The #includedir directive can be used to create a sudo.d directory that the system package manager can drop sudoers rules into as part of package installation. For example, given: #includedir /etc/sudoers.d sudo will read each file in /etc/sudoers.d, skipping file names that end in ‘~’ or contain a ‘.’ character to avoid causing problems with package manager or editor temporary/backup files. Files are parsed in sorted lexical order. That is, /etc/sudoers.d/01_first will be parsed before /etc/sudoers.d/10_second. Be aware that because the sorting is lexical, not numeric, /etc/sudoers.d/1_whoops would be loaded after /etc/sudoers.d/10_second. Using a consistent number of leading zeroes in the file names can be used to avoid such problems. Note that unlike files included via #include, visudo will not edit the files in a #includedir directory unless one of them contains a syntax error. It is still possible to run visudo with the -f flag to edit the files directly. Other special characters and reserved words The pound sign (‘#’) is used to indicate a comment (unless it is part of a #include directive or unless it occurs in the context of a user name and is followed by one or more digits, in which case it is treated as a uid). Both the comment character and any text after it, up to the end of the line, are ignored. The reserved word ALL is a built-in alias that always causes a match to succeed. It can be used wherever one might otherwise use a Cmnd_Alias, User_Alias, Runas_Alias, or Host_Alias. You should not try to define your own alias called ALL as the built-in alias will be used in prefer- ence to your own. Please note that using ALL can be dangerous since in a command context, it allows the user to run any command on the system. An exclamation point (‘!’) can be used as a logical not operator in a list or alias as well as in front of a Cmnd. This allows one to exclude certain values. For the ‘!’ operator to be effective, there must be something for it to exclude. For example, to match all users except for root one would use: ALL,!root If the ALL, is omitted, as in: !root it would explicitly deny root but not match any other users. This is different from a true “negation” operator. Note, however, that using a ‘!’ in conjunction with the built-in ALL alias to allow a user to run “all but a few” commands rarely works as intended (see SECURITY NOTES below). Long lines can be continued with a backslash (‘\’) as the last character on the line. White space between elements in a list as well as special syntactic char- acters in a User Specification (‘=’, ‘:’, ‘(’, ‘)’) is optional. The following characters must be escaped with a backslash (‘\’) when used as part of a word (e.g. a user name or host name): ‘!’, ‘=’, ‘:’, ‘,’, ‘(’, ‘)’, ‘\’. SUDOERS OPTIONS sudo’s behavior can be modified by Default_Entry lines, as explained ear- lier. A list of all supported Defaults parameters, grouped by type, are listed below. Boolean Flags: always_set_home If enabled, sudo will set the HOME environment variable to the home directory of the target user (which is root unless the -u option is used). This effectively means that the -H option is always implied. Note that HOME is already set when the the env_reset option is enabled, so always_set_home is only effective for con- figurations where either env_reset is disabled or HOME is present in the env_keep list. This flag is off by default. authenticate If set, users must authenticate themselves via a pass- word (or other means of authentication) before they may run commands. This default may be overridden via the PASSWD and NOPASSWD tags. This flag is on by default. closefrom_override If set, the user may use sudo’s -C option which over- rides the default starting point at which sudo begins closing open file descriptors. This flag is off by default. compress_io If set, and sudo is configured to log a command’s input or output, the I/O logs will be compressed using zlib. This flag is on by default when sudo is compiled with zlib support. env_editor If set, visudo will use the value of the EDITOR or VISUAL environment variables before falling back on the default editor list. Note that this may create a secu- rity hole as it allows the user to run any arbitrary command as root without logging. A safer alternative is to place a colon-separated list of editors in the editor variable. visudo will then only use the EDITOR or VISUAL if they match a value specified in editor. This flag is on by default. env_reset If set, sudo will run the command in a minimal environ- ment containing the TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_* variables. Any variables in the caller’s environment that match the env_keep and env_check lists are then added, followed by any variables present in the file specified by the env_file option (if any). The default contents of the env_keep and env_check lists are displayed when sudo is run by root with the -V option. If the secure_path option is set, its value will be used for the PATH environment variable. This flag is on by default. fast_glob Normally, sudo uses the glob(3) function to do shell- style globbing when matching path names. However, since it accesses the file system, glob(3) can take a long time to complete for some patterns, especially when the pattern references a network file system that is mounted on demand (auto mounted). The fast_glob option causes sudo to use the fnmatch(3) function, which does not access the file system to do its match- ing. The disadvantage of fast_glob is that it is unable to match relative path names such as ./ls or ../bin/ls. This has security implications when path names that include globbing characters are used with the negation operator, ‘!’, as such rules can be triv- ially bypassed. As such, this option should not be used when sudoers contains rules that contain negated path names which include globbing characters. This flag is off by default. fqdn Set this flag if you want to put fully qualified host names in the sudoers file when the local host name (as returned by the hostname command) does not contain the domain name. In other words, instead of myhost you would use myhost.mydomain.edu. You may still use the short form if you wish (and even mix the two). This option is only effective when the “canonical” host name, as returned by the getaddrinfo() or gethostbyname() function, is a fully-qualified domain name. This is usually the case when the system is con- figured to use DNS for host name resolution. If the system is configured to use the /etc/hosts file in preference to DNS, the “canonical” host name may not be fully-qualified. The order that sources are queried for hosts name resolution is usually specified in the /etc/nsswitch.conf, /etc/netsvc.conf, /etc/host.conf, or, in some cases, /etc/resolv.conf file. In the /etc/hosts file, the first host name of the entry is considered to be the “canonical” name; subsequent names are aliases that are not used by sudoers. For example, the following hosts file line for the machine “xyzzy” has the fully-qualified domain name as the “canonical” host name, and the short version as an alias. 192.168.1.1 xyzzy.sudo.ws xyzzy If the machine’s hosts file entry is not formatted properly, the fqdn option will not be effective if it is queried before DNS. Beware that when using DNS for host name resolution, turning on fqdn requires sudoers to make DNS lookups which renders sudo unusable if DNS stops working (for example if the machine is disconnected from the net- work). Also note that just like with the hosts file, you must use the “canonical” name as DNS knows it. That is, you may not use a host alias (CNAME entry) due to performance issues and the fact that there is no way to get all aliases from DNS. This flag is off by default. ignore_dot If set, sudo will ignore "." or "" (both denoting cur- rent directory) in the PATH environment variable; the PATH itself is not modified. This flag is on by default. ignore_local_sudoers If set via LDAP, parsing of /etc/sudoers will be skipped. This is intended for Enterprises that wish to prevent the usage of local sudoers files so that only LDAP is used. This thwarts the efforts of rogue opera- tors who would attempt to add roles to /etc/sudoers. When this option is present, /etc/sudoers does not even need to exist. Since this option tells sudo how to behave when no specific LDAP entries have been matched, this sudoOption is only meaningful for the cn=defaults section. This flag is off by default. insults If set, sudo will insult users when they enter an incorrect password. This flag is off by default. log_host If set, the host name will be logged in the (non-sys- log) sudo log file. This flag is off by default. log_input If set, sudo will run the command in a pseudo tty and log all user input. If the standard input is not con- nected to the user’s tty, due to I/O redirection or because the command is part of a pipeline, that input is also captured and stored in a separate log file. Input is logged to the directory specified by the iolog_dir option (/var/log/sudo-io by default) using a unique session ID that is included in the normal sudo log line, prefixed with “TSID=”. The iolog_file option may be used to control the format of the session ID. Note that user input may contain sensitive information such as passwords (even if they are not echoed to the screen), which will be stored in the log file unen- crypted. In most cases, logging the command output via log_output is all that is required. log_output If set, sudo will run the command in a pseudo tty and log all output that is sent to the screen, similar to the script(1) command. If the standard output or stan- dard error is not connected to the user’s tty, due to I/O redirection or because the command is part of a pipeline, that output is also captured and stored in separate log files. Output is logged to the directory specified by the iolog_dir option (/var/log/sudo-io by default) using a unique session ID that is included in the normal sudo log line, prefixed with “TSID=”. The iolog_file option may be used to control the format of the session ID. Output logs may be viewed with the sudoreplay(8) util- ity, which can also be used to list or search the available logs. log_year If set, the four-digit year will be logged in the (non- syslog) sudo log file. This flag is off by default. long_otp_prompt When validating with a One Time Password (OTP) scheme such as S/Key or OPIE, a two-line prompt is used to make it easier to cut and paste the challenge to a local window. It’s not as pretty as the default but some people find it more convenient. This flag is off by default. mail_always Send mail to the mailto user every time a users runs sudo. This flag is off by default. mail_badpass Send mail to the mailto user if the user running sudo does not enter the correct password. If the command the user is attempting to run is not permitted by sudoers and one of the mail_always, mail_no_host, mail_no_perms or mail_no_user flags are set, this flag will have no effect. This flag is off by default. mail_no_host If set, mail will be sent to the mailto user if the invoking user exists in the sudoers file, but is not allowed to run commands on the current host. This flag is off by default. mail_no_perms If set, mail will be sent to the mailto user if the invoking user is allowed to use sudo but the command they are trying is not listed in their sudoers file entry or is explicitly denied. This flag is off by default. mail_no_user If set, mail will be sent to the mailto user if the invoking user is not in the sudoers file. This flag is on by default. noexec If set, all commands run via sudo will behave as if the NOEXEC tag has been set, unless overridden by a EXEC tag. See the description of NOEXEC and EXEC below as well as the Preventing shell escapes section at the end of this manual. This flag is off by default. path_info Normally, sudo will tell the user when a command could not be found in their PATH environment variable. Some sites may wish to disable this as it could be used to gather information on the location of executables that the normal user does not have access to. The disadvan- tage is that if the executable is simply not in the user’s PATH, sudo will tell the user that they are not allowed to run it, which can be confusing. This flag is on by default. passprompt_override The password prompt specified by passprompt will nor- mally only be used if the password prompt provided by systems such as PAM matches the string “Password:”. If passprompt_override is set, passprompt will always be used. This flag is off by default. preserve_groups By default, sudo will initialize the group vector to the list of groups the target user is in. When preserve_groups is set, the user’s existing group vec- tor is left unaltered. The real and effective group IDs, however, are still set to match the target user. This flag is off by default. pwfeedback By default, sudo reads the password like most other Unix programs, by turning off echo until the user hits the return (or enter) key. Some users become confused by this as it appears to them that sudo has hung at this point. When pwfeedback is set, sudo will provide visual feedback when the user presses a key. Note that this does have a security impact as an onlooker may be able to determine the length of the password being entered. This flag is off by default. requiretty If set, sudo will only run when the user is logged in to a real tty. When this flag is set, sudo can only be run from a login session and not via other means such as cron(8) or cgi-bin scripts. This flag is off by default. root_sudo If set, root is allowed to run sudo too. Disabling this prevents users from “chaining” sudo commands to get a root shell by doing something like “sudo sudo /bin/sh”. Note, however, that turning off root_sudo will also prevent root from running sudoedit. Dis- abling root_sudo provides no real additional security; it exists purely for historical reasons. This flag is on by default. rootpw If set, sudo will prompt for the root password instead of the password of the invoking user. This flag is off by default. runaspw If set, sudo will prompt for the password of the user defined by the runas_default option (defaults to root) instead of the password of the invoking user. This flag is off by default. set_home If enabled and sudo is invoked with the -s option the HOME environment variable will be set to the home directory of the target user (which is root unless the -u option is used). This effectively makes the -s option imply -H. Note that HOME is already set when the the env_reset option is enabled, so set_home is only effective for configurations where either env_reset is disabled or HOME is present in the env_keep list. This flag is off by default. set_logname Normally, sudo will set the LOGNAME, USER and USERNAME environment variables to the name of the target user (usually root unless the -u option is given). However, since some programs (including the RCS revision control system) use LOGNAME to determine the real identity of the user, it may be desirable to change this behavior. This can be done by negating the set_logname option. Note that if the env_reset option has not been dis- abled, entries in the env_keep list will override the value of set_logname. This flag is on by default. set_utmp When enabled, sudo will create an entry in the utmp (or utmpx) file when a pseudo-tty is allocated. A pseudo- tty is allocated by sudo when the log_input, log_output or use_pty flags are enabled. By default, the new entry will be a copy of the user’s existing utmp entry (if any), with the tty, time, type and pid fields updated. This flag is on by default. setenv Allow the user to disable the env_reset option from the command line via the -E option. Additionally, environ- ment variables set via the command line are not subject to the restrictions imposed by env_check, env_delete, or env_keep. As such, only trusted users should be allowed to set variables in this manner. This flag is off by default. shell_noargs If set and sudo is invoked with no arguments it acts as if the -s option had been given. That is, it runs a shell as root (the shell is determined by the SHELL environment variable if it is set, falling back on the shell listed in the invoking user’s /etc/passwd entry if not). This flag is off by default. stay_setuid Normally, when sudo executes a command the real and effective UIDs are set to the target user (root by default). This option changes that behavior such that the real UID is left as the invoking user’s UID. In other words, this makes sudo act as a setuid wrapper. This can be useful on systems that disable some poten- tially dangerous functionality when a program is run setuid. This option is only effective on systems that support either the setreuid(2) or setresuid(2) system call. This flag is off by default. targetpw If set, sudo will prompt for the password of the user specified by the -u option (defaults to root) instead of the password of the invoking user. In addition, the time stamp file name will include the target user’s name. Note that this flag precludes the use of a uid not listed in the passwd database as an argument to the -u option. This flag is off by default. tty_tickets If set, users must authenticate on a per-tty basis. With this flag enabled, sudo will use a file named for the tty the user is logged in on in the user’s time stamp directory. If disabled, the time stamp of the directory is used instead. This flag is on by default. umask_override If set, sudo will set the umask as specified by sudoers without modification. This makes it possible to spec- ify a more permissive umask in sudoers than the user’s own umask and matches historical behavior. If umask_override is not set, sudo will set the umask to be the union of the user’s umask and what is specified in sudoers. This flag is off by default. If set, sudo will run the command in a pseudo-pty even if no I/O logging is being gone. A malicious program run under sudo could conceivably fork a background process that retains to the user’s terminal device after the main program has finished executing. Use of this option will make that impossible. This flag is off by default. utmp_runas If set, sudo will store the name of the runas user when updating the utmp (or utmpx) file. By default, sudo stores the name of the invoking user. This flag is off by default. visiblepw By default, sudo will refuse to run if the user must enter a password but it is not possible to disable echo on the terminal. If the visiblepw flag is set, sudo will prompt for a password even when it would be visi- ble on the screen. This makes it possible to run things like “ssh somehost sudo ls” since by default, ssh(1) does not allocate a tty when running a command. This flag is off by default. Integers: closefrom Before it executes a command, sudo will close all open file descriptors other than standard input, standard output and standard error (ie: file descriptors 0-2). The closefrom option can be used to specify a different file descriptor at which to start closing. The default is 3. passwd_tries The number of tries a user gets to enter his/her pass- word before sudo logs the failure and exits. The default is 3. Integers that can be used in a boolean context: loglinelen Number of characters per line for the file log. This value is used to decide when to wrap lines for nicer log files. This has no effect on the syslog log file, only the file log. The default is 80 (use 0 or negate the option to disable word wrap). passwd_timeout Number of minutes before the sudo password prompt times out, or 0 for no timeout. The timeout may include a fractional component if minute granularity is insuffi- cient, for example 2.5. The default is 5. timestamp_timeout Number of minutes that can elapse before sudo will ask for a passwd again. The timeout may include a frac- tional component if minute granularity is insufficient, for example 2.5. The default is 5. Set this to 0 to always prompt for a password. If set to a value less than 0 the user’s time stamp will never expire. This can be used to allow users to create or delete their own time stamps via “sudo -v” and “sudo -k” respec- tively. umask Umask to use when running the command. Negate this option or set it to 0777 to preserve the user’s umask. The actual umask that is used will be the union of the user’s umask and the value of the umask option, which defaults to 0022. This guarantees that sudo never low- ers the umask when running a command. Note: on systems that use PAM, the default PAM configuration may specify its own umask which will override the value set in sudoers. Strings: badpass_message Message that is displayed if a user enters an incorrect password. The default is Sorry, try again. unless insults are enabled. editor A colon (‘:’) separated list of editors allowed to be used with visudo. visudo will choose the editor that matches the user’s EDITOR environment variable if pos- sible, or the first editor in the list that exists and is executable. The default is /usr/local/bin/vi. iolog_dir The top-level directory to use when constructing the path name for the input/output log directory. Only used if the log_input or log_output options are enabled or when the LOG_INPUT or LOG_OUTPUT tags are present for a command. The session sequence number, if any, is stored in the directory. The default is /var/log/sudo-io. The following percent (‘%’) escape sequences are sup- ported: %{seq} expanded to a monotonically increasing base-36 sequence number, such as 0100A5, where every two digits are used to form a new directory, e.g. 01/00/A5 %{user} expanded to the invoking user’s login name %{group} expanded to the name of the invoking user’s real group ID %{runas_user} expanded to the login name of the user the com- mand will be run as (e.g. root) %{runas_group} expanded to the group name of the user the com- mand will be run as (e.g. wheel) %{hostname} expanded to the local host name without the domain name %{command} expanded to the base name of the command being run In addition, any escape sequences supported by the sys- tem’s strftime(3) function will be expanded. To include a literal ‘%’ character, the string ‘%%’ should be used. iolog_file The path name, relative to iolog_dir, in which to store input/output logs when the log_input or log_output options are enabled or when the LOG_INPUT or LOG_OUTPUT tags are present for a command. Note that iolog_file may contain directory components. The default is “%{seq}”. See the iolog_dir option above for a list of supported percent (‘%’) escape sequences. In addition to the escape sequences, path names that end in six or more Xs will have the Xs replaced with a unique combination of digits and letters, similar to the mktemp(3) function. mailsub Subject of the mail sent to the mailto user. The escape %h will expand to the host name of the machine. Default is “*** SECURITY information for %h ***”. noexec_file This option is no longer supported. The path to the noexec file should now be set in the /etc/sudo.conf file. pam_login_service On systems that use PAM for authentication, this is the service name used when the -i option is specified. The default value is “sudo-i”. See the description of pam_service for more information. pam_service On systems that use PAM for authentication, the service name specifies the PAM policy to apply. This usually corresponds to an entry in the pam.conf file or a file in the /etc/pam.d directory. The default value is “sudo”. passprompt The default prompt to use when asking for a password; can be overridden via the -p option or the SUDO_PROMPT environment variable. The following percent (‘%’) escape sequences are supported: %H expanded to the local host name including the domain name (only if the machine’s host name is fully qualified or the fqdn option is set) %h expanded to the local host name without the domain name %p expanded to the user whose password is being asked for (respects the rootpw, targetpw and runaspw flags in sudoers) %U expanded to the login name of the user the com- mand will be run as (defaults to root) %u expanded to the invoking user’s login name %% two consecutive % characters are collapsed into a single % character The default value is “[sudo] password for %p:”. 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 sudoers or via command line options. This option is only avail- able when sudo is built with SELinux support. runas_default The default user to run commands as if the -u option is not specified on the command line. This defaults to root. syslog_badpri Syslog priority to use when user authenticates unsuc- cessfully. Defaults to alert. The following syslog priorities are supported: alert, crit, debug, emerg, err, info, notice, and warning. syslog_goodpri Syslog priority to use when user authenticates success- fully. Defaults to notice. See syslog_badpri for the list of supported syslog pri- orities. sudoers_locale Locale to use when parsing the sudoers file, logging commands, and sending email. Note that changing the locale may affect how sudoers is interpreted. Defaults to “C”. timestampdir The directory in which sudo stores its time stamp files. The default is /var/db/sudo. timestampowner The owner of the time stamp directory and the time stamps stored therein. The default is root. 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 sudoers or via command line options. This option is only avail- able when sudo is built with SELinux support. Strings that can be used in a boolean context: env_file The env_file option specifies the fully qualified path to a file containing variables to be set in the environment of the program being run. Entries in this file should either be of the form “VARIABLE=value” or “export VARIABLE=value”. The value may optionally be surrounded by single or double quotes. Variables in this file are subject to other sudo environment settings such as env_keep and env_check. exempt_group Users in this group are exempt from password and PATH requirements. The group name specified should not include a % prefix. This is not set by default. group_plugin A string containing a sudoers group plugin with optional arguments. This can be used to implement support for the nonunix_group syntax described earlier. The string should consist of the plugin path, either fully-qualified or rela- tive to the /usr/libexec directory, followed by any config- uration arguments the plugin requires. These arguments (if any) will be passed to the plugin’s initialization func- tion. If arguments are present, the string must be enclosed in double quotes (""). For example, given /etc/sudo-group, a group file in Unix group format, the sample group plugin can be used: Defaults group_plugin="sample_group.so /etc/sudo-group" For more information see sudo_plugin(5). lecture This option controls when a short lecture will be printed along with the password prompt. It has the following pos- sible values: always Always lecture the user. never Never lecture the user. once Only lecture the user the first time they run sudo. If no value is specified, a value of once is implied. Negating the option results in a value of never being used. The default value is once. lecture_file Path to a file containing an alternate sudo lecture that will be used in place of the standard lecture if the named file exists. By default, sudo uses a built-in lecture. listpw This option controls when a password will be required when a user runs sudo with the -l option. It has the following possible values: all All the user’s sudoers entries for the current host must have the NOPASSWD flag set to avoid entering a password. always The user must always enter a password to use the -l option. any At least one of the user’s sudoers entries for the current host must have the NOPASSWD flag set to avoid entering a password. never The user need never enter a password to use the -l option. If no value is specified, a value of any is implied. Negating the option results in a value of never being used. The default value is any. logfile Path to the sudo log file (not the syslog log file). Set- ting a path turns on logging to a file; negating this option turns it off. By default, sudo logs via syslog. mailerflags Flags to use when invoking mailer. Defaults to -t. mailerpath Path to mail program used to send warning mail. Defaults to the path to sendmail found at configure time. mailfrom Address to use for the “from” address when sending warning and error mail. The address should be enclosed in double quotes ("") to protect against sudo interpreting the @ sign. Defaults to the name of the user running sudo. mailto Address to send warning and error mail to. The address should be enclosed in double quotes ("") to protect against sudo interpreting the @ sign. Defaults to root. secure_path Path used for every command run from sudo. If you don’t trust the people running sudo to have a sane PATH environ- ment variable you may want to use this. Another use is if you want to have the “root path” be separate from the “user path”. Users in the group specified by the exempt_group option are not affected by secure_path. This option is not set by default. syslog Syslog facility if syslog is being used for logging (negate to disable syslog logging). Defaults to authpriv. The following syslog facilities are supported: authpriv (if your OS supports it), auth, daemon, user, local0, local1, local2, local3, local4, local5, local6, and local7. verifypw This option controls when a password will be required when a user runs sudo with the -v option. It has the following possible values: all All the user’s sudoers entries for the current host must have the NOPASSWD flag set to avoid entering a password. always The user must always enter a password to use the -v option. any At least one of the user’s sudoers entries for the current host must have the NOPASSWD flag set to avoid entering a password. never The user need never enter a password to use the -v option. If no value is specified, a value of all is implied. Negating the option results in a value of never being used. The default value is all. Lists that can be used in a boolean context: env_check Environment variables to be removed from the user’s environment if unless they are considered “safe”. For all variables except TZ, “safe” means that the vari- able’s value does not contain any ‘%’ or ‘/’ charac- ters. This can be used to guard against printf-style format vulnerabilities in poorly-written programs. The TZ variable is considerd unsafe if any of the following are true: · It consists of a fully-qualified path name, option- ally prefixed with a colon (‘:’), that does not match the location of the zoneinfo directory. · It contains a .. path element. · It contains white space or non-printable charac- ters. · It is longer than the value of PATH_MAX. The argument may be a double-quoted, space-separated list or a single value without double-quotes. The list can be replaced, added to, deleted from, or disabled by using the =, +=, -=, and ! operators respectively. Regardless of whether the env_reset option is enabled or disabled, variables specified by env_check will be preserved in the environment if they pass the aforemen- tioned check. The default list of environment vari- ables to check is displayed when sudo is run by root with the -V option. env_delete Environment variables to be removed from the user’s environment when the env_reset option is not in effect. The argument may be a double-quoted, space-separated list or a single value without double-quotes. The list can be replaced, added to, deleted from, or disabled by using the =, +=, -=, and ! operators respectively. The default list of environment variables to remove is dis- played when sudo is run by root with the -V option. Note that many operating systems will remove poten- tially dangerous variables from the environment of any setuid process (such as sudo). env_keep Environment variables to be preserved in the user’s environment when the env_reset option is in effect. This allows fine-grained control over the environment sudo-spawned processes will receive. The argument may be a double-quoted, space-separated list or a single value without double-quotes. The list can be replaced, added to, deleted from, or disabled by using the =, +=, -=, and ! operators respectively. The default list of variables to keep is displayed when sudo is run by root with the -V option. LOG FORMAT sudoers can log events using either syslog(3) or a simple log file. In each case the log format is almost identical. Accepted command log entries Commands that sudo runs are logged using the following format (split into multiple lines for readability): date hostname progname: username : TTY=ttyname ; PWD=cwd ; \ USER=runasuser ; GROUP=runasgroup ; TSID=logid ; \ ENV=env_vars COMMAND=command Where the fields are as follows: date The date the command was run. Typically, this is in the format “MMM, DD, HH:MM:SS”. If logging via syslog(3), the actual date format is controlled by the syslog daemon. If logging to a file and the log_year option is enabled, the date will also include the year. hostname The name of the host sudo was run on. This field is only present when logging via syslog(3). progname The name of the program, usually sudo or sudoedit. This field is only present when logging via syslog(3). username The login name of the user who ran sudo. ttyname The short name of the terminal (e.g. “console”, “tty01”, or “pts/0”) sudo was run on, or “unknown” if there was no ter- minal present. cwd The current working directory that sudo was run in. runasuser The user the command was run as. runasgroup The group the command was run as if one was specified on the command line. logid An I/O log identifier that can be used to replay the com- mand’s output. This is only present when the log_input or log_output option is enabled. env_vars A list of environment variables specified on the command line, if specified. command The actual command that was executed. Messages are logged using the locale specified by sudoers_locale, which defaults to the “C” locale. Denied command log entries If the user is not allowed to run the command, the reason for the denial will follow the user name. Possible reasons include: user NOT in sudoers The user is not listed in the sudoers file. user NOT authorized on host The user is listed in the sudoers file but is not allowed to run com- mands on the host. command not allowed The user is listed in the sudoers file for the host but they are not allowed to run the specified command. 3 incorrect password attempts The user failed to enter their password after 3 tries. The actual num- ber of tries will vary based on the number of failed attempts and the value of the passwd_tries option. a password is required sudo’s -n option was specified but a password was required. sorry, you are not allowed to set the following environment variables The user specified environment variables on the command line that were not allowed by sudoers. Error log entries If an error occurs, sudoers will log a message and, in most cases, send a message to the administrator via email. Possible errors include: parse error in /etc/sudoers near line N sudoers encountered an error when parsing the specified file. In some cases, the actual error may be one line above or below the line number listed, depending on the type of error. problem with defaults entries The sudoers file contains one or more unknown Defaults settings. This does not prevent sudo from running, but the sudoers file should be checked using visudo. timestamp owner (username): No such user The time stamp directory owner, as specified by the timestampowner set- ting, could not be found in the password database. unable to open/read /etc/sudoers The sudoers file could not be opened for reading. This can happen when the sudoers file is located on a remote file system that maps user ID 0 to a different value. Normally, sudoers tries to open sudoers using group permissions to avoid this problem. Consider changing the owner- ship of /etc/sudoers by adding an option like “sudoers_uid=N” (where ‘N’ is the user ID that owns the sudoers file) to the sudoers plugin line in the /etc/sudo.conf file. unable to stat /etc/sudoers The /etc/sudoers file is missing. /etc/sudoers is not a regular file The /etc/sudoers file exists but is not a regular file or symbolic link. /etc/sudoers is owned by uid N, should be 0 The sudoers file has the wrong owner. If you wish to change the sudoers file owner, please add “sudoers_uid=N” (where ‘N’ is the user ID that owns the sudoers file) to the sudoers plugin line in the /etc/sudo.conf file. /etc/sudoers is world writable The permissions on the sudoers file allow all users to write to it. The sudoers file must not be world-writable, the default file mode is 0440 (readable by owner and group, writable by none). The default mode may be changed via the “sudoers_mode” option to the sudoers plugin line in the /etc/sudo.conf file. /etc/sudoers is owned by gid N, should be 1 The sudoers file has the wrong group ownership. If you wish to change the sudoers file group ownership, please add “sudoers_gid=N” (where ‘N’ is the group ID that owns the sudoers file) to the sudoers plugin line in the /etc/sudo.conf file. unable to open /var/db/sudo/username/ttyname sudoers was unable to read or create the user’s time stamp file. unable to write to /var/db/sudo/username/ttyname sudoers was unable to write to the user’s time stamp file. unable to mkdir to /var/db/sudo/username sudoers was unable to create the user’s time stamp directory. Notes on logging via syslog By default, sudoers logs messages via syslog(3). The date, hostname, and progname fields are added by the syslog daemon, not sudoers itself. As such, they may vary in format on different systems. On most systems, syslog(3) has a relatively small log buffer. To prevent the command line arguments from being truncated, sudoers will split up log messages that are larger than 960 characters (not including the date, hostname, and the string “sudo”). When a message is split, additional parts will include the string “(command continued)” after the user name and before the continued command line arguments. Notes on logging to a file If the logfile option is set, sudoers will log to a local file, such as /var/log/sudo. When logging to a file, sudoers uses a format similar to syslog(3), with a few important differences: 1. The progname and hostname fields are not present. 2. If the log_year option is enabled, the date will also include the year. 3. Lines that are longer than loglinelen characters (80 by default) are word-wrapped and continued on the next line with a four character indent. This makes entries easier to read for a human being, but makes it more difficult to use grep(1) on the log files. If the loglinelen option is set to 0 (or negated with a ‘!’), word wrap will be disabled. SUDO.CONF The /etc/sudo.conf file determines which plugins the sudo front end will load. If no /etc/sudo.conf file is present, or it contains no Plugin lines, sudo will use the sudoers security policy and I/O logging, which corresponds to the following /etc/sudo.conf file. # # Default /etc/sudo.conf file # # Format: # Plugin plugin_name plugin_path plugin_options ... # Path askpass /path/to/askpass # Path noexec /path/to/sudo_noexec.so # Debug sudo /var/log/sudo_debug all@warn # Set disable_coredump true # # The plugin_path is relative to /usr/libexec unless # fully qualified. # The plugin_name corresponds to a global symbol in the plugin # that contains the plugin interface structure. # The plugin_options are optional. # Plugin policy_plugin sudoers.so Plugin io_plugin sudoers.so Plugin options Starting with sudo 1.8.5, it is possible to pass options to the sudoers plugin. Options may be listed after the path to the plugin (i.e. after sudoers.so); multiple options should be space-separated. For example: Plugin sudoers_policy sudoers.so sudoers_file=/etc/sudoers sudoers_uid=0 sudoers_gid=0 sudoers_mode=0440 The following plugin options are supported: sudoers_file=pathname The sudoers_file option can be used to override the default path to the sudoers file. sudoers_uid=uid The sudoers_uid option can be used to override the default owner of the sudoers file. It should be specified as a numeric user ID. sudoers_gid=gid The sudoers_gid option can be used to override the default group of the sudoers file. It should be specified as a numeric group ID. sudoers_mode=mode The sudoers_mode option can be used to override the default file mode for the sudoers file. It should be specified as an octal value. Debug flags Versions 1.8.4 and higher of the sudoers plugin supports a debugging framework that can help track down what the plugin is doing internally if there is a problem. This can be configured in the /etc/sudo.conf file as described in sudo(8). The sudoers plugin uses the same debug flag format as the sudo front-end: subsystem@priority. The priorities used by sudoers, in order of decreasing severity, are: crit, err, warn, notice, diag, info, trace and debug. Each priority, when specified, also includes all priorities higher than it. For exam- ple, a priority of notice would include debug messages logged at notice and higher. The following subsystems are used by sudoers: alias User_Alias, Runas_Alias, Host_Alias and Cmnd_Alias processing all matches every subsystem audit BSM and Linux audit code auth user authentication defaults sudoers Defaults settings env environment handling ldap LDAP-based sudoers logging logging support match matching of users, groups, hosts and netgroups in sudoers netif network interface handling nss network service switch handling in sudoers parser sudoers file parsing perms permission setting plugin The equivalent of main for the plugin. pty pseudo-tty related code rbtree redblack tree internals util utility functions FILES /etc/sudo.conf Sudo front end configuration /etc/sudoers List of who can run what /etc/group Local groups file /etc/netgroup List of network groups /var/log/sudo-io I/O log files /var/db/sudo Directory containing time stamps for the sudoers security policy /etc/environment Initial environment for -i mode on AIX and Linux systems EXAMPLES Below are example sudoers entries. Admittedly, some of these are a bit contrived. First, we allow a few environment variables to pass and then define our aliases: # Run X applications through sudo; HOME is used to find the # .Xauthority file. Note that other programs use HOME to find # configuration files and this may lead to privilege escalation! Defaults env_keep += "DISPLAY HOME" # User alias specification User_Alias FULLTIMERS = millert, mikef, dowdy User_Alias PARTTIMERS = bostley, jwfox, crawl User_Alias WEBMASTERS = will, wendy, wim # Runas alias specification Runas_Alias OP = root, operator Runas_Alias DB = oracle, sybase Runas_Alias ADMINGRP = adm, oper # Host alias specification Host_Alias SPARC = bigtime, eclipse, moet, anchor :\ SGI = grolsch, dandelion, black :\ ALPHA = widget, thalamus, foobar :\ 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 specification Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\ /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,\ /usr/local/bin/tcsh, /usr/bin/rsh,\ /usr/local/bin/zsh Cmnd_Alias SU = /usr/bin/su Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less Here we override some of the compiled in default values. We want sudo to log via syslog(3) using the auth facility in all cases. We don’t want to subject the full time staff to the sudo lecture, user millert need not give a password, and we don’t want to reset the LOGNAME, USER or USERNAME environment variables when running commands as root. Additionally, on the machines in the SERVERS Host_Alias, we keep an additional local log file and make sure we log the year in each log line since the log entries will be kept around for several years. Lastly, we disable shell escapes for the commands in the PAGERS Cmnd_Alias (/usr/bin/more, /usr/bin/pg and /usr/bin/less). # Override 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 The User specification is the part that actually determines who may run what. root ALL = (ALL) ALL %wheel ALL = (ALL) ALL We let root and any user in group wheel run any command on any host as any user. FULLTIMERS ALL = NOPASSWD: ALL Full time sysadmins (millert, mikef, and dowdy) may run any command on any host without authenticating themselves. PARTTIMERS ALL = ALL Part time sysadmins bostley, jwfox, and crawl) may run any command on any host but they must authenticate themselves first (since the entry lacks the NOPASSWD tag). jack CSNETS = ALL The user jack may run any command on the machines in the CSNETS alias (the networks 128.138.243.0, 128.138.204.0, and 128.138.242.0). Of those networks, only 128.138.204.0 has an explicit netmask (in CIDR notation) indicating it is a class C network. For the other networks in CSNETS, the local machine’s netmask will be used during matching. lisa CUNETS = ALL The user lisa may run any command on any host in the CUNETS alias (the class B network 128.138.0.0). operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\ sudoedit /etc/printcap, /usr/oper/bin/ The operator user may run commands limited to simple maintenance. Here, those are commands related to backups, killing processes, the printing system, shutting down the system, and any commands in the directory /usr/oper/bin/. joe ALL = /usr/bin/su operator The user joe may only su(1) to operator. pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root %opers ALL = (: ADMINGRP) /usr/sbin/ Users in the opers group may run commands in /usr/sbin/ as themselves with any group in the ADMINGRP Runas_Alias (the adm and oper groups). The user pete is allowed to change anyone’s password except for root on the HPPA machines. Note that this assumes passwd(1) does not take multi- ple user names on the command line. bob SPARC = (OP) ALL : SGI = (OP) ALL The user bob may run anything on the SPARC and SGI machines as any user listed in the OP Runas_Alias (root and operator.) jim +biglab = ALL The user jim may run any command on machines in the biglab netgroup. sudo knows that “biglab” is a netgroup due to the ‘+’ prefix. +secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser Users in the secretaries netgroup need to help manage the printers as well as add and remove users, so they are allowed to run those commands on all machines. fred ALL = (DB) NOPASSWD: ALL The user fred can run commands as any user in the DB Runas_Alias (oracle or sybase) without giving a password. john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* On the ALPHA machines, user john may su to anyone except root but he is not allowed to specify any options to the su(1) command. jen ALL, !SERVERS = ALL The user jen may run any command on any machine except for those in the SERVERS Host_Alias (master, mail, www and ns). jill SERVERS = /usr/bin/, !SU, !SHELLS For any machine in the SERVERS Host_Alias, jill may run any commands in the directory /usr/bin/ except for those commands belonging to the SU and SHELLS Cmnd_Aliases. steve CSNETS = (operator) /usr/local/op_commands/ The user steve may run any command in the directory /usr/local/op_com- mands/ but only as user operator. matt valkyrie = KILL On his personal workstation, valkyrie, matt needs to be able to kill hung processes. WEBMASTERS www = (www) ALL, (root) /usr/bin/su www On the host www, any user in the WEBMASTERS User_Alias (will, wendy, and wim), may run any command as user www (which owns the web pages) or sim- ply su(1) to www. ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\ /sbin/mount -o nosuidnodev /dev/cd0a /CDROM Any user may mount or unmount a CD-ROM on the machines in the CDROM Host_Alias (orion, perseus, hercules) without entering a password. This is a bit tedious for users to type, so it is a prime candidate for encap- sulating in a shell script. SECURITY NOTES Limitations of the ‘!’ operator It is generally not effective to “subtract” commands from ALL using the ‘!’ operator. A user can trivially circumvent this by copying the desired command to a different name and then executing that. For exam- ple: bill ALL = ALL, !SU, !SHELLS Doesn’t really prevent bill from running the commands listed in SU or SHELLS since he can simply copy those commands to a different name, or use a shell escape from an editor or other program. Therefore, these kind of restrictions should be considered advisory at best (and rein- forced by policy). In general, if a user has sudo ALL there is nothing to prevent them from creating their own program that gives them a root shell (or making their own copy of a shell) regardless of any ‘!’ elements in the user specifi- cation. Security implications of fast_glob If the fast_glob option is in use, it is not possible to reliably negate commands where the path name includes globbing (aka wildcard) characters. This is because the C library’s fnmatch(3) function cannot resolve rela- tive paths. While this is typically only an inconvenience for rules that grant privileges, it can result in a security issue for rules that sub- tract or revoke privileges. For example, given the following sudoers entry: john ALL = /usr/bin/passwd [a-zA-Z0-9]*, /usr/bin/chsh [a-zA-Z0-9]*,\ /usr/bin/chfn [a-zA-Z0-9]*, !/usr/bin/* root User john can still run /usr/bin/passwd root if fast_glob is enabled by changing to /usr/bin and running ./passwd root instead. Preventing shell escapes Once sudo executes a program, that program is free to do whatever it pleases, including run other programs. This can be a security issue since it is not uncommon for a program to allow shell escapes, which lets a user bypass sudo’s access control and logging. Common programs that permit shell escapes include shells (obviously), editors, paginators, mail and terminal programs. There are two basic approaches to this problem: restrict Avoid giving users access to commands that allow the user to run arbitrary commands. Many editors have a restricted mode where shell escapes are disabled, though sudoedit is a better solution to running editors via sudo. Due to the large number of programs that offer shell escapes, restricting users to the set of programs that do not is often unworkable. noexec Many systems that support shared libraries have the ability to override default library functions by pointing an environment variable (usually LD_PRELOAD) to an alternate shared library. On such systems, sudo’s noexec functionality can be used to prevent a program run by sudo from executing any other pro- grams. Note, however, that this applies only to native dynami- cally-linked executables. Statically-linked executables and foreign executables running under binary emulation are not affected. The noexec feature is known to work on SunOS, Solaris, *BSD, Linux, IRIX, Tru64 UNIX, MacOS X, HP-UX 11.x and AIX 5.3 and above. It should be supported on most operating systems that support the LD_PRELOAD environment variable. Check your oper- ating system’s manual pages for the dynamic linker (usually ld.so, ld.so.1, dyld, dld.sl, rld, or loader) to see if LD_PRELOAD is supported. To enable noexec for a command, use the NOEXEC tag as docu- mented in the User Specification section above. Here is that example again: aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi This allows user aaron to run /usr/bin/more and /usr/bin/vi with noexec enabled. This will prevent those two commands from executing other commands (such as a shell). If you are unsure whether or not your system is capable of supporting noexec you can always just try it out and check whether shell escapes work when noexec is enabled. Note that restricting shell escapes is not a panacea. Programs running as root are still capable of many potentially hazardous operations (such as changing or overwriting files) that could lead to unintended privilege escalation. In the specific case of an editor, a safer approach is to give the user permission to run sudoedit. Time stamp file checks sudoers will check the ownership of its time stamp directory (/var/db/sudo by default) and ignore the directory’s contents if it is not owned by root or if it is writable by a user other than root. On systems that allow non-root users to give away files via chown(2), if the time stamp directory is located in a world-writable directory (e.g., /tmp), it is possible for a user to create the time stamp directory before sudo is run. However, because sudoers checks the ownership and mode of the directory and its contents, the only damage that can be done is to “hide” files by putting them in the time stamp dir. This is unlikely to happen since once the time stamp dir is owned by root and inaccessible by any other user, the user placing files there would be unable to get them back out. sudoers will not honor time stamps set far in the future. Time stamps with a date greater than current_time + 2 * TIMEOUT will be ignored and sudo will log and complain. This is done to keep a user from creating his/her own time stamp with a bogus date on systems that allow users to give away files if the time stamp directory is located in a world- writable directory. On systems where the boot time is available, sudoers will ignore time stamps that date from before the machine booted. Since time stamp files live in the file system, they can outlive a user’s login session. As a result, a user may be able to login, run a command with sudo after authenticating, logout, login again, and run sudo without authenticating so long as the time stamp file’s modification time is within 5 minutes (or whatever the timeout is set to in sudoers). When the tty_tickets option is enabled, the time stamp has per-tty granularity but still may outlive the user’s session. On Linux systems where the devpts filesystem is used, Solaris systems with the devices filesystem, as well as other systems that utilize a devfs filesystem that monotoni- cally increase the inode number of devices as they are created (such as Mac OS X), sudoers is able to determine when a tty-based time stamp file is stale and will ignore it. Administrators should not rely on this fea- ture as it is not universally available. SEE ALSO ssh(1), su(1), fnmatch(3), glob(3), mktemp(3), strftime(3), sudoers.ldap(5), sudo_plugin(8), sudo(8), visudo(8) CAVEATS The sudoers file should always be edited by the visudo command which locks the file and does grammatical checking. It is imperative that sudoers be free of syntax errors since sudo will not run with a syntacti- cally incorrect sudoers file. When using netgroups of machines (as opposed to users), if you store fully qualified host name in the netgroup (as is usually the case), you either need to have the machine’s host name be fully qualified as returned by the hostname command or use the fqdn option in sudoers. BUGS If you feel you have found a bug in sudo, please submit a bug report at http://www.sudo.ws/sudo/bugs/ SUPPORT Limited free support is available via the sudo-users mailing list, see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or search the archives. DISCLAIMER sudo is provided “AS IS” and any express or implied warranties, includ- ing, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. See the LICENSE file distributed with sudo or http://www.sudo.ws/sudo/license.html for com- plete details. Sudo 1.8.6p3 July 16, 2012 Sudo 1.8.6p3
Copyright(C) linux-cmd.com All Rights Reserved. Author Takayuki Yukawa