Linux课程笔记 用户身份切换命令
超级用户root具有超级管理权限,由于权限太大,如果管理不好,就会对系统安全带来安全隐患。在工作场景中,一般临时性处理工作,都是以普通用户的身份完成,只在必要时才使用超级用户root。
1 su命令
1.1 su介绍
通过su命令可以在用户之间切换,超级用户root向普通用户或虚拟用户切换不需要密码(这就是超极权限所在)。其他普通用户之间或者普通用户切换到root,都需要切换用户的秘密验证。
su参数选项 |
注释说明 |
-,-l,--login |
使一个shell成为登陆的shell,如执行su - oldboy,表示该用户改变身份为oldboy,并且使用oldboy用户的环境变量配置。 |
-c,--command=COMMAND |
切换到一个shell下,执行一个命令,然后退出所切换的用户环境 |
-m,--presserve-environment |
切换用户时,不重置用户环境变量,-p的功能同-m,这个参数为su的默认值,较少使用 |
-s,--shell=SHELL |
如果/ec/shell允许,则运行指定的shell |
su实例:
[qinbf@qinbf ~]$ whoami qinbf [qinbf@qinbf ~]$ su - #输入的是root的密码 口令: [root@qinbf ~]# whoami root [root@qinbf ~]# env HOSTNAME=qinbf SHELL=/bin/bash TERM=linux HISTSIZE=1000 USER=root …… PWD=/root LANG=zh_CN.UTF-8 SHLVL=1 HOME=/root LOGNAME=root [root@qinbf ~]# su - qinbf [qinbf@qinbf ~]$ whoami qinbf [qinbf@qinbf ~]$ env HOSTNAME=qinbf SHELL=/bin/bash TERM=linux HISTSIZE=1000 USER=qinbf ……. PWD=/home/qinbf LANG=zh_CN.UTF-8 SHLVL=1 HOME=/home/qinbf LOGNAME=qinbf [qinbf@qinbf ~]$ exit # exit退出当前用户,这个命令可以用ctrl+d替换 logout
[root@qinbf ~]# |
总结:su切换到其他用户不加“-”,环境变量是不会改变的,可能会导致异常,比较规范的写法是“su - 用户”
如何让系统在每一次开机时自动普通用户启动指定的服务脚本?
把要执行的脚本放入开机自启动配置文件/etc/rc.local su - tddoc -c ‘/bin/sh /home/tddoc/bin/deploy.sh’ |
su命令优缺点
su命令为我们管理linux带来方便,但是也带来了很大的安全管理问题,切换到root身份,可以改掉root的密码,让其他用户无法再切换到root。使用su命令切换身份在多个系统管理员共同管理的场合,并不是最好的选择。建议使用sudo代替su。
su致命的缺点:
1) 普通用户必须知道root密码才可以切换到root,这样root密码就泄露开了。
2) 使用su命令切换身份,无法对切换后的身份做精细的控制,可以为所欲为,甚至改掉root密码。
2 sudo命令
通过sudo命令,我们可以把某些超级用户权限分类有针对性(精细)授权给指定的普通用户,并且普通用户不需要知道root密码就可以使用得到的授权。
2.1 sudo执行的流程
1) 当用户执行sudo时,系统会首先查找/var/run/sudo/%HOME(如果是新用户会先生成此目录)目录中是否有用户时间戳文件,如果时间戳文件过期,则提示用户是否输入自身的密码(不是root或者要切换的用户密码)
2) 当密码验证成功后,系统会查找/etc/sudoers配置文件,判断用户是否有执行相应sudo命令权限
3) 如果具备执行相应sudo权限,就会自动由当前用户切换到root,然后以root身份执行该命令
4) 执行完成后,又会自动直接退回到当前用户shell下。
2.2 sudo语法
sudo [参数选项] 命令
sudo参数选项 |
注释说明 |
-l |
列出用户在主机上可用的和被禁止的命令 |
-v |
验证用户的时间戳;当用户运行sudo,输入用户的密码后,在短时间内可以不用输入口令直接运行sudo,可用-v可以跟踪最新的时间戳 |
-u |
指定以某个用户身份执行特定的操作 |
-k |
同-K,删除时间戳,下一个sudo命令提供密码。前提是该用户授权中不能有NOPASSWD参数 |
sudo授权的方法
1) 执行visudo命令
2) 直接修改/etc/sudoers文件
直接修改sudoers配置文件方法有以下需要注意的几点:
- echo命令是追加>>,不是重定向>,除了echo外,可以用cat、sed等命令实现此功能;
- 修改操作完成一定要执行visudo -c进行语法检查,这弥补了直接修改的不足
- 确保/etc/sudoers权限是正确的(-r--r-----),权限不对会导致sudo功能异常
- 及时对授权的操作进行测试,验证是否正确(最好不要退出当前授权窗口)
- 确保知道正确root用户密码,以便在出现问题时可以通过普通用户等候执行su-命令切换到root进行恢复。
3) 使用用户组的方式实现sudo授权
通过授权一个用户组的方式来配置/etc/sudoers,这样以后有增加用户需要相同的授权时,直接将用户加入到sa组就可以享受sa组的sudo授权了。
%sa ALL=(All) ALL
#注意用户组授权和普通用户的区别,开头为“%”百分号。sa组同用户一样必须是已经存在的。
2.3 sudo实例:
[root@qinbf ~]# useradd sun [root@qinbf ~]# echo "qbf" |passwd --stdin sun Changing password for user sun. passwd: all authentication tokens updated successfully. [root@qinbf ~]# su - sun [sun@qinbf ~]$ touch /root/sun.txt touch: 无法触碰 “/root/sun.txt”: 权限不够 [sun@qinbf ~]$ sudo /root/sun.txt
We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:
#1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility.
[sudo] password for sun: Sorry, try again. [sudo] password for sun: sun is not in the sudoers file. This incident will be reported.
方法一: [root@qinbf ~]# visudo 81 ## Allow root to run any commands anywhere 82 83 root ALL=(ALL) ALL 84 qinbf ALL=(ALL) ALL 85 sun ALL=(ALL) ALL #允许sun用户在任何主机、对任何用户、执行任何操作
方法二: [root@qinbf ~]# echo "sun ALL=(ALL) ALL">>/etc/sudoers [root@qinbf ~]# visudo -c #检查/etc/sudoers文件的语法 /etc/sudoers: parsed OK [root@qinbf ~]# ll /etc/sudoers #检查/etc/sudoers文件的权限 -r--r----- 1 root root 3438 06-05 15:05 /etc/sudoers
方法三: [root@qinbf ~]# grep sa /etc/group sa:x:801:oldboy6 [root@qinbf ~]# echo "%sa ALL=(ALL) ALL">>/etc/sudoers [root@qinbf ~]# usermod -G sa sun
验证: [sun@qinbf ~]$ sudo touch /root/sun.doc [sun@qinbf ~]$ sudo ls -l /root/sun.doc -rw-r--r-- 1 root root 0 06-05 15:10 /root/sun.doc |
3 /etc/sudoers配置文件
3.1 /etc/sudoers的规则大致可分为两类:一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的。
1) Host_Alias定义主机别名
# Host_Alias FILESERVERS = fs1, fs2 # Host_Alias MAILSERVERS = smtp, smtp2 |
2) User_Alias定义用户别名
User_Alias ADMINS = jsmith, mikem |
3) Runas_Alias定义runas别名
这个别名指定的是“用户身份”,即sudo允许切换至的用户
Runas_Alias SUPER = root |
4) Cmnd_Alias定义命令别名
## Services #Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
## Updating the locate database #Cmnd_Alias LOCATE = /usr/bin/updatedb |
3.2 别名实例
实例1:定义用户别名
User_Alias ADMINS = oldboy, ett, %oldboy #-->定义用户别名ADMINS,包含oldboy,ett及oldboy组的成员 |
实例2:定义命令别名
Cmnd_Alias NETWORK = /sbin/ifconfig, /etc/init.d/network # 1) 所有的命令别名下的成员必须是文件或目录的绝对路径 2) 命令别名超过一行时,可以通过“\”号换行 3) 在定义时,可以使用正则表达式,如/usr/bin/passwd [A-Za-z]*。 |
实例3:定义Runas别名
Runas_Alias OP = root, oldboy 特别说明:runas别名的定义也不多见 |
3.3 /etc/sudoers配置文件中的授权规则
oldboy ALL=(ALL) ALL #-->授权中的所有ALL字符串必须大写。其中,第一、二个ALL字符串不大写的话,visudo语法检查可以过,但是授权实际配置达不到配置需求,最后一个ALL必须大写,否则visudo语法检查通不过。
这一行代表的意思是: 授权用户 主机=(指定的可切换的用户) 可以执行的命令动作 因此,上面一行授权内容的实际意思就是,oldboy用户可以在所有的主机上,切换到所有用户,执行所有的命令。
如果忽略上面括号的内容,如写成: oldboy ALL= ALL 那么只能切换到root执行所有命令。
如果希望在执行命令时不提示密码,就用这个NOPASSWD:ALL语法来授权 如果不希望执行某个命令,那么就在这个命令前面加上“!” |
3.4 /etc/sudoers配置文件授权规则实例
在/etc/sudoers文件的末尾添加以下两行: Cmnd_Alias USER_ADMIN = /usr/sbin/useradd, /usr/sbin/userdel, !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
test ALL=(ALL) USER_ADMIN "/etc/sudoers" 109L, 3595C 已写入 [root@test2 ~]# visudo -c /etc/sudoers: parsed OK [root@test2 ~]# ll /etc/sudoers -r--r----- 1 root root 3595 06-08 10:07 /etc/sudoers
[test@test2 ~]$ vi .bash_profile #修改test用户的环境变量,添加以下黄色部分的变量 PATH=$PATH:$HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[test@test2 ~]$ source .bash_profile [test@test2 ~]$ sudo useradd bifeng [sudo] password for test: [test@test2 ~]$ sudo passwd bifeng Changing password for user bifeng. New UNIX password: Retype new UNIX password: Sorry, passwords do not match. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.
[test@test2 ~]$ sudo passwd root [sudo] password for test: Sorry, user test is not allowed to execute '/usr/bin/passwd root' as root on test2.localdomain. [test@test2 ~]$ sudo passwd [sudo] password for test: Sorry, user test is not allowed to execute '/usr/bin/passwd' as root on test2.localdomain.
再添加一行: Cmnd_Alias USER_CHANGE = /bin/chown 修改test的权限: test ALL=(ALL) USER_ADMIN, NOPASSWD: USER_CHANGE
[test@test2 ~]$ sudo /bin/chown sun.sun /root/sun.txt [test@test2 ~]$ #-----à不再需要密码提示 |
3.5 sudo配置文件/etc/sudoers授权规则注意事项总结:
1) 授权规则中的所有ALL字符串必须为大写字母
2) Cmnd_Alias USERCMD = /usr/sbin/useradd, /usr/sbin/userdel, !/usr/bin/passwd、/usr/bin/passwd[A-Za-z]*, /bin/chown, !/usr/bin/passwd root
允许执行的命令是有顺序的,从老师的测试结果来看,命令的顺序是从后面向前,即把允许执行的命令放在禁止命令的后面
3) 一行内容超长可以用“\”斜线换行
4) “!”叹号表示非,就是命令取反的意思,即禁止执行的命令。
5) 测试之前要记得修改普通用户的环境变量.bash_profile文件,把root的环境变量加入到普通用户的后面。
3.6 远程执行sudo命令
在默认情况下,我们是无法通过ssh远程执行sudo命令的
在/etc/sudoers有这样的配置:
53 # Disable "ssh hostname sudo <cmd>", because it will show the password in clear. 54 # You have to run "ssh -t hostname sudo <cmd>". 55 # 56 Defaults requiretty |
根据注释我们可以知道,这个“Default requiretty”就是禁止我们通过ssh远程执行sudo命令的明确配置,但是禁止执行的远程ssh sudo 命令格式为“ssh hostname sudo <cmd>”,禁止的原因是因为会明文显示密码,但是我们可以通过“ssh -t hostname sudo <cmd>”的方式
4 配置sudo命令审计
4.1 日志文件配置
1)安装sudo,syslog命令服务
yum install sudo syslog
[root@test2 ~]# yum install sudo syslog |
2)配置系统日志/etc/syslog.conf
echo “local2.debug /var/log/sudo.log” >>/etc/syslog.conf
31news.=crit /var/log/news/news.crit 32news.=err /var/log/news/news.err 33news.notice /var/log/news/news.notice 34local2.debug /var/log/sudo.log |
3) 配置/etc/sudoers
增加配置“Defaults logfile=/var/log/sudo.log”>>/etc/sudoers
4) 重启syslog内核日志记录器
/etc/init.d/syslog restart
[root@test2 ~]# /etc/init.d/syslog restart 关闭内核日志记录器: [确定] 关闭系统日志记录器: [确定] 启动系统日志记录器: [确定] 启动内核日志记录器: [确定] |
5) 测试sudo日志审计配置结果
[test@test2 ~]$ sudo useradd bill [test@test2 ~]$ sudo passwd bill Changing password for user bill. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.
[test@test2 ~]$ sudo useradd lily [test@test2 ~]$ passwd lily passwd: Only root can specify a user name. [test@test2 ~]$ sudo passwd lily Changing password for user lily. New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully.
[test@test2 ~]$ sudo chown root.root /root/sun.txt
[root@test2 ~]# tail /var/log/sudo.log 6月 8 11:02:45 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/usr/sbin/useradd bill 6月 8 11:02:52 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/usr/bin/passwd bill 6月 8 11:03:32 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=list 6月 8 11:03:51 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=validate 6月 8 11:04:12 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/usr/sbin/useradd lily 6月 8 11:04:22 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/usr/bin/passwd lily 6月 8 11:07:04 : test : TTY=pts/1 ; PWD=/home/test ; USER=root ; COMMAND=/bin/chown root.root /root/sun.txt |
4.2 日志写到其他主机:
SYSLOGD_OPTIONS=”-m O -r -x” # -r是指接收远程日志的意思 重启syslog服务器 /etc/init.d/syslog restart
编辑/etc/syslog.conf 修改 local2.debug /var/log/sudo.log 修改为 local2.debug @中央服务器的IP |