/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中文维基,Sudohttps://wiki.archlinuxcn.org/wiki/Sudo
- 接下来就是解决sudo -i和sudo -s的问题
在我的使用过程中,发现
执行sudo -i,时会使用/usr/bin/bash🤔
然后我就在第四ALL的后面加上了
!/*/bash,使用","与ALL隔开,
添加完之后长这样
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用户被解锁)`
`(注意:"/*/*"是刻意为之,因为"/*"不起效果,至少得是"/*/*",可以更长)`
能帮我指出漏洞就好了🤗
我会尽力寻找完美的办法的。😋
图片来源: