2019獨角獸企業重金招聘Python工程師標準>>>
文件的組成
? ? ? sudoers文件由三部分組成:
- sudoers的默認配置,主要設置sudo的一些缺省值(本文不會對這些默認配置進行介紹,若有興趣可以自己man 5 sudoers然后搜defaults)
- alias(別名),可以看作是變量的定義啦,本文也會全面的說說別名的定義。
- 規則定義,sudoers文件的重點啦,本文會著重說明規則的定義。
Alias(別名)
一共有四種類型的別名,這些類型可以看作它們是數據類型啦哈。
- User_Alias
- Runas_Alias
- Host_Alias
- Cmnd_Alias
那么要如何定義這些Alias呢?語法如下:
User_Alias NAME=User_ListRunas_Alias NAME=Runas_ListHost_Alias NAME=Host_ListCmnd_Alias NAME=Cmnd_List
?
這里的NAME就可以看作是變量名咯。注意,NAME必須是要以大寫字母開頭,而且只能包含有大寫字母,數字,下劃線呢。那么User_List,Runas_List,Host_List,Cmnd_List又是什么呢?其實就是以“,"分隔的一個數組啦,只不過這四個別名表示的數組內容都會不同啦。
?
現在分別看看User_List,Runas_List,Host_List,Cmnd_List的每個數組元素可以是些什么值吧!
User:[!][username?|#uid?|%groupname?|?+netgroup?|%:nonunix_group?|?User_Alias]Runas:[!][username|#uid?|?%groupname?|?+netgroup?|Runas_Alias]Host:[!][hostname?|?ip_addr?|?network(/netmask)??|??netgroup?|?Host_Alias]Cmnd:[!][commandname|?directory|?"sudoedit"?|?Cmnd_Alias]
?
看看上面的元素名就可以知道大概什么意思了吧?這里著重拿些可能有疑問的出來說說。
嘆號'!'表示取反的意思啦。
每個元素都可以是之前定義過的別名變量啦,所以會有User_List,Runas_List,Host_List,Cmnd_List這些元素啦。
directory表示有可以進入該目錄并執行命令的權限啦
"sudoedit"表示允許用戶使用sudo -e選項。
?
如果還沒搞懂的話,可以看下面的別名定義的例子:
User_Alias USER_TEST=tim,#501,%svn,+webgroup,%:nonunix,!nouserRunas_Alias RUNAS_TEST=tim,#501,%svn,!+webgroupHost_Alias HOST_TEST=!www.baidu.com,localhost,127.0.0.1Cmnd_Alias CMND_TEST=Cmnd_Alias CMDS=/bin/passwd,/bin/ls,/home/svn
User Specification(用戶規則)
用戶規則定義的語法如下:
User_List Host_List=(Runas_List1:Runas_List2) SELinux_Spec Tag_Spec Cmnd_List,...
下面對上面的語法進行說明一下:
User_List(必填項):指的是該規則是針對哪些用戶的。
Host_List(必填項):指的是該規則針對來自哪些主機的用戶。
Runas_List1(可選項):表示可以用sudo -u來切換的用戶
Runas_List2(可選項):表示可以用sudo -g來切換的用戶組
SELinux_Spec(可選項):表示SELinux相關的選項,可選值為ROLE=role 或 TYPE=type。本人對SELinux不太熟,以后再補充這里吧。
Tag_Spec(可選項):用于控制后面Cmnd_List的一些選項啦,可選值有下面這些,具體自己man一下吧,這里就不啰嗦了。
'NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' |?'SETENV:' | 'NOSETENV:' | 'LOG_INPUT:' | 'NOLOG_INPUT:' |?'LOG_OUTPUT:' | 'NOLOG_OUTPUT:'
...(可選項):表示可以有多個(Runas_List1:Runas_List2) SELinux_Spec Tag_Spec Cmnd_List段的意思了。
Notice:如果Runas_List1和Runas_List2都沒填的話,默認是以root用戶執行
如果不是很理解的話,可以對比著文章后面舉的例子來看下,應該難不倒聰明的我們!
?
sudoers文件下的通配符
通配符只可以用在主機名、文件路徑、命令行的參數列表中。下面是可用的通配符:
*:匹配任意數量的字符
?:匹配一個任意字符
[...]:匹配在范圍內的一個字符
[!...]:匹配不在范圍內的一個字符
\x:用于轉義特殊字符
在使用通配符時有以下的注意點:
1.使用[:alpha:]等通配符時,要轉義冒號':',如:[\:alpha\:]
2.當通配符用于文件路徑時,不能跨'/'匹配,如:/usr/bin/*能匹配/usr/bin/who但不能匹配/usr/bin/X11/xterm
3.如果指令的參數列表是""時,匹配不包含任何參數的指令。
4.ALL這個關鍵字表示匹配所有情況。
?
man sudoers下的例子解析
? ? ? ?
# 用戶別名定義User_Alias ? ? FULLTIMERS = millert, mikef, dowdyUser_Alias ? ? PARTTIMERS = bostley, jwfox, crawlUser_Alias ? ? WEBMASTERS = will, wendy, wim#用戶切換別名定義Runas_Alias ? ?OP = root, operatorRunas_Alias ? ?DB = oracle, sybaseRunas_Alias ? ?ADMINGRP = adm, oper#主機別名定義Host_Alias ? ? SPARC = bigtime, eclipse, moet, anchor :\SGI = grolsch, dandelion, black :\ALPHA = widget, thalamus, foobar :\HPPA = boa, nag,?PythonHost_Alias ? ? CUNETS = 128.138.0.0/255.255.0.0Host_Alias ? ? CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0Host_Alias ? ? SERVERS = master, mail, www, nsHost_Alias ? ? CDROM = orion, perseus, hercules#指令別名定義Cmnd_Alias ? ? DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\/usr/sbin/restore, /usr/sbin/rrestoreCmnd_Alias ? ? KILL = /usr/bin/killCmnd_Alias ? ? PRINTING = /usr/sbin/lpc, /usr/bin/lprmCmnd_Alias ? ? SHUTDOWN = /usr/sbin/shutdownCmnd_Alias ? ? HALT = /usr/sbin/haltCmnd_Alias ? ? REBOOT = /usr/sbin/rebootCmnd_Alias ? ? SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \/usr/local/bin/tcsh, /usr/bin/rsh, \/usr/local/bin/zshCmnd_Alias ? ? SU = /usr/bin/suCmnd_Alias ? ? PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less
#開始定義規則
#root用戶及wheel用戶組下的所有用戶都可以從任何主機連接進來以任意身份執行任意命令
root ? ? ? ? ? ALL = (ALL) ALL
%wheel ? ? ? ? ALL = (ALL) ALL
#FULLTIMERS這個用戶別名中定義的用戶可以從任何主機連接進來以任意身份執行任意命令,而且在切換用戶或用戶組時不需要輸入密碼
FULLTIMERS ? ? ALL = NOPASSWD: ALL
#PARTTIMERS這個用戶別名中定義的用戶可以從任何主機連接進來以root身份執行任意命令。
PARTTIMERS ? ? ALL = 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.
? ?
jack ? ? ? ? ? CSNETS = ALL
#lisa這個用戶可以從CUNETS中定義的主機連接進來以root身份執行任意指令。
?lisa ? ? ? ? ? CUNETS = ALL
#oprator這個用戶可以從任何主機連接進來以root身份執行DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,sudoedit /etc/printcap, /usr/oper/bin/定義的指令
? ? ? ?
operator ? ? ? ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\sudoedit /etc/printcap, /usr/oper/bin/
#joe這個用戶可以從任何主機連接進來,并且只能執行su operator指令
joe ? ? ? ? ? ?ALL = /usr/bin/su operator
#pete這個用戶可以從HPPA定義的主機中連接進來并以root身份執行passwd的所有命令,除了passwd root
pete ? ? ? ? ? HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
? ? ? ?
#opers這個用戶組下的所有用戶可以從任何主機連接進來,并可以切換至ADMINGRP中定義的用戶組進入/usr/sbin并執行命令
%opers ? ? ? ? ALL = (: ADMINGRP) /usr/sbin
#bob這個用戶可以從SPARC和SGI中定義的主機連接進來,并可以OP定義的用戶執行任意指令?
bob ? ? ? ? ? ?SPARC = (OP) ALL : SGI = (OP) ALL
#jim這個用戶可以從biglab這個netgroup中連接進來,并執行任意指令
jim ? ? ? ? ? ?+biglab = ALL
#secretaries這個netgroup下的所有用戶可以從任意主機連接進來,并以root身份執行PRINTING,/usr/bin/adduser, /usr/bin/rmuser中定義的指令
? ? ? ?
%secretaries ? ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser
#fred這個用戶可以從任何主機連接進來并以DB別名定義的用戶來執行所有指令,并且不需要輸入密碼
fred ? ? ? ? ? ALL = (DB) NOPASSWD: ALL
#john這個用戶可以從ALPHA定義的主機中連接進來,并可以以root身份執行su指令,但不能執行su root和使用任何su選項
? ?
john ? ? ? ? ? ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root*
?#jen這個用戶可以從任何主機(除了SERVERS中定義的主機)連接進來,并以root身份執行任意指令
#jill這個用戶可以從SERVERS定義的主機連接進來,并以root身份進入/usr/bin/執行指令,但不能執行SU和SHELLS中定義的命令
jill ? ? ? ? ? SERVERS = /usr/bin/, !SU, !SHELLS
#steve這個用戶可以從CSNETS中定義的主機連接進來,并以operator這個用戶可以進入/usr/local/op_commands/執行指令
steve ? ? ? ? ?CSNETS = (operator) /usr/local/op_commands/
? ? ? ?
?