linux可以让用户sudo但如何设置其不能切换到root中?

ubuntu16.0.4
  1. 让普通用户可以sudo执行命令 eg: sudo docker ps
  2. 通过sudo usermod -G sudo username 现在用户拥有了sudo
  3. 但是用户通过sudo susudo -isudo -s方式可以切换到root账号中, 这样在做用户操作日志的时候就有问题
  4. 通过vi /etc/sudoers 编辑%sudo ALL=(ALL:ALL) ALL ===> %sudo ALL=(ALL:ALL) ALL,!/bin/su

但是sudo -isudo -s还是可以切换, 如何把这两个命令禁用掉?


更新: 2019年8月28日12:52:10

其实我不是想给用户禁什么功能、只是不想用户随意切换用户、从而影响操作日志记录.

阅读 8.8k
5 个回答

我是小白,弱弱的问一句,从普通user切换到root 不是提示要输入密码么?
普通用户是不会有root的密码呀, 有的话那就不叫普通用户了

把这两个禁掉又怎样呢?总没禁编辑器吧,sudo改一下/etc/sudoers不就啥都有了吗?
而且普通用户可以写个程序类似su的程序,同样可以获取管理员权限:

//suroot.c
int main(){
    ...
    setuid(0);
    exec("/bin/bash");
    ...
}

然后把该程序的权限设置为:

chmod a+x suroot
chmod u+s suroot
sudo chown root:root suroot

普通用户就能获取管理员权限了。


所以,不要想着禁什么,应该考虑给什么。见我这篇回答:请问怎样限制被赋予sudo权限的非root用户编辑/etc/sudoers文件?

让普通用户只能通过sudo执行特定的命令,配置/etc/sudoers就好了。

username1 ALL=(username2) /path/to/cmd1, /path/to/cmd2

这样 username1 只能 sudo 到 username2 ,并且只能以 username2 的身份运行 cmd1 跟 cmd2 。

(通过 sudo -u username2 ...

man sudo
man sudoers

/etc/sudoers添加一段代码,可以使个体用户获得sudo的运行权限

USERNAME ALL=(ALL:ALL) ALL

但是为了安全,我们就会想到禁用
sudo -i,sudo -s,su等等
可以进入root权限的命令
我所使用的系统是Archlinux
与你们可能会有不同,所以我的方式
不一定适用于所有发行版。😳
首先得先知道每段命令的意义:
(ALL代表全部)
USERNAME:用户名
第一ALL:可以使用的主机/主机名
第二ALL:可以切换的用户
第三ALL:与第二ALL用:分割,代表可切换哪些组下的用户,这个可以不添加
第四ALL:代表可以执行的命令🤔

我们的目的是阻止sudo -i,sudo -s
su等切换root的指令。
su的解决办法简单😁,直接

USERNAME ALL=(ALL:ALL) ALL , !/*/su

再使用

passwd -l root

锁定root账户
解锁root账户时使用

passwd -u root

(注意:在执行之前,请确保其它账户可以使用超级管理或权限与超级管理一样高,否则,改不回去就不好了😮,虽然不是彻底没救😐。更改root密码同样会导致root账户被解锁)😥
或者
编辑/etc/shadow,将root用户的加密口令列替换为"!"

root:!:12345::::::

要再次启用sudo,重新设置其密码即可:

passwd root

参考:Archlinux中文维基,Sudo
https://wiki.archlinuxcn.org/wiki/Sudo

接下来就是解决sudo -i和sudo -s的问题
在我的使用过程中,发现
执行sudo -i,时会使用/usr/bin/bash🤔
然后我就在第四ALL的后面加上了
!/*/bash,使用","隔开,
添加完之后长这样

USERNAME ALL=(ALL:ALL) ALL , !/*/su , !/*/bash

除了su,bash,其他都可以运行
可执行特定指令是这样

USERNAME ALL= (ALL:ALL) /*/bash

除了bash,其他都不可以运行。
没错,"!"的意思在这里是否定的意思。添加了它之后可执行的命令就会不可执行。
并且,命令是执行某样程序,所以要加上绝对路径(/xxx/xxx/...)
这样,sudo -i,sudo -s就无法运行了,但是仅仅只是在这个shell无法运行,如果你更换shell,你就会发现,
sudo -i,sudo -s仍然可以运行。😨
然后,
我发现,大部分的shell名称中都包含sh
因此将!/*/bash替换为

!/*/*sh*

就可以阻止大部分shell在sudo运行了,当然可以不替换。🤣
当然,你要是想指定某一shell可以运行,
请在!/*/*sh*/后面添加/*/<指定shell>
这样也给被名字中带sh的其他程序一个公道。😋(注意:一定要在后边添加,因为后边的会覆盖前面的。)

为什么不添加?😳

!/*/sudo -i , !/*/sudo -s

因为,它们无法被阻止,不知道为什么😥,添加之后,它们仍然可以运行。
这样虽然可以解决大部分shell,
但是就怕名字中没有sh的shell。😭


知道我为什么在路径中使用"*"吗?🥴
shell引用的是/usr/bin里边的程序
但是程序可不仅仅只在/usr/bin里啊
比如/bin,/sbin,
你仍然可以在它们中见到
/usr/bin中的程序,😦
这导致你可以手动使用
绝对路径(/xxx/xxx/...)
运行它们。😅
但是在路径中加入"/*/"后面接上程序名
之后就无法通过绝对路径(/xxx/xxx/...)使用它们🤣👉🖥️

关于可以写一个程序来获取类似su的权限
或者
关于可以使用编辑器修改
/etc/sudoers,/etc/sudoers.d
又或者是直接通过
/etc/passwd/修改用户权限
passwd -u root解锁root账户,🧐
我的解决办法是🤔

USERNAME ALL=(ALL:ALL) ALL,!/*/passwd ,!/*/* /etc/passwd , !/*/* /etc/sudoers , !/*/* /etc/sudoers.d/* , !/*/chmod     #阻止passwd;阻止sudo通过任何程序修改passwd,sudoers和sudoers.d里边的文件;阻止chmod

(注意:禁用passwd -u是没用的,因为更改密码同样可以导致root用户被解锁)
(注意:"/*/*"是刻意为之,因为"/*"不起效果,至少得是"/*/*",可以更长)

能帮我指出漏洞就好了🤗
我会尽力寻找完美的办法的。😋

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题