sudo
sudo的使用
- sudo命令可以用来使用其他的用户身份执行指定的命令。如果未授权用户尝试使用 sudo,会提示联系管理员。
- sudo还有日志功能,无论谁使用sudo命令操作什么命令,都会被记录在日志当中
/var/log/secure
。 - sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机
- sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为
5分钟
的“入场券”,关于时间戳文件在/var/db/sudo
- 通过visudo命令编辑配置文件,具有语法检查功能
visudo –c
检查语法
命令:sudo [-u user] COMMAND
参数:- -V 显示版本信息等配置信息
- -u user 默认为root
- -l,ll 列出用户在主机上可用的和被禁止的命令
- -v 再延长密码有效期限5分钟,更新时间戳
- -k 清除时间戳(1970-01-01),下次需要重新输密码
- -K 与-k类似,还要删除时间戳文件
- -b 在后台执行指令
- -p 改变询问密码的提示符号 示例: -p ”password on %h for user %p:"
上面就是命令的使用介绍和一些参数,并没有具体的示例,那是因为,我们真正的要使用这个命令,需要配合针对于该命令的配置,配置文件在/etc/sudoers
, /etc/sudoers.d/
中,其中第一个数主配置文件,第二个是次配置文件,但在实际上,我们最好是将我们的规则写在此配置文件目录中,这样便于管理还以免损坏主配置文件,接下来,我们先对主配置文件进行了解:
root ALL=(ALL) ALL
, 其实是 user host=(runas) command
,其中user代表是运行命令者的身份,host是指通过哪些主机运行,runas是以哪个用户的身份运行,command运行哪些命令。 第二个配置 %wheel ALL=(ALL) ALL
则是让哪些组中的成员以某些身份在哪些机器上运行哪些命令。 然后我们做一些示例,当然,我们需要写配置文件的,我们把配置写到/etc/sudoers.d/下面去,保证主配置文件不变。我们使用创建文件test
(文件名可自己取,没问题)
tom ALL=(root)/usr/bin/cat /etc/shadow
我们使用tom用户去使用root的身份在所有机器上查看shasow文件,在一般情况下,作为普通用户tom是没有权限查看该文件的,但是,我们给他一个临时执行的权限,他就能使用sudo命令查看到该文件。
我们可以看到,他可以查看该文件,但是需要输入自己的密码,并且在5分钟之内使用该命令,不需要再次输入密码,关于此的时间戳文件在/var/db/sudo
,一点五分钟的时间过了,我们需要重新输入密码。并且时间戳文件会自动更新。
visudo –c
来检查一下该文件是否有问题。 [root@CT73 sudoers.d]$ visudo -c/etc/sudoers: parsed OK/etc/sudoers.d/test: bad permissions, should be mode 0440
我们看到test语法是没有问题的,但是权限有点问题,它说权限应该是440,我们需要把它改改,我们可以使用手动修改,或者在写这个文件的时候使用visudo -f test来写就没问题了。
我们的配置文件还是支持通配符的,例如:
- ? :任意单一字符
- * :匹配任意长度字符
- [wxc]:匹配其中一个字符
- [!wxc]:除了这三个字符的其它字符
- \x : 转义
- [[alpha]] :字母 示例: /bin/ls [[alpha]]*
以上这些都可以使用在通配符里面,如:
tom ALL=(root)/usr/bin/cat /etc/*
此时tom就可以使用cat命令查看/etc/下面的所有文件内容。或者我们还可以这样写:
tom ALL=(root)/usr/sbin/useradd
这个配置使得tom用户具有创建用户的权限。
在配置文件中,我们可以使用以下的命名方式:
Users和runas:- username
- #uid
- %group_name
- %#gid
- user_alias | runas_alias
host:
- ip或hostname
- network(/netmask)
- host_alias
command:
- command name
- directory
- sudoedit
- Cmnd_Alias
示例如下:
让tom可以在192.168.111.120主机下删除用户tom 192.168.111.120=(#0)/usr/sbin/userdel
让tom可以修改sudoers文件,这是一个可怕的命令,tom可以修改任何他想得到的权限。
tom 192.168.111.120=(#0) sudoedit
命令别名
很多的时候,需要使用sudo的用户很多,我们要对他们处理,如果将一个配置写的很长,会看起来很多,这时候,我们就可以使用命令别名:
别名有四种类型: User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias示例1:
让student用户可以使用pidof和ifconfig命令,让在wheel组里面的用户可以无密码执行任何操作student ALL=(root)/sbin/pidof,/sbin/ifconfig%wheel ALL=(ALL) NOPASSWD: ALL
实例2:
定义用户别名,包含两个用户,定义命令别名,让这两个用户可以执行该操作。User_Alias NETADMIN= netuser1,netuser2Cmnd_Alias NETCMD =/usr/sbin/ipNETADMIN ALL=(root) NETCMD
示例3:
SYSADER SERS= SYDCMD,DSKCMD没有带()
,它就代表 ALL
任何人 User_Alias SYSADER=wang,mage,%adminsUser_Alias DISKADER=tomHost_Alias SERS=www.fire.com,172.16.0.0/24Runas_Alias OP=rootCmnd_Alias SYDCMD=/bin/chown,/bin/chmodCmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk SYSADER SERS= SYDCMD,DSKCMDDISKADER ALL=(OP) DSKCMD
示例4:
定义两个用户,在使用useradd,usermod,和passwd使用的时候不需要输入密码(设置无法改变root的密码),在userdel的时候需要输入密码(防止误操作,删除用户)User_Alias ADMINUSER = adminuser1,adminuser2Cmnd_Alias ADMINCMD =/usr/sbin/useradd,/usr/sbin/usermod,/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel
示例5:
默认设置,在授权普通用户使用sudo命令时,如果没有-u username
的话,默认使用wang用户,在()
不写tom,或者没有()
,默认就是以tom的执行命令 Defaults:wang runas_default=tomwang ALL=(tom,jerry) ALL
示例6:
wang 192.168.175.136,192.168.175.138=(root)/usr/sbin/,!/usr/sbin/useradd
示例7:
让tom可以查看message*的日志文件,但是这里有一个安全问题tom ALL=(ALL) NOPASSWD:/bin/cat /var/log/messages*
我们在使用tom用户cat/var/log/messages时候,还可以:
sudo cat /var/log/messages /etc/shadow
并且在man帮助文档中有说明:
Note that mail will not be sent if an unauthorized user tries to run sudo with...skipping...%operator ALL =/bin/cat /var/log/messages*will allow command like:$ sudo cat /var/log/messages.1It will also allow:$ sudo cat /var/log/messages /etc/shadowwhich is probably not what was intended.