sudoers文件的作用是控制用户可以执行哪些指令。它是Linux系统管理员的重要一课喔。
sudoers文件由三部分组成:
'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用户执行
如果不是很理解的话,可以对比着文章后面举的例子来看下,应该难不倒聪明的我们!
通配符只可以用在主机名、文件路径、命令行的参数列表中。下面是可用的通配符:
*:匹配任意数量的字符
?:匹配一个任意字符
[...]:匹配在范围内的一个字符
[!...]:匹配不在范围内的一个字符
\x:用于转义特殊字符
在使用通配符时有以下的注意点:
1.使用[:alpha:]等通配符时,要转义冒号':',如:[\:alpha\:]
2.当通配符用于文件路径时,不能跨'/'匹配,如:/usr/bin/*能匹配/usr/bin/who但不能匹配/usr/bin/X11/xterm
3.如果指令的参数列表是""时,匹配不包含任何参数的指令。
4.ALL这个关键字表示匹配所有情况。
# 用户别名定义
User_Alias FULLTIMERS = millert, mikef, dowdy
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim
#用户切换别名定义
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase
Runas_Alias ADMINGRP = adm, oper
#主机别名定义
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 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
#开始定义规则
#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身份执行任意指令
jen ALL, !SERVERS = ALL
#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/