当前位置: 首页 > news >正文

深入解析 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"

那么当 usersudo 运行 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 -unobody 用户身份执行命令。


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 权限 带来的安全风险。

相关文章:

  • pdf预览在vue项目中的使用兼容ie浏览器
  • 面对STM32的庞大体系,如何避免迷失在细节中?
  • [python]windows上安装yolov12环境
  • 选好加密狗,一次说全
  • Deepseek快速做PPT
  • Go Web 项目实战:构建 RESTful API、命令行工具及应用部署
  • 用C++ Qt实现安卓电池充电动效 | 打造工业级电量控件
  • nodejs链接redis
  • webSocket
  • Python装饰器本质250220
  • HTTP与网络安全
  • 华为最新OD机试真题-找单词-Python-OD统一考试(E卷)
  • topN 相似度 torch实现
  • Oracle JDK、Open JDK zulu下载地址
  • Java 与设计模式(17):责任链模式
  • 使用 Docker-compose 部署 MySQL
  • 【蓝桥】二分法
  • DP-最长公共子序列
  • 【Alertmanager】alertmanager告警系统原理剖析与应用实战,应有尽有非常全面
  • Qt能正常编译和执行,但是文本报错找不到文件
  • 目前中美未进行任何经贸谈判,外交部、商务部再次表明中方立场
  • 中国专家组赴缅开展地震灾害评估工作
  • 与包乐史驾帆航行|航海、钓鱼和写书:一个记者的再就业之路
  • 北京市交通委通报顺平路潮白河大桥事故直接原因
  • 上海小朋友喜欢读什么书?来看这份“少年儿童阅读报告”
  • 美国那点事|特朗普的“刀”砍向国务院,美国霸权迎来历史拐点?