一篇搞懂Linux中su与sudo-建议收藏

admin 2024年7月31日14:00:02评论14 views字数 11439阅读38分7秒阅读模式

海内存知己,天涯若比邻。王勃

一篇搞懂Linux中su与sudo-建议收藏

图片来源:甘肃省·甘谷县·礼辛乡

    普通用户转换成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 ~]$ iduid=1002(dufu) gid=1002(dufu) groups=1002(dufu) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023[dufu@achao ~]$ suPassword: #输入root密码[root@achao dufu]# iduid=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/binMAIL=/var/spool/mail/dufuPWD=/home/dufuLOGNAME=dufuXDG_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 rootPassword: #输入root账号密码[root@achao dufu]# env | grep "dufu"USER=dufuPATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dufu/.local/bin:/home/dufu/binMAIL=/var/spool/mail/dufuPWD=/home/dufuLOGNAME=dufuXDG_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 ~]$ iduid=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 ~]# iduid=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=rootMAIL=/var/spool/mail/rootPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/binPWD=/rootHOME=/rootLOGNAME=rootXDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/

    此时,全部正确了,还可以采用下边的方式

[dufu@achao ~]$ iduid=1002(dufu) gid=1002(dufu) groups=1002(dufu) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023[dufu@achao ~]$ su - rootPassword: #输入root用户密码Last login: Sat Jun 15 21:10:06 CST 2024 on pts/1[root@achao ~]# iduid=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=rootMAIL=/var/spool/mail/rootPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/binPWD=/rootHOME=/rootLOGNAME=rootXDG_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 ~]# exitlogout

   注意:[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 - libaiPassword: #输入libai账号密码Last login: Sat Jun 15 13:33:07 CST 2024 on pts/1[libai@achao ~]$ iduid=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=libaiMAIL=/var/spool/mail/libaiPATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/libai/.local/bin:/home/libai/binPWD=/home/libaiHOME=/home/libaiLOGNAME=libaiXDG_DATA_DIRS=/home/libai/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/

     1.5 使用su从root用户切换成普通用户

[root@achao ~]# iduid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023[root@achao ~]# su - libaiLast login: Sat Jun 15 21:31:54 CST 2024 on pts/1[libai@achao ~]$ iduid=1001(libai) gid=1001(libai) groups=1001(libai) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

    注意:root用户切换成普通用户是不需要任何密码的。

使用su的总结:

  1. 普通用户正确切换root用户的姿势是【su - username】或【su -】或者【su -l username】。

  2. 普通用户想越权执行一次命令,使用【su - -c "命令串"】来处理。

  3. 使用root切换成任何普通用户无需密码。

    思考:使用su,普通用户切换root用户就默认知道了root用户的密码,而Linux主机是多人使用,这不就是很多人都知道root密码,安全就得不到保障,怎么办?

    看一张美美的图片,放松一下,紧接着,下边的内容更加重要

一篇搞懂Linux中su与sudo-建议收藏

   图片来源:甘肃省·甘谷县·礼辛乡

二 sudo

    使用sudo只需要自己账号的密码即可,甚至不需要密码即可执行sudo,也就是说普通用户代替root用户执行命令,但是需要在文件/etc/sudoers文件中进行设置。

     2.1 单一普通用户使用root所有命令的设置方式(sudoers)

[root@achao ~]# visudo #直接回车就打开/etc/sudoers文件#此处省略很多## Allow root to run any commands anywhereroot    ALL=(ALL)       ALLlibai   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 ~]$ iduid=1001(libai) gid=1001(libai) groups=1001(libai) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023[libai@achao ~]$ head -5 /etc/shadowhead: cannot open ‘/etc/shadow’ for reading: Permission denied[libai@achao ~]$ sudo head -5 /etc/shadowWe trust you have received the usual lecture from the local SystemAdministrator. 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 - dufuLast login: Sat Jun 15 12:21:48 CST 2024 on pts/1[dufu@achao ~]$ iduid=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 SystemAdministrator. 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,执行上边的命令

[root@achao ~]# su - sushiLast failed login: Sat Jun 15 23:29:36 CST 2024 on pts/1There were 2 failed login attempts since the last successful login.[sushi@achao ~]$ sudo ls /home/libai/We trust you have received the usual lecture from the local SystemAdministrator. 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 sushi: #输入sushi账号密码sushi is not in the sudoers file.  This incident will be reported.

    发现查看失败,此时,同学们应该就可以更好的理解wheel的作用了吧!

[sushi@achao ~]$ iduid=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 ~]$ iduid=1004(wangwei) gid=1005(wangwei) groups=1005(wangwei),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

 验证成功,不需要输入wangwei账号密码。

 如果有认真的同学已看到这里,很不容易的,先让大脑休息片刻,阿超带来一张美丽的照片放松一下。

