man 5 sudoers 中文版

  描述

sudoers配置文件由兩種內容組成:別名(基本變量)和用戶說明(user specification)(定義了誰能運行什麼).sudoers的語法將在下面用擴展的巴科斯-諾爾範式(Extended Backus-Naur Form,EBNF)描述.如果您不知道什麼是EBNF是什麼的話也請不要放棄,事實上它很簡單,並且下面用它作的定義都是經過註釋的.

EBNF的快速指導

EBNF是用來描述某種語言的語法的一種簡潔且精確的方法.每一個EBNF定義都是由"production rules"這種形式組成的.例如:
symbol ::= definition | alternate1 |alternate2 ...........
每一個"production rule"都和其它的"production rule"有關聯,這樣就構成了這種語言的語法.EBNF也包含了下面的操作符,許多讀者都能夠認出這是正則表達式(regular expression)的符號.但是,不要把它們和通配符(wildcard0搞混淆了.它們有着不同的含義.
? 意味着前面的一個記號(symbol)或者一組記號(group of symbol)是可選的,也就是說,可以出現一次或根本就不出現
* 在前面的一個或者一組記號出現零次或多次
+ 在前面的一個或者一組記號出現一次或多次
括號可以用來把記號組合在一起(to group symbols together),單引號可以把一個字符串按照他的字面意思來解釋(這與記號的名字相反).

別名

有四種別名: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中的一個,NAMEW是一個由大寫字母,數字和下劃線組成的字符串,並且它必需以一個大寫字母開頭.可以把同一類型的多個別名定義放在同一行裏,中間以一個冒號隔開.例如:
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 ::= !* username |
!* %group |
!* +netgroup |
!* User_Alias
(譯註:這裏應該是
User_List ::= User |
User , User_List
User ::= !* username |
!* #uids |
!* %group |
!* +netgroup |
!* User_Alias
纔對)
一個User_List是由一個或多個用戶名,用戶ID(要加上"#"前綴),系統用戶組(要加上"%"前綴),網絡組(要加上"+"前綴)或者其它 User_Alias組成.每一個列表項都可以加上一個或多個"!"前綴.奇數個"!"使這個列表項取反,偶數個"!"沒有任何作用.(譯註:這裏的"! "也就是取反啦)

Runas_List ::= Runas_User |
Runas_User , Runas_List
Runas_User ::= !* username |
!* #uid |
!* %group |
!* +netgroup |
!* Runas_Alias
Runas_List和User_List是很相象的,僅僅是用Runas_Aliases替代了User_Aliases

Host_List ::= Host |
Host , Host_List
Host ::= !* hostname |
!* ip_addr |
!* network(/netmask)? |
!* +netgroup |
!* Host_Alias
Host_List 是由一個或者多個主機名,IP地址,網絡號,網絡組(要加上"+"前綴)或者其他的Host_Alias組成的.同樣的,一個列表項的值也可以用"!"來取消.如果您使用了一個網絡號但是沒有隨之指定子網掩碼,那麼主機的以太網接口的子網掩碼將被使用-----如果它能夠相配的話.子網掩碼可以用點分十進制表示法來指定(如:255.255.255.0),也可以用CIDR(無類型域間選路)表示法指定(採用掩碼中1的爲數,如:24.這和前面的 255.255.255.0是等價的).主機名可以包含shell風格的通配符(請查看下面的"通配符"一節),但是除非您機器上的hostname命令能返回完整的主機名,爲了使通配符有效您需要使用fqdn選項(見下面的"標誌"小節)

Cmnd_List ::= Cmnd |
Cmnd , Cmnd_List
commandname ::= filename |
filename args |
filename ""
Cmnd ::= !* commandname |
!* directory |
!* Cmnd_Alias
Cmnd_List 是由一個或多個命令名,目錄或者其他Cmnd_Alias組成的列表.命令名是一個可以包含shell風格通配符(請查看下面的"通配符"一節)的完整文件名.一個簡單的文件名永許用戶以任何他們想使用的參數來執行命令.但是您也可以指定命令行參數(可以包含通配符).您還可以通過交替的使用" "來說明這個命令執行時不能帶任何命令行參數.當您在Cmnd_List中指定了一個目錄時,用戶將可以執行這個目錄中的任何文件(不包括子目錄中的文件).
如果Cmnd關聯上了命令行參數,那麼用戶在命令行上所給的參數必需精確的匹配Cmnd中的參數(或者要和通配符匹配).注意,如果下面的字符在命令參數中出現的話,必須使用"\"來將其轉義: ,, :, =, .

默認項

通過一個或多個Default_Entry行,一些特定的配置選項在運行時可以從它們的默認值改變.(譯註:好拗口哦:p)這些選項可以對在任何主機上的所有用戶或者在某個特定主機上的所有用戶或者僅僅是一個特定的用戶產生作用.如果多個條目都匹配,那麼它們會按順序執行.如果有衝突的值,那麼最後一個匹配行上的值將會產生作用.
Default_Type ::= Defaults ||
Defaults : User ||
Defaults @ Host
Default_Entry ::= Default_Type Parameter_List
Parameter ::= Parameter = Value ||
Parameter += Value ||
Parameter -= Value ||
!* Parameter ||
Parameters 可以是標誌(flags),整數值(integer values),字符串(strings)或者列表(lists).標誌是一個布爾值,可以通過使用"!"操作符來取反.一些整數,字符串和列表參數也可以在布爾上下文中使用以使其取反.由多個單詞組成的值必須用雙引號引起來.一些特殊字符必須用"\"轉義.
列表還有兩個附加的操作符,+=和-=.這兩個操作符被分別用來從一個列表中增加或刪除條目.用"-="操作符從列表中刪除不存在的項目並不算是錯誤.
注意,由於sudoers文件是按順序解析的,所以放置Default段的最佳位置是在Host,User和Cmnd別名段之後,用戶定義段之前.

標誌

long_otp_prompt
When validating with a One Time Password scheme (S/Key or OPIE), a two-line prompt is used to make it easier to cut and paste the challenge to a local window. Its not as pretty as the default but some people find it more convenient. This flag is off by default.
(譯註:這一段我還沒讀懂,貼原文上來吧)
ignore_dot
如果設置(爲on)的話,sudo將會忽略PATH環境變量中的.或者(就是當前目錄).PATH本身不會被修改.這個標誌默認是on.
mail_always
每當有用戶使用sudo時就給mailto user發送一封郵件.此標誌默認是off.
mail_badpass
當用戶使用sudo但是卻輸入了錯誤的口令時將給mailto user發送一封郵件.此標誌默認是off.
mail_no_user
如果使用sudo的用戶在sudoers中沒有記錄的話將給mailto user發送一封郵件.此標誌默認爲on.
mail_no_host
如果使用sudo的用戶在sudoers中有記錄,但是他不被永許在正在使用的主機上使用sudo,將給mailto user(請查看"可以用在布爾上下文中的字符串"一節)發送一封郵件.此標誌默認爲off.
mail_no_perms
如果用戶有使用sudo的權限,但是他試圖用sudo使用的命令在sudoers中沒有列出來,那麼給mailto user發送一封郵件.此標誌默認爲off.
tty_tickets
如果設置(爲on)的話,用戶必須使用基於終端(tty)的的驗證方法.一般的,sudo在ticket dir裏使用一個與執行sudo的用戶同名的目錄.這個標誌設置後,sudo將在那個目錄中使用一個與執行sudo的用戶登錄tty同名的文件.此標誌默認爲on.
lecture
如果設置(爲on)的話,初次使用sudo的用戶將收到一個簡短的lecture.此標誌默認爲on.
authenticate
如果設置(爲on)的話,用戶在用sudo執行命令之前必須通過口令(或者通過其他的方式)來驗證身分.這個默認選項可以通過設置PASSWD和NOPASSWD標籤(tags)來覆蓋.此標誌默認爲on.
root_sudo
如果設置(爲on)的話,root也將被永許使用sudo.將此標誌設置爲off來阻值用戶通過使用類似於"sudo sudo /bin/sh"這樣的連鎖sudo命令來獲得一個root權限的shell.此標誌默認爲on.
log_host
如果設置(爲on)的話,主機名將被記錄在sudo的日誌文件(不是系統日誌)中.此標誌默認爲off.
log_year
如果設置(爲on)的話,四位的年份將被記錄在sudo的日誌文件(不是系統日誌)中).此標誌默認爲off.
shell_noargs
如果設置(爲on)並且sudo並未帶任何參數執行的話,sudo的表現就象是帶-s選項一樣.也就是說,將會以root身分運行一個shell(如果 SHELL環境變量被設置的話,這個shell就是SHELL定義的shell,否則,將運行用戶/etc/passwd中項的shell字段定義的 shell).此標誌默認爲off.
set_home
如果設置(爲on)並且sudo是帶-s選項執行的話,HOME環境變量將被設置爲目標用戶(target user)(除非sudo使用了-u選項,目標用戶就是root)的主目錄.這實際上使-s選項包含了-H選項.此標誌默認爲off.
always_set_home
如果設置(爲on)的話,sudo將把HOME環境變量設置爲目標用戶(target user)(除非sudo使用了-u選項,目標用戶就是root)的主目錄.這實際上意味着-H選項總是被包含.此標誌默認是off.
path_info
一般來說,如果一個命令不能在PATH環境變量中找到的話,sudo將會告訴用戶.但是某些站點可能會希望禁止這個特性.因爲這可以用來收集一些關於普通用戶沒有權限執行的命令的位置的信息.不利之處在於,如果命令只是不在用戶的PATH中的話,sudo將告訴用戶他們不被永許執行這些命令,這可能會把人高糊塗.此標誌默認是off.
preserve_groups
默認地,sudo會初始化目標用戶(target user)所在組列表的組向量(譯註:原文是By default sudo will initialize the group vector to the list of groups the target user is in.)preserve_groups設置後,用戶已存在的組向量將被保存不變.真實組ID和有效組ID仍然會被設置與目標用戶相匹配.此標誌默認是 off,
fqdn
如果您想在sudoers中使用完整主機名的話,請設置此項.例如:使用myhost.mydomain.edu來替代 myhost.設置後如果原意的話您也可以使用短格式(甚至把兩種格式混合起來使用).注意,打開fqdn標誌需要讓sudo進行DNS解析,而如果 DNS停止工作(例如機器沒有連入網絡)的話會導致sudo無法使用.同時需要注意的是,您必須使用DNS知道的主機正式名稱,也就是說您不能使用主機的別名(CNAME entry),因爲您無法從DNS處得到所有的別名.如果您機器的主機名(就是hostname命令的輸出)已經是完整格式,您就不需要設置fqdn.此標誌默認是off.
insults
如果設置(爲on)的話,sudo將會侮辱(insult)輸入錯誤口令的用戶(譯註:這也可以?:p).此標誌默認爲off.
requiretty
如果設置(爲on)的話,sudo僅僅在用戶從一個真正的tty上登錄時纔會執行.這將不永許像"rsh somehost sudo ls"這樣的命令,因爲rsh並不分配一個tty.因爲當沒有tty存在時無法關閉echo,所以一些站點可能會希望設置這個標誌來阻止用戶輸入可見(回顯)的口令.此標誌默認爲off.
env_editor
如果設置(爲on)的話,visudo將使用在EDITOR或者VISUAL環境變量中定義的編輯器,如果EDITOR和VISUAL都沒有定義的話將使用默認的編輯器列表.注意,這可能造成一個安全漏洞,因爲這永許用戶以root身份運行任意的命令而不被日誌記錄.一個安全的變通方法是在editor(見下面的"字符串"小節)中保存一個用冒號分隔的編輯器列表.這樣visudo將僅僅使用EDITOR或者VISUAL中定義的編輯器-----如果它們和editor列表中的某個項目匹配的話.
rootpw
如果設置(爲on)的話,sudo將提示輸入root的口令而不是執行sudo命令的用戶的口令.此標誌默認爲off.
runaspw
如果設置(爲on)的話,sudo將提示輸入由runsa_default選項定義的用戶(默認爲root)的口令而不是執行sudo命令的用戶的口令.此標誌默認爲off.
targetpw
如果設置(爲on)的話,sudo將提示輸入由sudo的-u選項指定的用戶(默認爲root)的口令而不是執行sudo的用戶的口令.此標誌默認爲off.
set_logname
一般地,sudo將把LOGNAME和USER環境變量設置爲目標用戶(除非使用了-u選項的話,就是root)的名字.但是,因爲一些程序(包括RCS版本控制系統)使用LOGNAME來確認用戶的真實身份,它可能想要改變這種行爲,這可以通過取消set_logname選項來實現.
stay_setuid
一般地,當sudo執行一個命令時,真實UID和有效UID都被設置爲目標用戶(默認是root)的UID.這個選項改變了這種行爲,它把真實UID保留爲執行sudo的用戶的UID.換句話說,這使sudo成爲了一個setuid程序.這在那些當setuid程序運行時禁用一些有潛在危險的功能的系統上會很有用.儘管如此,請注意這意味着sudo運行時的真實UID將是執行sudo命令的用戶的UID,這可能會允許用戶在能夠在日誌中記錄下一個 failure之前殺死sudo,這倚賴於您的操作系統如何定義信號和setuid進程之間的相互作用.
env_reset
如果設置(爲 on)的話,sudo將把環境重置爲只包含下列變量:HOME,LOGNAME,PATH,SHELL,TERM和USER(此外還有SUDO_*).在這些變量中,只有TERM保留原環境中的值不變,其他的變量都被設置爲默認值(值可能被set_logname選項修改).如果sudo編譯時加入了 SECURE_PATH選項,它的值將被作爲PATH環境變量的值.其他的變量可以由設置env_keep選項來保存.
use_loginclass
設置(爲on)的話,sudo將執行對目標用戶的登錄類指定的默認動作----如果存在的話.此選項僅僅在sudo配置時帶有--with-logincap選項時才存在.此標誌默認是off.

