海内存知己,天涯若比邻。王勃
图片来源:甘肃省·甘谷县·礼辛乡
普通用户转换成root用户,主要有两种方式
-
【su -】直接将变成root用户,但是需要root密码,也就是说,通过su切换成root用户,普通用户必须知道root的密码才行。
-
【sudo命令】执行root的命令串,事先需要设置妥当,且需要输入用户自己的密码,因此,多人共管同一台主机,sudo要比su来的好,至少root密码不会泄露出去。
【目录】
一 su
1.1 使用su直接切换root用户
1.2 使用su -切换root用户
1.3 使用su越权执行一次命令
1.4 使用su从普通用户切换到普通用户
1.5 使用su从root用户切换成普通用户
二 sudo
2.1 单一普通用户使用root所有命令的设置方式(sudoers)
2.2wheel用户组以及免密功能处理多用户使用root所有命令(visudo)
2.3 普通用户有限制的命令操作
2.4 sudo与su搭配则无需输入密码切换账户
三 sudo执行流程解释
四 为什么要使用visudo
一 su
1.1 使用su直接切换root用户
[dufu@achao ~]$ id
uid=1002(dufu) gid=1002(dufu) groups=1002(dufu) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[dufu@achao ~]$ su
Password: #输入root密码
[root@achao dufu]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@achao dufu]# env | grep "dufu"
USER=dufu #此处切换失败,应该是root才是正确的
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dufu/.local/bin:/home/dufu/bin
MAIL=/var/spool/mail/dufu
PWD=/home/dufu
LOGNAME=dufu
XDG_DATA_DIRS=/home/dufu/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dufu/.local/bin:/home/dufu/bin
PATH影响就是最大的,意味着看起来表面是切换成功的,uid=0,但是当你真实的运行某个服务时候,而这个服务恰好设置了系统变量,运行就会失败,这个时候就需要花费时间排查,才发现自己在切换用户的时候没有切换正确所导致的,很恼火。
还有同学们使用下列方式切换用户,效果也是一样的。
[dufu@achao ~]$ su root
Password: #输入root账号密码
[root@achao dufu]# env | grep "dufu"
USER=dufu
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dufu/.local/bin:/home/dufu/bin
MAIL=/var/spool/mail/dufu
PWD=/home/dufu
LOGNAME=dufu
XDG_DATA_DIRS=/home/dufu/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
1.2 使用su -切换root用户
[dufu@achao ~]$ id
uid=1002(dufu) gid=1002(dufu) groups=1002(dufu) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[dufu@achao ~]$ su -
Password: #输入root用户密码
Last login: Sat Jun 15 21:04:06 CST 2024 on pts/1
[root@achao ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@achao ~]# env | grep "dufu"
[root@achao ~]# env | grep "root"
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
此时,全部正确了,还可以采用下边的方式
[dufu@achao ~]$ id
uid=1002(dufu) gid=1002(dufu) groups=1002(dufu) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[dufu@achao ~]$ su - root
Password: #输入root用户密码
Last login: Sat Jun 15 21:10:06 CST 2024 on pts/1
[root@achao ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@achao ~]# env | grep "root"
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
[root@achao ~]# env | grep "dufu"
[root@achao ~]# exit
logout
注意:[dufu@achao ~]$ su - root命令-和root之间一定要有一个空格,否则就会出错。
1.3 使用su越权执行一次命令
[dufu@achao ~]$ ls /home/libai/
ls: cannot open directory /home/libai/: Permission denied
[dufu@achao ~]$ su - -c "ls /home/libai/"
Password: #输入root账号密码
test.txt
[dufu@achao ~]$
前提是需要知道root密码,发现用户还是dufu,并没有发生改变。
1.4 使用su从普通用户切换到普通用户
[dufu@achao ~]$ su - libai
Password: #输入libai账号密码
Last login: Sat Jun 15 13:33:07 CST 2024 on pts/1
[libai@achao ~]$ id
uid=1001(libai) gid=1001(libai) groups=1001(libai) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[libai@achao ~]$ env | grep "libai"
USER=libai
MAIL=/var/spool/mail/libai
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/libai/.local/bin:/home/libai/bin
PWD=/home/libai
HOME=/home/libai
LOGNAME=libai
XDG_DATA_DIRS=/home/libai/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
1.5 使用su从root用户切换成普通用户
[ ]
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[ ]
Last login: Sat Jun 15 21:31:54 CST 2024 on pts/1
[ ]$ id
uid=1001(libai) gid=1001(libai) groups=1001(libai) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
注意:root用户切换成普通用户是不需要任何密码的。
使用su的总结:
-
普通用户正确切换root用户的姿势是【su - username】或【su -】或者【su -l username】。
-
普通用户想越权执行一次命令,使用【su - -c "命令串"】来处理。
-
使用root切换成任何普通用户无需密码。
思考:使用su,普通用户切换root用户就默认知道了root用户的密码,而Linux主机是多人使用,这不就是很多人都知道root密码,安全就得不到保障,怎么办?
看一张美美的图片,放松一下,紧接着,下边的内容更加重要。
图片来源:甘肃省·甘谷县·礼辛乡
二 sudo
使用sudo只需要自己账号的密码即可,甚至不需要密码即可执行sudo,也就是说普通用户代替root用户执行命令,但是需要在文件/etc/sudoers文件中进行设置。
2.1 单一普通用户使用root所有命令的设置方式(sudoers)
[root@achao ~]# visudo #直接回车就打开/etc/sudoers文件
#此处省略很多
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
libai ALL=(ALL) ALL #此处为添加内容
## Allows members of the 'sys' group to run networking, software,
#此处省略很多
#:wq!
添加内容解释如下:
-
libai是用户账号,也就是操作系统的那个账号可以使用sudo命令。
-
ALL=(ALL)是登陆者的来源主机名=(可切换的身份);登陆者的来源主机名,也就是说这个值是可以指定为客户端计算机(信任的来源主机),默认值root可以来自任何一台主机。(可切换的身份)意思是这个账号可以切换成什么身份来执行后续的命令,默认root可以切换任何身份。
-
ALL是指可执行的命令,可用设置的身份执行什么命令,这个命令务必使用绝对路径,默认root可以切换任何身份执行任何命令。
-
ALL是关键词,意思是代表任何身份、主机或命令。
下边我们具体实践操作,看能否生效
[libai@achao ~]$ id
uid=1001(libai) gid=1001(libai) groups=1001(libai) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[libai@achao ~]$ head -5 /etc/shadow
head: cannot open ‘/etc/shadow’ for reading: Permission denied
[libai@achao ~]$ sudo head -5 /etc/shadow
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 libai: #输入自己账号的密码
root:$6$cvyv26HX$vu7GVMYa8tyi9xUpzM6/X.KAtWX1zMw.q5u7tn8ykyveISuA9tsnDEl5jDvOG5lzPguBaRSUvHd3NCsib7/YP0:19887:0:99999:7:::
bin:*:17632:0:99999:7:::
daemon:*:17632:0:99999:7:::
adm:*:17632:0:99999:7:::
lp:*:17632:0:99999:7:::
2.2 wheel用户组以及免密功能处理多用户使用root所有命令(visudo)
为什么要这样子设置,还不是因为Linux是多人共同管理一台主机,维护的同学一定是知道的,几乎生产环境中不可能发生单一用户和root管理一台主机的,这样任务就很重啦,忙不过来的。
[root@achao ~]# visudo #回车就打开/etc/sudoers文件
此处省略很多
#此处为修改后的内容 wheel ALL=(ALL) ALL
此处省略很多
:wq!
接下来只需将用户加入wheel用户组即可
[root@achao ~]# usermod -a -G wheel dufu
这条命令意味着任何加入wheel这个用户组的用户,就能够使用sudo切换任何身份来操作任何命令,这里当然可以将wheel设置成自己想要的用户组名,接下来切换成dufu用户来执行操作。
[root@achao ~]# su - dufu
Last login: Sat Jun 15 12:21:48 CST 2024 on pts/1
[dufu@achao ~]$ id
uid=1002(dufu) gid=1002(dufu) groups=1002(dufu),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[dufu@achao ~]$ ls /home/libai/
ls: cannot open directory /home/libai/: Permission denied
[dufu@achao ~]$ sudo ls /home/libai/
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 dufu: #输入dufu账号的密码
test.txt
[dufu@achao ~]$
我们将用户切换为sushi,执行上边的命令
[ ]
Last failed login: Sat Jun 15 23:29:36 CST 2024 on pts/1
There were 2 failed login attempts since the last successful login.
[ ]$ sudo ls /home/libai/
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
[for sushi: ] password
sushi is not in the sudoers file. This incident will be reported.
发现查看失败,此时,同学们应该就可以更好的理解wheel的作用了吧!
[sushi@achao ~]$ id
uid=1003(sushi) gid=1004(sushi) groups=1004(sushi) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
使用id命令查看sushi并没有加入wheel用户组中。
两次执行sudo的时间间隔在5分钟之内,则不需要输入用户密码,如果两次执行sudo命令的时间间隔超出5分钟,再次执行sudo命令则需要输入密码,系统默认相信5分钟之内你是没有离开系统的,执行sudo的就是同一个人,如果超过5分钟,就说明有别的同学跑过来替你执行命令,那么就需要再次进行确认操作,这个设计还是很不错的。
我们思考,既然我都信任其它用户可以代替root用户执行所有的命令了,输入密码就会显得是多余的,那我们就直接免掉这个环节。
[root@achao ~]# visudo #回车就打开/etc/sudoers文件
此处省略很多
#此处为修改后的内容 wheel ALL=(ALL) NOPASSWD: ALL
此处省略很多
:wq!
验证是否需要输入wangwei的账号密码。
[root@achao ~]# useradd wangwei
[root@achao ~]# passwd wangwei
Changing password for user wangwei.
New password: #第一次输入wangwei密码
Retype new password: #第二次输入wangwei密码进行确认
passwd: all authentication tokens updated successfully.
[root@achao ~]# usermod -a -G wheel wangwei
[root@achao ~]# su - wangwei
[wangwei@achao ~]$ sudo ls /home/libai/
test.txt
[wangwei@achao ~]$ id
uid=1004(wangwei) gid=1005(wangwei) groups=1005(wangwei),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
验证成功,不需要输入wangwei账号密码。
如果有认真的同学已看到这里,很不容易的,先让大脑休息片刻,阿超带来一张美丽的照片放松一下。
图片来源:甘肃省·甘谷县·礼辛乡
好了,我们继续。
问题来了,既然给普通用户那么大的权限,这样总不太好,比如悄悄修改root密码,那么真的root来了使用密码登陆会不成功的,还有就是不安全,这个时候怎么办呢?
2.3 普通用户有限制的命令操作
[root@achao ~]# visudo #回车就打开/etc/sudoers文件
#此处省略很多
libai ALL=(ALL) /bin/passwd #此处为修改后的内容
#此处省略很多
#:wq!
此处/bin/passwd必须是绝对路径,否则会出现错误,查找passwd的路径使用which命令。
[ ]
/bin/passwd
接下来切换到libai用户进行操作实验
[ ]
Last login: Sat Jun 15 23:08:13 CST 2024 on pts/1
[ ]$ sudo head /etc/shadow
[for libai: ] password
Sorry, user libai is not allowed to execute '/bin/head /etc/shadow' as root on achao.
发现,以前head命令使用好好的,现在就不能使用了,因为这里仅让libai用户使用passwd命令修改其它用户的密码。
[ ]$ sudo passwd dufu
[for libai: ] password
Changing password for user dufu.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
修改成功。
~]$ sudo passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
好家伙,这个也太强了,竟然直接修改了root的密码,修改密码的权限是不是太大了,因此需要做限制的,不然还了得。
[ ]
libai ALL=(ALL) !/bin/passwd,/bin/passwd [A-Za-z]*,!/bin/passwd root,
!/bin/passwd,/bin/passwd [A-Za-z]*,!/bin/passwd root,就是不能执行passwd和passwd root这两个命令,其余是可以的。
[libai@achao ~]$ sudo passwd root
Sorry, user libai is not allowed to execute '/bin/passwd root' as root on achao.
[libai@achao ~]$ sudo passwd
Sorry, user libai is not allowed to execute '/bin/passwd' as root on achao.
[libai@achao ~]$ sudo passwd wangwei
Changing password for user wangwei.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
验证成功,此时libai账号就专门用来修改非root账户的密码。再也不用担心root密码被修改。注意绝对路径的书写顺序。
2.4 sudo与su搭配使用,无需输入密码切换账户
[root@achao ~]# visudo #回车就打开/etc/sudoers文件
#此处省略很多
dufu ALL=(ALL) NOPASSWD: ALL #此处为修改后的内容
#此处省略很多
#:wq!
验证如下
[dufu@achao ~]$ sudo su - root
Last login: Sun Jun 16 00:40:12 CST 2024 on pts/0
[root@achao ~]# exit
logout
[dufu@achao ~]$ sudo su - wangwei
Last login: Sat Jun 15 23:47:46 CST 2024 on pts/1
[wangwei@achao ~]$ exit
logout
[dufu@achao ~]$ sudo head -2 /etc/shadow
root:$6$XL8nChZ0$7Pe6XTqRXVcJ8Rx99/ItXViDvI/oGZH4Kw6225qd9tHlNXdkXGKjpp0V3icjEtiXC.fVLVE3Yi.qQywFlJho9.:19889:0:99999:7:::
bin:*:17632:0:99999:7:::
验证成功。
三 sudo执行流程解释
[libai@achao ~]$ sudo -u wangwei touch /tmp/test.txt
[libai@achao ~]$ ll /tmp/test.txt
-rw-r--r--. 1 wangwei wangwei 0 Jun 16 01:15 /tmp/test.txt
[libai@achao ~]$ sudo -u dufu sh -c "mkdir /tmp/liqingzhao;cd /tmp/liqingzhao;echo 'hello world' > demo.txt"
[libai@achao ~]$ cat /tmp/liqingzhao/demo.txt
hello world
[libai@achao ~]$ ll /tmp/liqingzhao/demo.txt
-rw-r--r--. 1 dufu dufu 12 Jun 16 01:20 /tmp/liqingzhao/demo.txt
参数-u为制定用户来执行后边的内容。
-
当用户执行sudo时,系统于/etc/sudoers文件中查找该用户是否有执行sudo的权限。
-
若有执行sudo的权限,变让用户输入自己的密码进行确认,也可以设置为不需要输入密码的形式。
-
若密码输入成功,变开始进行sudo后续接的命令,root执行sudo不需要输入密码。
-
若切换的账户与执行者身份相同的时候,也是不需要输入密码的。
四 为什么要使用visudo
因为/etc/sudoers是有语法设置的,如果设置错误就无法使用sudo,因此使用visudo去修改,并且在保存退出修改界面时,操作系统会去检验/etc/sudoers的语法是否正确,因此,强烈建议使用visudo而不是vi或vim命令来打开/etc/sudoers文件进行修改。
篇幅较长,建议收藏,反复浏览,并上机实验,这样才能融会贯通,成为自己的知识,以后遇见su和sudo便可以轻松拿捏。再也不会因为su和sudo的问题困扰你。
---结束
点赞关注分享宝子们如果觉得还OK,可以动动可爱的小手分享给身边的好朋友!我们一起进步,每一个点赞关注分享都是小编前进的动力!
【往期回顾】
原文始发于微信公众号(网络安全与取证研究):一篇搞懂Linux中su与sudo---建议收藏
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论