linux 切换用户身份、su、sudo、/etc/sudoers
su:substitute['sʌbstɪtjuːt]代替 user
su 的语法为:
su [OPTION选项参数] [用户]
-, -l, --login 登录并改变到所切换的用户环境;
-c, --commmand=COMMAND 执行一个命令,然后退出所切换到的用户环境;
用su命令切换用户后,可以用 exit 命令或快捷键[Ctrl+D]可返回原登录用户。
例子:
su 在不加任何参数,默认为切换到root用户,但没有转到root用户家目录下,也就是说这时虽然是切换为root用户了,但并没有改变root登录环境;用户默认的登录环境,可以在/etc/passwd 中查得到,包括家目录,SHELL定义等;
su 加参数 - ,表示默认切换到root用户,并且改变到root用户的环境;
用su是可以切换用户身份,如果每个普通用户都能切换到root身份,如果某个用户不小心泄漏了root的密码,那岂不是系统非常的不安全?没有错,为了改进这个问题,产生了sudo这个命令。使用sudo执行一个root才能执行的命令是可以办到的,但是需要输入密码,这个密码并不是root的密码而是用户自己的密码。默认只有root用户能使用sudo命令,普通用户想要使用sudo,是需要root预先设定的,即,使用visudo命令去编辑相关的配置文件/etc/sudoers。如果没有visudo这个命令,请使用 "yum install -y sudo" 安装。
默认root能够sudo是因为这个文件中有一行” root ALL=(ALL) ALL”
sudo 的适用条件:
由于su对切换到超级权限用户root后,权限的无限制性,所以su并不能担任多个管理员所管理的系统。如果用su来切换到超级用户来管理系统,也不能明 确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限, 并且约定其使用哪些工具来完成与其相关的工作,这时我们就有必要用到 sudo。
通过sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的su来说,还是比较安全的,所以sudo 也能被称为受限制的su ;另外sudo 是需要授权许可的,所以也被称为授权许可的su;
sudo 执行命令的流程:是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权;
从编写 sudo 配置文件/etc/sudoers开始
sudo的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具visodu ,此工具的好处是在添加规则不太准确时,保存退出时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的;
/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以用\号来续行,这样看来一个规则也可以拥有多个行;
/etc/sudoers 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的;
sudo授权规则(sudoers配置):
授权用户 主机=命令动作
这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,如果不需要密码直接运行命令的,应该加NOPASSWD:参数,但这些可以省略;举例说明;
sudoers的缺省配置:
- #############################################################
- # sudoers file.
- #
- # 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
- # 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
- ##################################################################
1. 最简单的配置,让普通用户support具有root的所有权限
执行visudo之后,可以看见缺省只有一条配置:
root ALL=(ALL) ALL
那么你就在下边再加一条配置:
support ALL=(ALL) ALL
这样,普通用户support就能够执行root权限的所有命令
以support用户登录之后,执行:
sudo su -
然后输入support用户自己的密码,就可以切换成root用户了
2. 让普通用户support只能在某几台服务器上,执行root能执行的某些命令
首先需要配置一些Alias,这样在下面配置权限时,会方便一些,不用写大段大段的配置。Alias主要分成4种
Host_Alias
Cmnd_Alias
User_Alias
Runas_Alias
1) 配置Host_Alias:就是主机的列表
Host_Alias HOST_FLAG = hostname1, hostname2, hostname3
2) 配置Cmnd_Alias:就是允许执行的命令的列表,命令前加上!表示不能执行此命令.
命令一定要使用绝对路径,避免其他目录的同名命令被执行,造成安全隐患 ,因此使用的时候也是使用绝对路径!
Cmnd_Alias COMMAND_FLAG = command1, command2, command3 ,!command4
3) 配置User_Alias:就是具有sudo权限的用户的列表
User_Alias USER_FLAG = user1, user2, user3
4) 配置Runas_Alias:就是用户以什么身份执行(例如root,或者oracle)的列表
Runas_Alias RUNAS_FLAG = operator1, operator2, operator3
5) 配置权限
配置权限的格式如下:
USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG
如果不需要密码验证的话,则按照这样的格式来配置
USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG
配置示例:
- ############################################################################
- # sudoers file.
- #
- # 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
- Host_Alias EPG = 192.168.1.1, 192.168.1.2
- # User alias specification
- # Cmnd alias specification
- Cmnd_Alias SQUID = /opt/vtbin/squid_refresh, !/sbin/service, /bin/rm
- Cmnd_Alias ADMPW = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd, !/usr/bin/passwd root
- # Defaults specification
- # User privilege specification
- root ALL=(ALL) ALL
- support EPG=(ALL) NOPASSWD: SQUID
- support EPG=(ALL) NOPASSWD: ADMPW
- # 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
- ###############################################################