整數

passwd_tries
sudo向日志中寫入一個failure並退出之前允許用戶輸入口令的次數,默認爲3.

可以用在布爾上下文中的整數(integers that can be used in a boolean context)

loglinelen
日誌文件每行中的字母數.這個值用來決定日誌文件中什麼時候折行.這個選項僅影響sudo的日誌,而對系統日誌文件沒有影響.默認值爲80(使用0或者取消此選項來禁止折行).
timestamp_timeout
sudo再次詢問口令之前逝去的時間(以分鐘記).默認值爲5.如果想要總是詢問口令的話請把此值設置爲0.如果設置爲負數的話,用戶的時間戳永遠不會過期.這可以用來允許用戶分別使用sudo -v和sudo -k來建立或者刪除他們自己的時間戳.
passwd_timeout
sudo的口令詢問超時時間(分鐘記).默認爲5.設置爲0可以取消口令超時.
umask
執行命令時使用的umask值.要保留用戶的umask值的話請取消此選項或者設置爲0777.此選項的默認值爲0022.

字符串

mailsub
發送給mailto user的郵件使用的主題.轉義字符%h將被擴展爲機器的主機名.默認值爲"*** SECURITY information for %h ***".
badpass_message
當用戶輸入了錯誤的口令時顯示的信息.除非設置了insults的話,默認值將爲"Sorry, try again."
timestampdir
sudo存儲時間戳文件的目錄.默認值爲/var/run/sudo
passprompt
詢問口令時的提示.可以被sudo的-p選項或者SUDO_PROMPT環境變量所覆蓋.這裏提供了兩個轉義字符:%u將被擴展爲用戶的登錄名,而%h將被擴展爲本地主機名.此選項的默認值爲"Password:".
runas_default
使用sudo但沒有指定-u標誌時使用的默認用戶.默認爲root
syslog_goodpri
用戶身份驗證成功時使用的系統日誌優先級.默認爲notice
syslog_badpri
用戶身份驗證成功時使用的系統日誌優先級.默認爲alert
editor
用冒號分隔開的一個允許visudo使用的編輯器列表.可能的話visudo將選擇使用和用戶的USER環境變量相匹配的那個編輯器,或者是列表中的第一個存在且可執行的編輯器.默認值爲您系統中vi編輯器的路徑.