一篇搞懂Linux中su与sudo-建议收藏

图片来源:甘肃省·甘谷县·礼辛乡

    好了,我们继续。

    问题来了,既然给普通用户那么大的权限,这样总不太好,比如悄悄修改root密码,那么真的root来了使用密码登陆会不成功的,还有就是不安全,这个时候怎么办呢?

     2.3 普通用户有限制的命令操作

[root@achao ~]# visudo #回车就打开/etc/sudoers文件#此处省略很多libai   ALL=(ALL)       /bin/passwd #此处为修改后的内容#此处省略很多#:wq!

    此处/bin/passwd必须是绝对路径,否则会出现错误,查找passwd的路径使用which命令。

[root@achao ~]# which passwd/bin/passwd

    接下来切换到libai用户进行操作实验

[root@achao ~]# su - libai Last login: Sat Jun 15 23:08:13 CST 2024 on pts/1[libai@achao ~]$ sudo head /etc/shadow[sudo] password for libai: Sorry, user libai is not allowed to execute '/bin/head /etc/shadow' as root on achao.

    发现,以前head命令使用好好的,现在就不能使用了,因为这里仅让libai用户使用passwd命令修改其它用户的密码。

[libai@achao ~]$ sudo passwd dufu[sudo] password for libai: #输入旧密码Changing password for user dufu.New password: #输入新密码Retype new password: #再次输入新密码进行确认passwd: all authentication tokens updated successfully.

    修改成功。

[libai@achao ~]$ sudo passwdChanging password for user root.New password: Retype new password: passwd: all authentication tokens updated successfully.

    好家伙,这个也太强了,竟然直接修改了root的密码,修改密码的权限是不是太大了,因此需要做限制的,不然还了得。

[root@achao ~]# visudo #回车就打开/etc/sudoers文件#此处省略很多libai   ALL=(ALL)       !/bin/passwd,/bin/passwd [A-Za-z]*,!/bin/passwd root,#此处为修改后的内容#此处省略很多#:wq!

    !/bin/passwd,/bin/passwd [A-Za-z]*,!/bin/passwd root,就是不能执行passwd和passwd root这两个命令,其余是可以的。

[libai@achao ~]$ sudo passwd rootSorry, 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 wangweiChanging 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 - rootLast login: Sun Jun 16 00:40:12 CST 2024 on pts/0[root@achao ~]# exitlogout[dufu@achao ~]$ sudo su - wangweiLast login: Sat Jun 15 23:47:46 CST 2024 on pts/1[wangwei@achao ~]$ exitlogout[dufu@achao ~]$ sudo head -2 /etc/shadowroot:$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.txthello 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破解root密码---精读篇(值的收藏)

Linux启动失败进入grub界面解决方式

VMware上创建虚拟机

原文始发于微信公众号(网络安全与取证研究):一篇搞懂Linux中su与sudo---建议收藏

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月31日14:00:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   一篇搞懂Linux中su与sudo-建议收藏https://cn-sec.com/archives/3017651.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息