sudo的作用在man中概括为"execute a command as another user",即以另外一个用户的身份来执行一条命令。之所以想到这条命令是因为前段时间公司服务器上的文件莫名全部消失而导致的系统重装,追根朔源,系统的安全措施不够到位。
- 登陆到机器上的用户为使用方便,全部使用root用户
- root密码过于简单,并且没有做相应的定期更换
- 通过telnet登陆的用户大部分为同一个用户,造成系统记录多是以该用户名记录的,虽然可以通过IP地址查证本人,但是IP的伪装确是再容易不过的事
为解决第一和第三个问题,可以实行“实名制”,即为每个用户分配一个用户名,所有用户对系统的使用必须通过自己的用户名来完成。那么一些必须由root用户才能进行的操作就以sudo的方式来执行,因为对sudo的使用是有记录可查的,那么大部分用户的行为也就是可以记录的了。
sudo可以为每一个用户单独授权,授权(也就是用户可以执行的命令)是命令的条数为单位的。sudo的配置在/etc/sudoers文件中完成,使用专用的"visudo"命令来编辑(visudo保证用户能够安全的编辑/etc/sudoers文件,如语法检查、并行编辑等)。最简单的/etc/sdoers文件如下:
#
# This file MUST be edited with the ' visudo ' command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults specification
# User privilege specification
root ALL = (ALL) ALL
gongam ALL =NOPASSWD:/sbin/ ifconfig
#gongam ALL =/sbin/ ifconfig
# Uncomment to allow people in group wheel to run all commands
# % wheel ALL = (ALL) ALL
# Same thing without a password
# % wheel ALL = (ALL) NOPASSWD: ALL
# Samples
# % users ALL =/ sbin / mount / cdrom, / sbin / umount / cdrom
# % users localhost =/ sbin / shutdown - h now
仅在原始文件上添加了红色的两行,以#开头的行为注释行。"gongam ALL=NOPASSWD:/sbin/ifconfig"的意思是允许gongam这个用户在任何主机登陆使用"sudo /sbin/ifconfig"命令并且不需要输入密码。
仿照这个文件我们就可以为特定用户赋予特定的权利了。高级的用法如限制主机、用户组、命令组的用法可以参照下面的规则,详细可参看"man sudoers":
Host_Alias < 主机组名 >=< 主机名1 > , < 主机名2 >
User alias specification :
User_Alias < 用户组名 >=< 用户名1 > , < 用户名2 >
Cmnd alias specification :
Cmnd_Alias < 命令集名 >=< 命令1 > , < 命令2 >
User privilege specification :
< 用户名 > < 主机组名 >= ([sudo目的角色])[NOPASSWD:] < 命令1 > , < 命令2 > : ([sudo目的角色])[NOPASSWD:]<命令1>,<命令2>
sudo的默认目的角色为root;没有配置"NOPASSWD"参数,则默认5分钟后再次用sudo需要重新验证身份(即输入密码)。
sudo的使用,常用参数解释:
- H 将HOME环境变量设为新身份的HOME环境变量。
- k 结束密码的有效期限,也就是下次再执行sudo时便需要输入密码。
- l 列出目前用户可执行与无法执行的指令。
- p 改变询问密码的提示符号。
- s 执行指定的shell。
- u < 用户 > 以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份。
- v 延长密码有效期限5分钟。
备注 :
- 使用sudo时,虽然是以目的用户(如root)的身份执行命令,但是环境变量并没有变成目的用户的,所以执行命令是要给出绝对路径,如普通用户需要输入"sudo /sbin/ifconfig"后才能执行root的ifconfig命令。
- 要记录日志需要在/etc/sudoers添加"Defaults logfile=/var/log/sudo.log"