3.4.7 利用sudo控制用户对系统命令的使用权限
您可以在百度里搜索“跟老男孩学Linux运维:Web集群实战 艾草文学(www.321553.xyz)”查找最新章节!
3.4.7 利用sudo控制用户对系统命令的使用权限
为了安全及管理的方便,可将需要root权限的普通用户加入sudo管理,这样用户就可以通过自己的普通账户登录,利用root的权限来管理系统了,当然也就不需要有root账号及密码了。
图3-32 Linux服务器安全形象示意图
执行如下visudo命令,即可打开sudo的配置文件进行编辑。
[root@wwwentos ~]#visudo #→相当于直接编辑/etc/sudoers,但用命令方式更安全,推荐
在/etc/sudoers文件的大约第98行下面,添加需要提升为root权限的普通用户名及对应权限,格式如下:
visudo或者vi /etc/sudoers,在98行下面加入,也可以在其他位置加入。 root ALL=(ALL) ALL<==此行是98行 oldboy ALL=(ALL)/usr/sbin/useradd,/usr/sbin/userdel
上述内容不同列对应的说明见表3-5。
表3-5 sudo提权配置说明
提示:如果oldboy用户被授予上述权限,那么它可在所有的机器上以所有的角色运行useradd、userdel命令。
如果是针对用户组,则对应的授权命令如下:
%用户组 机器=(授权使用哪个角色的权限) /usr/sbin/useradd
通过sudo进行授权管理系统的目的:既能让运维人员干活,又不能让其威胁系统安全,其实就是前面讲的用户权限最小化原则,还可以审计用户使用sudo的提权操作命令。
为了管理方便,这里暂时给oldboy授权all权限,即可以管理整个系统。
详细操作过程为:输入visudo找到第98行,并在该行下面放入如下内容。
oldboy ALL=(ALL) NOPASSWD: ALL#→这个配置结尾的ALL表示oldboy可拥有完全的系统管理权限,NOPASSWD表示提权执行命令时不提示密码
配置完成后要进行检查,命令如下:
[root@www ~]# grep oldboy /etc/sudoers oldboy ALL=(ALL)NOPASSWD: ALL
也可以使用如下快速操作命令增加sudo授权,仅限于批量管理的情况:
cp /etc/sudoers /etc/sudoers.ori echo "oldboy ALL=(ALL)NOPASSWD: ALL " >>/etc/sudoers tail -1 /etc/sudoers visudo -c#→直接追加内容没有语法检查,因此要单独执行语法检查命令
将以上信息更改后,保存退出。
此时再以oldboy用户登录系统时,就可以通过执行类似sudols-l/root(sudo后面加正常命令)的命令以root用户的权限管理系统了,如下:
[oldboy@www ~]$ ls /root ls: cannot open directory /root:Permission denied #→可以看到,oldboy用户是无法直接访问访问/root家目录的 [oldboy@www ~]$sudo ls /root anaconda-ks.cfg install.log install.log.syslog#→通过sudo命令,使得oldboy用户具备了访问/root目录的权限
说明:
·通过sudo授权管理后,所有用户执行授权的特殊权限格式为“sudo命令”。
·如果需要切换到root执行相关操作,可以通过“sudosu-”命令,注意,此命令提示的密码为当前用户的密码,而不是root的密码。
·执行“sudo-l”命令可以查看当前用户被授予的sudo权限集合。如下:
[oldboy@oldboy ~]$ sudo -l [sudo] password for oldboy: MatchingDefaults entries for oldboy on this host: User oldboy may run thefollowing commands on this host: (ALL) /usr/sbin/useradd, (ALL)/usr/sbin/userdel
·对于Linux系统bash的内置命令,一般无法进行sudo授权,例如cd命令。
sudo授权与su切换的原理示意图如图3-33所示。
图3-33 su与sudo用户角色切换原理图
在生产环境中,通常会禁止root远程登录,不过,会为每个运维人员建立一个普通账号,然后根据运维人员的需求,通过sudo控制登录系统的权限,事实证明这是一个不错的权限管理方式。当然,在笔者的生产环境中还使用了ldap统一认证登录及授权管理的方式。即只要有一个账号和密码,全公司多个机房系统内通行无阻(系统登录、SVN、VPN等),有关这部分内容的讲解,在老男孩教学的高级课程中会有涉及。在此,大家了解一下即可。
普通用户的环境变量问题:在早期的Centos5系统中,普通用户执行系统管理相关命令会遭遇到环境变量问题,导致找不到执行的命令(CentOS6以后的系统已经不存在这个问题了)。
解决办法:先对比root和oldboy用户下默认的PATH环境变量,命令如下。
root@wwwentos ~# echo $PATH/application/jdk/bin:/application/jdk/jre/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/bin:/root/bin[oldboy@centos oldboy]$ echo $PATH/application/jdk/bin:/application/jdk/jre/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:/home/oldboy/bin:/home/oldboy/bin
经过对比可发现普通用户上几个关键的环境变量(/usr/local/sbin:/sbin:/usr/sbin:)是导致找不到执行命令的原因(除非带全路径执行)。可通过如下命令来解决此问题:
[oldboy@centos ~]$ vi ~/.bash_profile#→编辑~/.bash_profile环境变量文件,把:/usr/local/sbin:/sbin:/usr/sbin添加到PATH环境变量里,注意,每个路径之间用冒号分隔。PATH=$PATH:$HOME/bin:/home/oldboy/scripts:/usr/local/sbin:/sbin:/usr/sbin#→加粗部分:/usr/local/sbin:/sbin:/usr/sbin即为添加的内容 export PATH[oldboy@centos ~]$ source ~/.bash_profile #→使添加的内容生效[oldboy@@centos ~ $ echo $PATH/application/jdk/bin:/application/jdk/jre/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:/home/oldboy/bin:/home/oldboy/bin:/home/oldboy/scripts:/home/oldboy/bin:/home/oldboy/scripts:/home/oldboy/bin:/home/oldboy/scripts:/usr/local/sbin:/sbin:/usr/sbin
sudo授权对于bash的内置命令处理,是一个难题,因为内置命令没有实体文件和路径,不过一般都有解决方法,例如可以使用sudols替代sudo cd,有的网友使用sudo bash后再使用内置命令,这是很危险的,不推荐。 跟老男孩学Linux运维:Web集群实战