如何理解 Linux 中 sudo 的权限模型

Linux 中提示: permission denied 可能发生在两个阶段:

文件执行权限(进程创建阶段):就是执行某个可执行文件时,有没有对这个可执行文件具有执行权限,如果存在就能以当前用户身份启动基于该可执行文件创建的进程,若没有就会提示:“permission denied

资源访问权限(进程运行阶段):进程启动后,他会去读取、写入或修改操作系统相关文件资源,若进程的有效 UID/GID没有权限,也是会提示:“permission denied


执行某个命令加 sudo 解决的不是 进程创建阶段因文件执行权限导致的权限拒绝问题:

假设用户 ehigh 具有完整的 sudo 权限(ehigh ALL=(ALL) ALL),此时有一个权限为 644 的文件 test.sh,即使使用 sudo ./test.sh,照样执行不了,因为不能绕过文件执行位。

sudo 真正解决的是资源访问权限这个阶段的问题,假设 docker 命令的权限为(rwxr-xr-x),普通用户执行 docker ps 时往往会提示:Got permission denied while trying to connect to the Docker daemon socket

这个并不是二进制文件docker 不可以执行,而是虽然普通用户创建了docker 进程,但是 docker 进程启动后会去访问 /var/run/docker.sock 这个文件,这个文件的一般只允许 root 或 docker组的用户才能访问的,所以普通用户启动的docker进程没权限访问就提示:permission denied

使用 sudo docker ps(执行 sudo 如果不适用 -u 指定用户名,默认是:sudo -u root)时,是以root用户的身份去启动docker进程,root 访问 /var/run/docker.sock 被允许,所以会执行成功。


如何使用 sudo 命令,以及 sudo 的权限规则是如何配置的:

sudo 的命令格式:sudo [ -u user] command command_parameter,一般执行 sudo 命令的时候都没有指定 -u 参数来执行要以谁的身份执行,此时默认就是以 root 身份执行。即:sudo command 等价于 sudo -u root command

sudo 命令本身可以被任何用户执行,但是 sudo 提权操作是否成功,要看执行 sudo 提权的本地用户是否满足 sudo 中定义的规则,若不满足就直接拒绝。

sudo 的规则在 sudo 配置文件里指定,sudo 的配置文件默认是: /etc/sudoers (执行 visudo 命令时打开的就是这个配置文件),一般是不建议直接在该配置文件中自定义规则。

在 sudo 主配置文件中,默认使用 #includedir /etc/sudoers.d 指定了子配置文件的存放路径,所以可以在 /etc/sudoers.d 下常见子配置文件,然后配置相关的规则。


sudo 规则指定语法是这样的User Host = (RunAs) Command

  • User:表示 哪些用户 / 用户组 可以使用这条规则,若为用户直接写用户名,若为组则需要在组名前加上 %,多个用户,组之间使用逗号分隔。
  • Host:表示 这条规则在哪些主机上生效,实际生产中几乎都用 ALL表示所有主机
  • RunAs:表示 允许 sudo 切换成哪个用户执行命令,一般写为 root 或 ALL
  • Command:表示 允许执行哪些命令,ALL 表示允许所有命令的执行。

例如:给 ehigh 用户授予完整的 sudo 权限

ehigh ALL=(ALL) ALL

# ehigh 用户在 任何主机 上,都能以 任意用户身份 执行 任何命令

如果修改执行一次sudo 命令后,未来多长的时间内不在输入命令:

执行 sudo 时,需要验证当前用户的密码(通过 Defaults timestamp_timeout=5 控制5分种内不会再次验证),可以在 command 部分的前面加上 NOPASSWD,表示 执行命令时不需要输入密码:

例如

ehigh  ALL=(ALL)  NOPASSWD: ALL
# 使用冒号 + 空格分隔

为什么使用sudo 执行某个命令时,命名PATH变量中存在该命令路径,还是提示command not found

sudo 有自己的环境变量,默认是在 配置文件 /etc/sudoers 中定义的,通过 sudo 提权指定某个命令的时候,会从sudo 指定的PATH变量(secure_path)中指定的路径去找命令,若不在指定路径下则会提示:“command not found

posted on 2026-01-22 00:34  一直小爪子  阅读(1)  评论(0)    收藏  举报