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

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


http://www.kler.cn/a/554878.html

相关文章:

  • 解锁Linux“故障宝藏”:Core Dump分析秘籍(转)
  • openharmony中HDF驱动框架关键流程说明-观察者模式
  • 芯谷D2761:为扬声器保护而生的音频限幅器
  • 雷龙CS SD NAND(贴片式TF卡)测评体验
  • 利用PHP爬虫精准获取淘宝分类详情:实战案例指南
  • 广西壮族自治区园区投促中心党委书记陶德文率团到访深兰科技
  • conda和conda-forge区别?怎么选用?
  • 第十二届先进制造技术与材料工程国际学术会议 (AMTME 2025)
  • Linux多版本管理工具介绍
  • 嵌入式开发岗位认识
  • 【数学】数论干货(疑似密码学基础)
  • uniapp manifest.json国际化配置,使用 %app.name% 占位,应用名称不会跟随系统语言改变
  • Jenkins 节点 Node 概念
  • 装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住
  • Plant Simulation培训教程-AGV配送物流仿真模块
  • Windows安装SVN客户端及其中文汉化教程
  • DRM系列十一:Drm之config->funcs->atomic_commit
  • 力扣hot100 ——搜索二维矩阵 || m+n复杂度优化解法
  • L0G3000 Git 基础知识
  • 计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)