65. shell命令--sudo
功能说明
sudo(superuser do 的缩写)是 Linux 和 UNIX 系统上一个非常有用的命令,它允许授权的用户以另一个用户(通常是超级用户或 root 用户)的安全方式运行命令。sudo通过配置文件/etc/sudoers和/etc/sudoers.d/目录下的文件来控制哪个用户和组可以执行哪些命令。
sudo 命令来自英文词组 super user do 的缩写,中文译为“超级用户才能干的事”,其功能是授权普通用户执行管理员命令。使用 su 命令变更用户身份虽然好用,但是需要将管理员的账户密码告诉他人,总感觉心里不踏实,幸好有了 sudo 服务。
使用 sudo 服务可以授权某个指定的用户执行某些指定的命令。通过在满足工作需求的前提下尽可能少放权,可保证服务器的安全。配置 sudo 服务时,可以直接编辑配置文件 /etc/sudoers,亦可以执行 visudo 命令进行设置,一切妥当后普通用户便能够使用 sudo 命令进行操作了。
sudo命令用来以其他身份来执行命令,预设的身份为 root。在 /etc/sudoers 中设置了可执行 sudo 指令的用户。若其未经授权的用户企图使用 sudo,则会发出警告的邮件给管理员。用户使用 sudo 时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
语法格式
sudo [选项] 命令
SYNOPSIS
sudo -h | -K | -k | -V
sudo -v [-AknS] [-a type] [-g group] [-h host] [-p prompt] [-u user]
sudo -l [-AknS] [-a type] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
sudo [-AbEHnPS] [-a type] [-C num] [-c class] [-g group] [-h host] [-p prompt] [-r role] [-t type]
[-u user] [VAR=value] [-i | -s] [command]
sudoedit [-AknS] [-a type] [-C num] [-c class] [-g group] [-h host] [-p prompt] [-u user] file ...
选项说明
-b:在后台执行指令
-E:继承当前环境变量
-h:显示帮助;
-p:改变询问密码的提示符号;
-u 用户名:以指定的用户身份执行命令,若不加上此参数,则预设以root作为新的身份;
-i 或 --login:以指定用户的身份登录 shell,类似于su -。
-s:以指定用户的身份执行 shell,但环境变量和路径可能与-i稍有不同。
-l:列出当前用户可执行与无法执行的指令。
-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码。
-v:验证用户的密码,如果验证成功,则缓存密码一段时间(默认是5分钟),之后执行sudo命令时无需再次输入密码。
-H:设置 HOME 环境变量为指定用户的家目录。
-V :显示版本信息。
实践操作
0. 环境准备
# 创建三个用户并设置密码为123456以及开启日志记录
seq 3|sed -r 's#(.*)#useradd MineGi-\1;echo '123456'|passwd --stdin MineGi-\1#g'|bash
tail -3 /etc/passwd
touch /var/log/sudo.log
chmod 644 /var/log/sudo.log
echo "local2.debug /var/log/sudo.log" >>/etc/rsyslog.conf
tail -1 /etc/rsyslog.conf
cat >>/etc/sudoers <<'eof'
Defaults logfile=/var/log/sudo.log
Defaults loglinelen=0
Defaults !syslog
MineGi-1 ALL=(ALL) NOPASSWD: ALL
MineGi-2 MineGi=/sbin/ifconfig
eof
tail -5 /etc/sudoers
visudo -c
开三个窗口
su - MineGi-1
su - MineGi-2
su - MineGi-3
whoami
1. 列出当前用户可以执行的 sudo 命令
sudo -l
2. 以 root 用户身份查看内容
ls -la /root/
sudo ls -la /root/
3. 使用用户 MineGi-2 操作
ifconfig ens33:0 10.4.7.22/24 # 用sudo命令
sudo ifconfig ens33:0 10.4.7.22/24 # 使用sudo命令,需要验证密码
sudo ifconfig ens33:0 10.4.7.22/24
ifconfig ens33:0 # 查看命令,执行成功
sudo -l # 查看获得哪些sudo授权
3. 以另一个用户身份执行命令
whoami
sudo -u MineGi-2 whoami
4. 被授权 NOPASSWD: ALL,相当于 root 权限,可免密码切换 root
sudo su -
env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)'
#这个命令相当于使用root超级用户重新登录一次shell,只不过密码是使用的当前用户的密码。
#而且重要是,该命令会重新加载/etc/profile文件以及/etc/bashrc文件等系统配置文件,
#并且还会重新加载root用户的$SHELL环境变量所对应的配置文件 ,
#比如:root超级用户的$SHELL是/bin/bash,则会加载/root/.bashrc等配置。
#如果是/bin/zsh,则会加载/root/.zshrc等配置,执行后是完全的root环境。
sudo -i
env | grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)'
#这个命令基本与 sudo su - 相同,执行后也是root超级用户的环境,只不过是多了一些当前用户的信息。
sudo -s
env|grep -E '(HOME|SHELL|USER|LOGNAME|^PATH|PWD|TEST_ETC|TEST_ZSH|TEST_PRO|TEST_BASH|TEST_HOME|SUDO)' --color
#这个命令相当于以当前用户的$SHELL开启了一个root超级用户的no-login的shell,
#不会加载/etc/profile等系统配置 。
#所以/etc/profile文件中定义的TEST_ETC环境变量就看不到了,
#但是会加载root用户对应的配置文件,比如root用户的$SHELL是/bin/zsh,
#那么会加载/root/.zshrc配置文件,执行完后,不会切换当前用户的目录。
5. 查看日志
ctrl + D
tail /var/log/sudo.log
高级特性
NOPASSWD:
在 /etc/sudoers 文件中,除了设置用户或组无需密码即可执行 sudo 命令外,还可以使用 NOPASSWD:标签为特定的命令或命令集合禁用密码要求。这特别适用于需要频繁执行 sudo 命令但又不希望每次都输入密码的场景,比如自动化脚本。
别名(Aliases):
sudo配置文件支持用户别名(User_Alias)、主机别名(Host_Alias)、命令别名(Cmnd_Alias)和运行别名(Runas_Alias)等概念,这些别名允许管理员以更灵活和可管理的方式定义权限规则。例如,可以创建一个命令别名来包含一系列需要超级用户权限执行的命令,然后仅授权给特定的用户或组执行这些命令。
X11转发控制:
sudo 默认不允许 X11 转发,这是出于安全考虑。然而,在某些情况下,比如远程管理 GUI 应用时,可能需要启用此功能。可以通过在/etc/sudoers文件中设置 xauth_options 或在 sudo 命令中使用 -X 选项来实现。
环境变量控制:
sudo在默认情况下会重置大部分环境变量,以防止潜在的安全风险。然而,管理员可以通过 env_reset、env_keep、env_check 和 env_delete 等指令在 /etc/sudoers 文件中精细控制哪些环境变量应该被保留、检查或删除。
使用场景
自动化脚本:
在自动化脚本中,经常需要执行需要超级用户权限的命令。通过使用 sudo,可以在脚本中安全地执行这些命令,而无需手动输入密码。
临时提升权限:
普通用户可能需要临时执行一些需要超级用户权限的任务,比如安装软件、修改系统配置文件等。sudo 允许用户以 root 用户的身份执行这些命令,而无需切换到 root 用户,从而减少了因误操作导致的安全风险。
远程管理:
在远程管理 Linux 或 UNIX 系统时,sudo 提供了一种安全的方式来执行需要超级用户权限的命令。通过配置 sudo,管理员可以控制哪些远程用户可以执行哪些命令,从而确保系统的安全性。
日志记录和审计:
sudo 的日志记录功能使得管理员能够追踪和审计哪些用户执行了哪些命令,这对于系统安全性的维护和故障排查非常有帮助。
总之,sudo 是 Linux 和 UNIX 系统上不可或缺的安全管理工具,它通过灵活的权限控制和强大的日志记录功能,帮助管理员确保系统的安全性和可审计性。无论是普通用户还是系统管理员,都应该熟悉和掌握 sudo 的使用方法和配置技巧。