参考资料
目录
- [一. 简介](#一. 简介)
-
- [1.1 使用`sudo`的好处](#1.1 使用
sudo的好处) - [1.2 `sudo`的密码缓存机制](#1.2
sudo的密码缓存机制)
- [1.1 使用`sudo`的好处](#1.1 使用
- [二. 切换为root用户的方法](#二. 切换为root用户的方法)
-
- [2.1 `sudo -i`](#2.1
sudo -i) - [2.2 `sudo -s`](#2.2
sudo -s) - [2.3 `su -`](#2.3
su -)
- [2.1 `sudo -i`](#2.1
- [三. 配置项](#三. 配置项)
-
- [3.1 `-l` 查看当前 `sudo` 权限](#3.1
-l查看当前sudo权限) - [3.2 `-k` 清除密码缓存](#3.2
-k清除密码缓存)
- [3.1 `-l` 查看当前 `sudo` 权限](#3.1
- [四. 配置文件](#四. 配置文件)
-
- [4.1 `visudo` 命令编辑配置文件](#4.1
visudo命令编辑配置文件) - [4.2 禁止当前用户通过 sudo `-i` 或 `-s` 切换为root](#4.2 禁止当前用户通过 sudo
-i或-s切换为root) - [4.3 禁止执行的命令 + 只允许执行的命令](#4.3 禁止执行的命令 + 只允许执行的命令)
- [4.1 `visudo` 命令编辑配置文件](#4.1
- [五. 日志](#五. 日志)
-
- [5.1 基础日志](#5.1 基础日志)
- [5.2 审计日志](#5.2 审计日志)
-
- [5.2.1 配置](#5.2.1 配置)
- [5.2.2 日志查看](#5.2.2 日志查看)
一. 简介
⏹sudo:superuser do(以超级用户身份执行),让普通用户,临时以 root 权限执行某个命令。
而不是直接切换成root用户,或者给普通用户永久root权限。
- 并不是所有的用户都可以使用
sudo命令,必须由管理员配置相应的权限。 - 当使用sudo命令时,若提示输入密码,输入的是当前用户的密码,并非root用户的密码。
1.1 使用sudo的好处
- 如果直接切换为
root用户的话,所有命令都是最高权限,误操作风险极高,不好审计。 - 使用
sudo的话,可只提权一次,可只提权一个命令。 - 有日志显示,并且可精确地控制权限。
1.2 sudo的密码缓存机制
当我们使用sudo命令输入过一次密码之后,sudo会将输入的密码缓存,5分钟内再次使用sudo命令时,无需输入密码。
如果想要修改缓存时间的话,在 /etc/sudoers.d/下的文件中加入下面的配置即可。
bash
Defaults timestamp_timeout=5
二. 切换为root用户的方法
login shell 的意义:
- PATH 完整
- root 的环境变量生效
- 行为最接近真正登录
| 命令 | 推荐度 | 核心一句话 | login shell |
|---|---|---|---|
sudo -i |
⭐⭐⭐⭐⭐ | 最推荐,模拟一次 真正的 root 登录 | ✅ 是 |
sudo -s |
⭐⭐⭐⭐ | 只是"拿到 root 壳",环境不完整 | ❌ 否 |
su - |
⭐⭐ | 用 root 密码登录,现代系统不推荐 | ✅ 是 |
| 项目 | HOME | PATH | profile |
|---|---|---|---|
sudo -i |
/root | root 标准 | 加载 |
sudo -s |
当前用户 | 继承用户 | 不加载 |
su - |
/root | root 标准 | 加载 |
2.1 sudo -i
- 最推荐的方式,sudo 认证 → 模拟 root 的登录 shell
- 使用 sudo 的权限模型,不需要 root 密码
- 加载完整 root 登录环境
/etc/profile~/.bash_profile或~/.profile
2.2 sudo -s
- 用 root 身份启动一个 shell(默认是 /bin/sh)
- 不读取 root 的登录环境,PATH 是普通用户的PATH
- 不执行
/etc/profile
2.3 su -
- 类似真正 root 登录,需要使用root的密码
- 加载完整 root 登录环境
/etc/profile~/.bash_profile或~/.profile
三. 配置项
3.1 -l 查看当前 sudo 权限
bash
apluser@FengYeHong-HP:~$ sudo -l
Matching Defaults entries for apluser on FengYeHong-HP:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User apluser may run the following commands on FengYeHong-HP:
(ALL : ALL) ALL
3.2 -k 清除密码缓存
⏹sudo命令,默认会缓存密码5分钟,通过sudo -k可以清除缓存
- 常用于测试权限或安全演示
bash
# 首次使用sudo命令的时候,需要输入密码
apluser@ubuntu24-01:~$ sudo which
[sudo] password for apluser:
apluser@ubuntu24-01:~$
# 再次使用sudo命令时, 无需输入密码
apluser@ubuntu24-01:~$ sudo which
apluser@ubuntu24-01:~$
# 使用 -k 清除密码缓存
apluser@ubuntu24-01:~$ sudo -k
apluser@ubuntu24-01:~$
# 再次使用sudo命令的时候,需要输入密码
apluser@ubuntu24-01:~$ sudo which
[sudo] password for apluser:
apluser@ubuntu24-01:~$
四. 配置文件
⏹系统sudo的配置文件存储在/etc/sudoers中
- 该文件只有root用户才有权修改
- 如果误修改,可能会导致用不了sudo,一般不直接修改
/etc/sudoers文件 - 一般的做法是在
/etc/sudoers.d/目录下新建配置文件,新的配置文件中的内容会被sudo读取并合并到主配置中。这种方法优点如下:- 不会动到系统默认的
/etc/sudoers(降低误操作风险) - 以后要撤销权限,直接删掉这个文件就行
- 方便运维脚本批量管理不同用户的 sudo 配置
- 不会动到系统默认的

4.1 visudo 命令编辑配置文件
⏹sudo visudo是专门用来安全的编辑/etc/sudoers 和 /etc/sudoers.d/ 的命令,具体作用如下:
- ✅语法校验
- 保存并退出时,
visudo会检查sudoers语法 - 有错误 → 拒绝保存
- 保存并退出时,
- ✅文件锁
- 自动加锁
- 防止并发编辑导致文件损坏
- ✅正确的权限保存文件
sudoers文件要求:-r--r----- root rootvisudo会自动保证权限正确
bash
sudo visudo -f /etc/sudoers.d/配置文件名称
⏹当存在多个配置文件的时候,会按照顺序依次加载,推荐按照功能设置不同的配置文件,更好管理。
bash
apluser@FengYeHong-HP:~$ sudo tree /etc/sudoers.d/
/etc/sudoers.d/
├── 00-base
├── 10-admins
├── 20-no-password
├── 30-io-logging
└── 99-custom
4.2 禁止当前用户通过 sudo -i 或 -s 切换为root
- 让普通用户随意切换为root是很危险的
- 可以在配置文件中禁止指定用户通过sudo命令切换为root
- sudo是通过
/usr/bin/sh或/usr/bin/bash切换为root - 只需要在配置文件中禁用这两个命令即可
- 需要注意的是,禁用之后,普通的
bash xxx.sh或sh xxx.sh还是可以执行的
- sudo是通过
bash
apluser@FengYeHong-HP:~$ ls -l /etc/sudoers.d/
total 8
-r--r----- 1 root root 194 Dec 20 10:15 01-config
-r--r----- 1 root root 1096 Feb 8 2022 README
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
[sudo] password for apluser:
# ---------------------------
# 禁止的命令
# ---------------------------
Cmnd_Alias FORBIDDEN = \
/usr/bin/sh, \
/usr/bin/bash
# 禁止指定的命令
apluser ALL=(ALL) !FORBIDDEN
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo -i
Sorry, user apluser is not allowed to execute '/bin/bash' as root on FengYeHong-HP.localdomain.
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo -s
Sorry, user apluser is not allowed to execute '/bin/bash' as root on FengYeHong-HP.localdomain.
4.3 禁止执行的命令 + 只允许执行的命令
⏹我们通过配置文件对普通用户使用sudo命令进行更加精细的配置
- 只能使用指定的命令,但是需要输入密码
- 无法
sudo -s或sudo -i切换为root
bash
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
# ---------------------------
# 禁止的命令
# ---------------------------
Cmnd_Alias FORBIDDEN = \
/usr/bin/sh, \
/usr/bin/bash, \
/bin/rm, \
/usr/bin/vi, \
/usr/bin/vim, \
/usr/bin/nano, \
/usr/sbin/visudo, \
/usr/bin/cp
# ---------------------------
# 允许的命令
# ---------------------------
Cmnd_Alias ALLOW = \
/usr/bin/grep, \
/usr/bin/ls, \
/usr/bin/cat
# 只允许指定的命令
apluser ALL=(ALL) ALLOW
# 禁止指定的命令
apluser ALL=(ALL) !FORBIDDEN
- 可以无密码指定指定的命令,其他命令都执行不了
- 无法
sudo -s或sudo -i切换为root
bash
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
# ---------------------------
# 允许的命令
# ---------------------------
Cmnd_Alias ALLOW = \
/usr/bin/grep, \
/usr/bin/ls, \
/usr/bin/cat
# 禁止通过sudo使用所有命令
apluser ALL=(ALL) !ALL
# 但是只允许执行无密码执行特定的命令
apluser ALL=(ALL) NOPASSWD:ALLOW
- 可以无密码执行指定的命令
- 可以用密码执行没有被禁止的命令
- 无法
sudo -s或sudo -i切换为root
bash
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
# ---------------------------
# 禁止的命令
# ---------------------------
Cmnd_Alias FORBIDDEN = \
/usr/bin/sh, \
/usr/bin/bash, \
/bin/rm, \
/usr/bin/vi, \
/usr/bin/vim, \
/usr/bin/nano, \
/usr/sbin/visudo, \
/usr/bin/cp
# ---------------------------
# 允许的命令
# ---------------------------
Cmnd_Alias ALLOW = \
/usr/bin/grep, \
/usr/bin/ls, \
/usr/bin/cat
# 但是只允许执行无密码执行特定的命令
apluser ALL=(ALL) NOPASSWD:ALLOW
# 禁止指定的命令
apluser ALL=(ALL) !FORBIDDEN

五. 日志
5.1 基础日志
⏹如果当前Linux系统是Ubuntu 或 Debian的话,sudo相关的日志一般保存在下面的路径中
bash
apluser@FengYeHong-HP:~$ ls -l /var/log/auth.log
-rw-r----- 1 syslog adm 7652 Aug 23 18:34 /var/log/auth.log
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ tail /var/log/auth.log
Aug 23 18:32:57 FengYeHong-HP systemd: pam_unix(systemd-user:session): session opened for user root(uid=0) by (uid=0)
Aug 23 18:32:57 FengYeHong-HP systemd-logind[252]: New session c1 of user root.
Aug 23 18:33:01 FengYeHong-HP CRON[759]: pam_unix(cron:session): session opened for user apluser(uid=1000) by (uid=0)
Aug 23 18:33:01 FengYeHong-HP CRON[759]: pam_unix(cron:session): session closed for user apluser
Aug 23 18:34:01 FengYeHong-HP CRON[1012]: pam_unix(cron:session): session opened for user apluser(uid=1000) by (uid=0)
Aug 23 18:34:01 FengYeHong-HP CRON[1012]: pam_unix(cron:session): session closed for user apluser
Aug 23 18:34:37 FengYeHong-HP su: pam_unix(su-l:session): session closed for user root
Aug 23 18:34:37 FengYeHong-HP systemd-logind[252]: Session c1 logged out. Waiting for processes to exit.
Aug 23 18:34:37 FengYeHong-HP systemd-logind[252]: Removed session c1.
Aug 23 18:34:47 FengYeHong-HP systemd: pam_unix(systemd-user:session): session closed for user root
apluser@FengYeHong-HP:~$
⏹现代的Linux系统都会使用 journald,sudo 记录一定会进入 journal,可通过下面的命令进行查看。
bash
apluser@FengYeHong-HP:~$ journalctl | grep sudo | tail
Aug 15 08:59:47 FengYeHong-HP sudo[29625]: pam_unix(sudo:session): session closed for user root
Aug 15 09:23:47 FengYeHong-HP sudo[35322]: apluser : TTY=pts/0 ; PWD=/home/apluser/work/0815 ; USER=root ; COMMAND=/usr/sbin/service cron restart
Aug 15 09:23:47 FengYeHong-HP sudo[35322]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Aug 15 09:23:47 FengYeHong-HP sudo[35322]: pam_unix(sudo:session): session closed for user root
Aug 15 14:50:19 FengYeHong-HP sudo[44167]: apluser : TTY=pts/0 ; PWD=/home/apluser/work/0815 ; USER=root ; COMMAND=/usr/bin/rm -i /var/log/cron.log
Aug 15 14:50:19 FengYeHong-HP sudo[44167]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Aug 15 14:50:21 FengYeHong-HP sudo[44167]: pam_unix(sudo:session): session closed for user root
Aug 15 15:06:09 FengYeHong-HP sudo[48285]: apluser : TTY=pts/0 ; PWD=/home/apluser/work/0815 ; USER=root ; COMMAND=/usr/bin/systemctl restart cron
Aug 15 15:06:09 FengYeHong-HP sudo[48285]: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Aug 15 15:06:09 FengYeHong-HP sudo[48285]: pam_unix(sudo:session): session closed for user root
5.2 审计日志
在测试阶段的话,可以使用find /var/log/sudo-io -mindepth 3 -type d -mtime +3 -exec rm -rf {} +删除3天之前的文件夹
5.2.1 配置
⏹可根据需求开启,sudo命令的 I/O 审计(输入 / 输出录制)功能,记录用户使用sudo命令切换为root之后进行的操作。
- 创建保存
I/O审计日志的文件夹
bash
sudo mkdir -p /var/log/sudo-io
sudo chown root:root /var/log/sudo-io
sudo chmod 700 /var/log/sudo-io
- 创建sudo的
I/O审计配置文件
bash
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/30-io-logging
# ===============================
# sudo I/O logging
# ===============================
# 开启 sudo 输入 / 输出录制
Defaults log_output
# sudo I/O 日志的 根目录, 强烈建议设置单独目录,方便日志轮转和限制权限
Defaults iolog_dir="/var/log/sudo-io"
# 设置IO日志的格式, 按 用户 / 日期 / 时间 分类, 适合审计和清理
Defaults iolog_file="%{user}/%Y%m%d/%H%M%S"
# 实时写盘,防止系统崩溃导致 sudo 录像丢失
Defaults iolog_flush
# 不截断输出, 防止长命令 / 长输出被切断
Defaults loglinelen=0
🔹 配置文件创建完成之后,就会立即生效,配置文件会按照字典顺序进行加载。
bash
/etc/sudoers
/etc/sudoers.d/*
5.2.2 日志查看
- 列出最近的 sudo
I/O记录,并只看最后 3 条 - 可根据
TSID来回放查看用户当时的操作
bash
apluser@FengYeHong-HP:~$ sudo sudoreplay -d /var/log/sudo-io -l | tail -n 3
Dec 20 13:31:11 2025 : apluser : HOST=FengYeHong-HP ; TTY=/dev/pts/0 ; CWD=/home/apluser ; USER=root ; TSID=apluser/20251220/133111 ; COMMAND=/usr/bin/sudoreplay -d /var/log/sudo-io -l
Dec 20 13:31:21 2025 : apluser : HOST=FengYeHong-HP ; TTY=/dev/pts/0 ; CWD=/home/apluser ; USER=root ; TSID=apluser/20251220/133121 ; COMMAND=/usr/bin/sudoreplay -d /var/log/sudo-io -l
Dec 20 13:31:25 2025 : apluser : HOST=FengYeHong-HP ; TTY=/dev/pts/0 ; CWD=/home/apluser ; USER=root ; TSID=apluser/20251220/133125 ; COMMAND=/usr/bin/sudoreplay -d /var/log/sudo-io -l
⏹文件结构
| 文件 | 是否纯文本 | 说明 |
|---|---|---|
stdin |
❌ | 键盘输入流(含控制字符) |
stdout |
❌ | 程序输出流 |
stderr |
❌ | 错误输出 |
timing |
❌ | 时间轴(二进制) |
log |
⚠ 半文本 | 元数据(可读但不完整) |
bash
apluser@FengYeHong-HP:~$ sudo ls -l /var/log/sudo-io/apluser/20251220 | tail -n 3
drwx------ 2 root root 4096 Dec 20 13:32 133205
drwx------ 2 root root 4096 Dec 20 13:32 133210
drwx------ 2 root root 4096 Dec 20 13:33 133310
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo ls -l /var/log/sudo-io/apluser/20251220/133205
total 24
-rw------- 1 root root 98 Dec 20 13:32 log
-rw------- 1 root root 2400 Dec 20 13:32 log.json
-rw------- 1 root root 25 Dec 20 13:32 stderr
-rw------- 1 root root 25 Dec 20 13:32 stdout
-r-------- 1 root root 43 Dec 20 13:32 timing
-rw------- 1 root root 78 Dec 20 13:32 ttyout
⏹通过sudo sudoreplay进行日志回放,可将当时用户输入的命令和屏幕上输出的内容保存显示到屏幕上
bash
apluser@FengYeHong-HP:~$ sudo sudoreplay /var/log/sudo-io/apluser/20251220/133615
Replaying sudo session: /usr/bin/ls -l /
total 2752
drwxr-xr-x 3 root root 4096 Jun 7 2025 Docker
lrwxrwxrwx 1 root root 7 Oct 26 2022 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 18 2022 boot
drwxr-xr-x 8 root root 3160 Dec 20 08:58 dev
drwxr-xr-x 74 root root 4096 Dec 20 13:15 etc
drwxr-xr-x 3 root root 4096 May 25 2025 home
-rwxrwxrwx 1 root root 2724464 Apr 24 2025 init
lrwxrwxrwx 1 root root 7 Oct 26 2022 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Oct 26 2022 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Oct 26 2022 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Oct 26 2022 libx32 -> usr/libx32
drwx------ 2 root root 16384 Apr 11 2019 lost+found
drwxr-xr-x 2 root root 4096 Oct 26 2022 media
drwxr-xr-x 8 root root 4096 May 25 2025 mnt
drwxr-xr-x 2 root root 4096 Oct 26 2022 opt
dr-xr-xr-x 198 root root 0 Dec 20 08:58 proc
drwx------ 7 root root 4096 Dec 20 10:31 root
drwxr-xr-x 8 root root 180 Dec 20 09:38 run
lrwxrwxrwx 1 root root 8 Oct 26 2022 sbin -> usr/sbin
drwxr-xr-x 9 root root 4096 Aug 15 08:04 snap
drwxr-xr-x 2 root root 4096 Oct 26 2022 srv
dr-xr-xr-x 13 root root 0 Dec 20 08:57 sys
drwxrwxrwt 6 root root 4096 Aug 23 18:32 tmp
drwxr-xr-x 14 root root 4096 Oct 26 2022 usr
drwxr-xr-x 13 root root 4096 Oct 26 2022 var
drwx------ 2 root root 4096 Jun 1 2025 wslDlkkam
drwx------ 2 root root 4096 Jun 1 2025 wslLGBDdm
drwx------ 2 root root 4096 Jun 1 2025 wslhKEkcm
drwx------ 2 root root 4096 Jun 1 2025 wsllPAenj
drwx------ 2 root root 4096 Jun 1 2025 wslpdJOcm