主页 > 手机  > 

深入解析sudo-l命令的输出内容

深入解析sudo-l命令的输出内容

在 Linux 系统中,sudo 命令允许普通用户以超级用户(root)权限执行命令。sudo -l 命令用于查看当前用户在 sudoers 配置文件中的权限,以及与 sudo 相关的安全策略。本文将详细解析 sudo -l 输出的各个部分,包括 用户权限、可执行命令、安全路径(secure_path)、环境变量(env_keep) 等。


1. sudo -l 命令的基本作用 1.1 语法 sudo -l

执行该命令后,系统会返回当前用户可以使用 sudo 执行的命令列表,并展示相关的安全策略。

如果用户拥有 sudo 权限,通常会看到类似的输出:

Matching Defaults entries for user on hostname: env_keep+=PYTHONPATH, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin User user may run the following commands on hostname: (ALL : ALL) ALL

如果用户不具有 sudo 权限,可能会返回:

User user is not allowed to run sudo on hostname.

接下来,我们详细解析 sudo -l 输出的各个部分。


2. Matching Defaults entries 部分解析

sudo -l 输出的第一部分是 Defaults 规则,它定义了 sudo 的默认行为。这些规则来自 /etc/sudoers 配置文件,决定了 sudo 命令的执行方式。

2.1 secure_path(安全路径) secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 作用 secure_path 定义了 sudo 执行命令时搜索可执行文件的目录。这意味着,即使 PATH 变量被篡改或用户手动修改,sudo 仍然只会在 secure_path 指定的路径中查找命令,以防止命令劫持攻击。 示例

如果 secure_path 设置为:

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"

那么当 user 以 sudo 运行 ls 命令时:

sudo ls

系统不会使用用户的 PATH 变量,而是仅在 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin 目录中查找 ls 命令。

安全性

防止恶意用户创建假冒 sudo 命令并修改 PATH 变量,从而窃取用户密码或执行恶意代码。


2.2 env_keep(保留环境变量) env_keep+=PYTHONPATH 作用 env_keep 允许在 sudo 执行命令时保留特定的环境变量。默认情况下,sudo 会清除大多数环境变量,以防止用户通过环境变量篡改 sudo 运行的命令。但如果 env_keep 允许某些变量(如 PYTHONPATH),那么这些变量在 sudo 运行时不会被清除。 示例

如果 env_keep 允许 PYTHONPATH:

Defaults env_keep += "PYTHONPATH"

那么运行:

PYTHONPATH=/custom/path sudo python3 script.py

script.py 仍然可以访问 /custom/path 目录下的 Python 库。

安全性 如果 env_keep 允许保留 LD_LIBRARY_PATH,可能导致动态链接库劫持攻击。需要谨慎管理哪些环境变量可以被保留。
3. User user may run the following commands 部分解析

这一部分列出了当前用户可以使用 sudo 执行的命令。

3.1 解析 (ALL : ALL) ALL (user may run the following commands on hostname:) (ALL : ALL) ALL 含义 (ALL : ALL) ALL 代表该用户拥有 完全的 sudo 权限,可以执行任何命令: 第一个 ALL:允许用户以 任何用户身份 执行命令(包括 root)。ALL(第二个 ALL):允许用户在 任何组 的上下文中执行命令。最后一个 ALL:表示用户可以执行 所有命令。 示例

假设 user 运行:

sudo -u nobody whoami

返回:

nobody

说明 user 可以使用 sudo -u 以 nobody 用户身份执行命令。


3.2 指定可执行命令

某些用户的 sudo -l 可能会显示:

User user may run the following commands on hostname: (ALL) /usr/bin/apt update, /usr/bin/apt install * 含义 该用户 只能执行 /usr/bin/apt update 和 /usr/bin/apt install。其中 * 代表 apt install 可以安装任何软件包,但不能执行其他 sudo 命令。 示例

允许:

sudo apt update sudo apt install vim

不允许:

sudo reboot

返回:

user is not allowed to execute /sbin/reboot as root on hostname.
4. 其他 sudo -l 相关规则 4.1 NOPASSWD(免密码 sudo) (user may run the following commands on hostname:) (ALL) NOPASSWD: /usr/bin/systemctl restart nginx NOPASSWD 允许用户执行特定 sudo 命令 无需输入密码。但 sudo 仍然需要用户具备 sudo 权限。

示例

sudo systemctl restart nginx

不会要求输入密码。


4.2 SETENV(允许用户修改环境变量) (ALL) SETENV: /usr/bin/env 允许用户使用 sudo 时 自定义环境变量,类似 sudo -E 选项。风险:如果允许 LD_PRELOAD,可能导致动态链接库劫持。

示例

sudo env VAR=value command
5. 总结 sudo -l 输出内容解析 规则作用secure_path限制 sudo 运行命令时的搜索路径,防止路径劫持。env_keep允许特定环境变量在 sudo 运行时保留。ALL : ALL允许用户以任何身份运行任何命令。NOPASSWD允许用户免密码执行特定 sudo 命令。SETENV允许 sudo 运行时修改环境变量。

正确理解 sudo -l 的输出,有助于管理员 检查权限分配是否符合安全策略,避免 滥用 sudo 权限 带来的安全风险。

标签:

深入解析sudo-l命令的输出内容由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“深入解析sudo-l命令的输出内容