可以用在布爾上下文中的字符串(strings that can used in a boolean context)

logfile
sudo日誌(不是系統日誌)的存放位置.設置一個路徑來打開日誌功能,取消設置將關閉日誌功能.(Seting a path turns on logging to a file; negating this option turns it off.)
syslog
如果起用了syslog的話將使用的系統日誌設施(取消此選項來禁用系統日誌記錄)(譯註:原文爲:Syslog facility if syslog is being used for logging (negate to disable syslog logging)).默認爲arthpriv.
mailerpath
用來發送報警郵件的郵件程序的路徑.默認值是sendmail的路徑.
mailerflags
使用郵件程序時的標記,默認爲 -t.
mailto
發送報警郵件和錯誤郵件的目的地址.這個地址必須用雙引號引起來,以免sudo解釋"@"符號.默認值爲root.
exempt_group
在此組中的用戶將不要求口令和PATH.此選項默認沒有設置.
verifypw
此選項控制當用戶使用帶有-v選項的sudo時,何時要求口令.它可以有下面可能的值:
all:當前主機上sudoers中所有的用戶條目都必須設置NOPASSWD標誌來避免輸入口令.
any:當前主機上sudoers中至少有一個用戶條目必須設置NOPASSWD標誌來避免輸入口令.
never:用戶使用-v標誌但從不需要輸入口令.
always:用戶使用-v標誌但總是需要輸入口令.
默認的值是"all".
listpw
此選項控制當用戶使用帶有-l選項的sudo時,何時要求口令.它可以有下面可能的值:
all:[/size當前主機上sudoers中所有的用戶條目都必須設置NOPASSWD標誌來避免輸入口令.
any:當前主機上sudoers中至少有一個用戶條目必須設置NOPASSWD標誌來避免輸入口令.
never:用戶使用-l標誌但從不需要輸入口令.
always:用戶使用-l標誌但總是需要輸入口令.
默認值爲"any".

可以在布爾上下文中使用的列表(lists that can be used in a boolean context)

env_check
如果含有"%"或者"/"字符的話將從用戶的環境中刪除的環境變量.這將預防拙劣的程序中printf風格的格式所帶來的傷害.這個參數可以是一個用雙引號引起,由空格分隔的列表,或者是一個不帶引號的單值.這個列表可以通過分別使用"=",+=","-=","!"來重寫,增添,刪除或取反.當以root 身份執行帶-V選項的sudo命令時會打印出默認需要檢察的環境變量列表.
env_delete
將從用戶的環境中刪除的環境變量.這個參數可以是一個用雙引號引起,由空格分隔的列表,或者是一個不帶引號的單值.這個列表可以通過分別使用"=",+=","-=","!"來重寫,增添,刪除或取反.當以root身份執行帶-V選項的sudo命令時會打印出默認將被刪除的環境變量列表.
env_keep
當env_reset選項生效時將在用戶的環境中保留的環境變量.這允許對sudo派生的進程的環境進行精密的控制.這個列表可以通過分別使用"=",+=","-=","!"來重寫,增添,刪除或取反.此列表默認沒有成員.

當使用系統日誌進行日誌記錄時,sudo將接受下列值作爲系統日誌設施(譯註:原文爲When logging via syslog(3), sudo accepts the following values for the syslog facility)(syslog參數的值):authpriv(如果您的操作系統支持的話),auth,daemon,user,local0, local1,local2,local3,local4,local5,local6和local7.下列系統日誌優先級是被支持的:alert, crit,debug,emerg,err,info,notice和warning.


用戶說明(user specification)

User_Spec ::= User_list Host_List = Cmnd_Spec_List \
(: User_Spec)*
Cmnd_Spec_List ::= Cmnd_Spec |
Cmnd_Spec , Cmnd_Spec_List
Cmnd_Spec ::= Runas_Spec? (NOPASSWD: | PASSWD:)? Cmnd
Runas_Spec ::= ( Runas_List )
用戶說明決定在一個特定的主機上一個用戶能夠執行哪些命令.這些命令默認以root身份執行,但可以進行基於每個命令的更改.(譯註:原文爲By default, commands are run as root,but this can be changed on a per-command basis)
讓我們把它分成下面這些部分:

Runas_Spec

Runas_Spec 是一個用括號括起的一個簡單的Runas_List(在上面已經定義了),如果您在用戶說明中沒有指定一個Runas_Spec的話,將會使用默認的 root的Runas_Spec(譯註:這裏原文爲:If you do not specify a Runas_Spec in the user specification, a default Runas_Spec of root will be used).Runas_Spec設置了他後面所跟命令的默認項(譯註:原文爲A Runas_Spec sets the default for commands that follow it,這句話我實在是不知道怎麼翻譯,暫且這麼譯吧).對於下面的條目:
dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/who
(譯註:這裏應該是dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm)
這意味着用戶dgb可以運行/binls,/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身份.

NOPASSWD和PASSWD

默認地,sudo在用戶執行一個命令前會驗證用戶的身份.通過NOPASSWD標籤可以更改這個行爲.就象Runas_Spec一樣,NOPASSWD標籤給跟在它後面的Cmnd_Spec_List中的命令設置了一個默認項(譯註:原文是Like a Runas_Spec, the NOPASSWD tag sets a default for the commands that follow it in the 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
注意,儘管如此,PASSWD標籤對於在exempt_group選項中指定了的組中的用戶無效.
默認地,如果對當前主機上的某個用戶的任何一個條目設置了NOPASSWD標籤的話,他將能夠運行sudo -l而不提供口令.另外,如果對屬於當前主機的用戶的所有條目都設置了NOPASSWD標籤的話,這個用戶就只能運行sudo -v而不提供口令.(譯註:前面兩句話的原文是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 password if the NOPASSWD tag is present for all a users entries that pertain to the current host).這個行爲可以通過設置verifypw和listpw選項來更改.

通配符(又稱meta字符)

sudo允許在sudoers中的路徑名和命令行參數中使用shell風格的通配符.通配符匹配是通過POSIX的fnmatch標準程序實現的.注意,這不是正則表達式.

* 匹配任意一組零個或者多個字符
? 匹配任意一個字符
[...] 匹配任意一個在大括號中指定範圍裏的字符
[!...] 匹配任何一個不在大括號中指定範圍裏的字符
\x 任意一個字符"x"識別爲單純的"x".這用來轉義像"*","?","[","]"和"}"這樣的一些特殊字符

注意,路徑名中的通配符不會匹配正斜線("/").在匹配命令行參數時,因爲斜線不被通配符匹配,這使/usr/bin/*匹配/usr/bin/who而不匹配/usr/bin/X11/xterm.

通配符規則的例外

對上面的規則有下面的例外:
"""" 如果空字符串""是sudoers條目中僅有的命令行參數,這意味着這條命令執行時不允許帶有任何參數.


其它的特殊字符和保留字

美元符("#")被用來指明一條註釋(除非它出現在用戶名上下文中並且後面跟有一個或多個數字,在這種情況下它被作爲一個UID來對待).所有的註釋字符和任何的文本,直到一行的結尾都將被忽略
保留字ALL是ailas中經常導致成功匹配的單位.它可以在任何可以使用Cmnd_Alias,User_Alias, Runas_Alias, 或Host_Alias的地方使用.您不應該試圖定義一個名爲ALL的別名,因爲aleas中的單位將用作您的個人偏好.請注意,在命令上下文 (command context)中使用ALL是非常危險的,它允許用戶在系統上運行任何命令.
感嘆號("!")可以在別名中和Cmnd前用作邏輯非操作符.這允許排除一些特定的值.儘管如此,但請注意,聯合ALL別名中的單位使用"!"將允許用戶蓄意執行罕見的除了少數以外的所有命令(譯註: 原文是Note ,however, that using a ! in conjunction with the built in ALL ailas to allow a user to run "all but few" commands rarely works as intended)(參閱下面的"安全要點"一節).
可以在一行的末尾使用反斜線("\")來在下一行延續此行,此時這兩行將作爲完整的一行對待.
列表元素和用戶說明中的特殊語法字符之間的空格是可選的.
下面的字符作爲一個詞的一部分(例如,一個用戶名或者一個主機名)出現時必需使用反斜線("\")來轉義:"@","!","=",":", ",", "(", ")", "\".


示例

下面是sudoers條目的示例.顯然,一些示例有點不自然.首先,我們定義別名:
# 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

# 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, /usr/sbin/fasthalt
Cmnd_Alias REBOOT = /usr/sbin/reboot, /usr/sbin/fastboot
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
接下來我們改寫了一些編譯進的默認值.我們希望sudo在所有情況下使用auth設施在系統日誌中作記錄.我們不想總是輸出初次使用sudo的提示,並且用戶millert使用sudo不需要口令.另外,我們爲SERVERS Host_Alias中的主機維護一個附加的本地日誌文件.並且由於這個日誌需要保存許多年,我們要在日誌的每一行中加入年份信息.
# Override built in defaults
Defaults syslog=auth
Defaults:FULLTIMERS !lecture
Defaults:millert !authenticate
Defaults@SERVERS log_year, logfile=/var/log/sudo.log
實際上決定誰能運行什麼的是用戶說明部分:
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明確的給出了掩碼(用CIDR方式),指明這是個C類網.對CSNETS中的其他網絡來說,如果本地主機的掩碼匹配的話將使用本地主機的掩碼.
lisa CUNETS = ALL
用戶lisa可以在CUNETS別名(B類網絡128.138.0.0)中的任何主機上執行任何命令.
operator ALL = DUMPS, KILL, PRINTING, SHUTDOWN, HALT, REBOOT,\
/usr/oper/bin/
用戶operator可以執行的命令被限制在一個簡單的maintenance中.這裏就是和備份,殺死進程,打印系統,關閉系統和任何在/usr/oper/bin/中的命令.
joe ALL = /usr/bin/su operator
用戶joe只能su成operator.
pete HPPA = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root
用戶pete可以修改HPPA上除了root以外任何用戶的口令.注意,這裏人爲passwd不會在命令行上使用多個用戶名.
bob SPARC = (OP) ALL : SGI = (OP) ALL
用戶可以在SPARC和SGI上以任何在OP Runas_Alias中列出的用戶(root和operator)的身份運行任何命令.
jim +biglab = ALL
用戶jim可以在biglab網絡用戶組中的機器上運行任何命令.因爲biglab前面加上了前綴"+",所以sudo知道這是一個網絡用戶組.
+secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser
網絡用戶組secretaries中的用戶需要幫助管理打印機和進行增刪用戶的工作,所以需要允許他們在任何機器上執行這些命令.
fred ALL = (DB) NOPASSWD: ALL
用戶fred可以在DB Runas_Alias (oracle 或 sybase)上以任何人的身份執行任何命令而不需要提供口令.
john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
用戶john可以在ALPHA上su成除root的任何人,但是不允許他給su加上任何標誌執行.
jen ALL, !SERVERS = ALL
用戶jen可以在除了SERVERS Host_Alias (master, mail, www 和 ns)以外的任何機器上執行任何命令.
jill SERVERS = /usr/bin/, !SU, !SHELLS
用戶jill可以在任何SERVERS Host_Alias中的機器上運行/usr/bin/下除了屬於SU和SHELLS Cmnd_Aliases外的任何命令.
steve CSNETS = (operator) /usr/local/op_commands/
用戶steve可以在任何CSNETS中的機器上執行/usr/local/op_commands/中的所有命令,但是隻能以operator的身份.
matt valkyrie = KILL
用戶matt應該可以在他自己的工作站valkyrie上殺死掛起的進程.
WEBMASTERS www = (www) ALL, (root) /usr/bin/su www
任何在WEBMASTERS User_Alias (will, wendy,和 wim)中的用戶都能夠在主機www上以www(網頁的所有者)的身份執行任何命令,或者簡單的su成www.
ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
/sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM
所有的用戶都應該能夠在 CDROM Host_Alias (orion, perseus, hercules)中的主機上mount和unmount光盤驅動器而不需要輸入口令.對用戶來說敲入這麼長的命令有些冗長而乏味,所以把它封裝在一個 shell腳本中是一個最佳的選擇.


安全要點

使用"!"來從ALL中減去命令一般來說不會產生預期作用.用戶可以簡單的通過把希望執行的命令改名執行的法子來繞過限制.例如:
bill ALL = ALL, !SU, !SHELLS
這並不會阻止bill執行SU和SHELLS中列出的命令.他只需要把這些命令改一個名字,或者從一個編輯器或者其他程序中escape到shell(譯註:原文是use a shell escape from an editor or other program)就可以運行了.所以這種類型的限制至少應該經過深思熟慮(並從策略上加強它).

CAVEATS

sudoers必需總是使用visudo命令來編輯,因爲它會鎖定文件並且進行語法檢察.這強制sudoers擺脫語法錯誤,因爲sudoers有語法錯誤時sudo是不會運行的.
當使用機器的網絡用戶組時(與用戶相反),如果您在網絡用戶組中存貯了完整的主機名(這經常是事實),您需要讓主機名像hostname命令的輸出一樣是完整的或者在sudoers中使用fqdn選項.


文件

/etc/sudoers 誰能作什麼的一個列表
/etc/group 本地組文件
/etc/netgroup 網絡組文件


參閱

rsh(1), sudo(8), visudo(8), su(1), fnmatch(3).
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章