sudo和su之间的区别
su命令是当前用户用来切换到另外一个用户的命令,参数为用户名。执行时会要求输入密码,这个密码是你要切换到的用户的密码。
sudo 表示 “superuser do”。它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而,绝大部分时候我们用它来以提升的权限来运行命令。
sudo命令工作流程
sudoers配置文件格式
USER/GROUP HOST=(USER[:GROUP]) [NOPASSWD:] COMMANDS
用户执行sudo命令(需要输入用户密码)
vi /etc/sudoers
指定执行命令
ytzmdz ALL=(ALL) /bin/less,/bin/ls
执行所有命令
ytzmdz ALL=(ALL) ALL
用户执行sudo命令(不需要输入用户密码)
ytzmdz ALL=(ALL) NOPASSWD: ALL
%wheel 组中用户执行sudo命令(需要输入密码)
%wheel ALL=(ALL) ALL
%wheel 组中用户执行sudo命令(不需要输入密码)
%wheel ALL=(ALL) NOPASSWD: ALL
查看sudo操作记录
进入visudo文件输入Defaults logfile = “/var/log/sudo”命令保存并退出
查看sudo 命令日志
将用户添加wheel组
usermod -G wheel ytzmdz
查看用户组
id ytzmdz
groups ytzmdz
撤销用户附加wheel组
方法一:gpasswd
sudo gpasswd -d ytzmdz wheel
方法二:修改/etc/group文件
[root@localhost ~]# cat /etc/group |grep wheel
wheel:x:10:ytzmdz
[root@localhost ~]# sed -i 's#wheel:x:10:ytzmdz#wheel:x:10:#g' /etc/group
[root@localhost ~]# groups ytzmdz
ytzmdz : ytzmdz
[root@localhost ~]#
sudo的原理
[root@localhost ~]# ls -l /usr/bin/sudo
---s--x--x 1 root root 178264 Apr 13 2023 /usr/bin/sudo
sudo 执行程序上启用了setuid位。当任何用户运行这个二进制文件时,它将以拥有该文件的用户(root用户)权限运行。
当使用sudo执行 id 命令时,将显示用户 ytzmdz的 id
[ytzmdz@localhost ~]$ id
uid=1001(ytzmdz) gid=1001(ytzmdz) groups=1001(ytzmdz)
使用sudo id时,将显示用户root的id
[ytzmdz@localhost ~]$ sudo id
uid=0(root) gid=0(root) groups=0(root)
不切换用户终端,sudo 指定用户执行命令
sudo -u ytzmdz whoami
su
`su` 命令用于切换用户。如果不加任何参数,它会要求输入目标用户的密码,然后提供一个该用户的登录shell(不切换环境变量)。
- 如果使用 `su -`(注意有一个短横线),它会尝试模拟一个完整的登录过程,包括加载用户的profile文件和环境变量,更像是一个完整的用户切换(切换环境变量)。
su命令使每个用户都具有反复尝试其他用户的登陆密码的能力,具有安全隐患,若是su -root用户,则风险更大。所以需要加强su命令的使用控制,可以借助PAM认证模块,仅允许特定用户可使用su命令进行切换,授权wheel组中用户使用使用su命令,修改/etc/pam.d/su认证配置以启用pam wheel 认证。
启用pam_wheel认证模块
vim /etc/pam.d/su
取消auth required pam_wheel.so use_uid注释
auth required pam_wheel.so use_uid
在/etc/ pam.d/su文件账户su控制介绍
auth sufficient pam_ rootok.so
#auth required pam_ wheel.so use__uid
以上两行是默认状态(即开启第一行,注释第二行),这种状态下是允许所有用户间使用su命令进行切换的
两行都注释也是运行所有用户都能使用su命令,但root下使用su切换到其他普通用户需要输入密码;如果第一行不注释,则root使用su切换普通用户就不需要输入密码
(pam_rootok)so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码如果开启第二行,表示只有root用户和wheel组内的用户才可以使用su命令
如果注释第一行,开启第二行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令
su命令继承用户环境变量禁止引入提权
如果通过su切换用户后系统会自动初始化环境变量PATH,则可以有效防范由于继承环境变量PATH而导致的提权问题。
检查/etc/login.defs中是否配置了自动初始化环境变量PATH,即ALWAYS_SET_PATH=yes
cat /etc/login.defs | grep ALWAYS_SET_PATH
ALWAYS_SET_PATH=yes
sudo
`sudo` 命令允许授权的用户以root用户的权限来执行命令。它会保留当前用户的环境变量和工作目录。`sudo` 默认会询问密码,密码是执行命令的用户的密码,可在sudoer 配置文件设置用户执行sudo命令免密。
sudo -i
`sudo -i` 命令会启动一个新的 shell,并且提供 root 用户登录的环境。它会将用户放置在 root 用户的 home 目录中,并加载 root 用户的 shell 配置文件。
sudo su
`sudo su` 命令实际上是先使用 `sudo` 以root用户的权限执行 `su` 命令。用于获取一个 root 用户的 shell,但不会加载 root 用户的完整环境。使用 `sudo su -`,它将更接近于 `sudo -i` 的效果,提供一个完整的 root 用户环境。
sudo -s
`sudo -s` 命令启动一个新的 shell,但允许用户指定一个 shell 提示符。它不会改变用户的 home 目录,但会提供一个 root 用户的 shell 环境。