Linux 用户与权限管理完整笔记
适用于常见 Linux 发行版(Ubuntu/Debian、Rocky/AlmaLinux、RHEL、CentOS、Fedora 等)。不同发行版在默认管理员组、工具包和配置路径上可能略有差异,文中会特别注明。
1. 核心概念
Linux 的权限判断主要围绕以下对象展开:
- 用户(user):登录系统或运行进程的身份,以 UID 唯一标识。
- 组(group):用户集合,以 GID 唯一标识,用于批量分配权限。
- 所有者(owner):文件所属用户。
- 所属组(group owner):文件所属用户组。
- 其他用户(others):既不是所有者,也不属于文件所属组的用户。
-
root:UID 为
0的超级用户,几乎不受普通文件权限限制。 - sudo:让被授权的普通用户以其他身份(默认是 root)执行特定命令。
1.1 用户类型
| 类型 | 常见 UID | 用途 |
|---|---|---|
| root | 0 |
超级管理员 |
| 系统/服务用户 | 通常小于 1000
|
运行 nginx、数据库等服务,通常不能登录 |
| 普通用户 | 通常从 1000 开始 |
人员登录和日常操作 |
UID 范围由 /etc/login.defs 中的 UID_MIN、UID_MAX 等参数定义,不能只凭 UID 范围判断账户用途。
2. 用户与组相关文件
2.1 /etc/passwd
每行格式:
用户名:密码占位符:UID:GID:备注:家目录:登录 Shell
alice:x:1001:1001:Alice:/home/alice:/bin/bash
-
x表示密码哈希保存在/etc/shadow。 -
/usr/sbin/nologin或/bin/false通常表示禁止交互登录。 -
/etc/passwd可供所有用户读取,但不保存实际密码。
2.2 /etc/shadow
保存密码哈希、密码有效期和锁定信息,仅 root 可读。不要手工直接修改,优先使用 passwd、chage、usermod。
2.3 /etc/group 与 /etc/gshadow
/etc/group 每行格式:
组名:密码占位符:GID:附加成员列表
developers:x:2000:alice,bob
用户的主组由 /etc/passwd 的 GID 字段决定,因此不一定出现在附加成员列表中。
3. 查看当前身份与权限
3.1 whoami:查看当前有效用户
whoami
输出示例:
alice
3.2 id:查看 UID、GID 和组
语法:
id [选项] [用户名]
常用参数:
| 参数 | 含义 |
|---|---|
-u |
只显示 UID |
-g |
只显示主组 GID |
-G |
显示全部组 GID |
-n |
与 -u/-g/-G 配合,显示名称而非数字 |
案例:
id
id alice
id -un
id -Gn alice
3.3 groups:查看用户所属组
groups
groups alice
3.4 getent:从系统账户数据库查询
getent 不仅能查本地文件,也能查询 LDAP、SSSD 等 NSS 数据源,比直接搜索 /etc/passwd 更通用。
getent passwd alice
getent group developers
getent passwd
3.5 who、w、last:查看登录情况
who # 当前登录会话
w # 当前用户、来源及正在运行的命令
last # 历史登录记录
lastlog # 每个用户最后一次登录
4. 创建、修改与删除用户
以下管理命令通常需要 root 权限,因此示例使用
sudo。
4.1 useradd:创建用户
通用语法:
sudo useradd [选项] 用户名
常用参数:
| 参数 | 含义 | 示例 |
|---|---|---|
-m |
创建家目录 | -m |
-M |
不创建家目录 | -M |
-d DIR |
指定家目录 | -d /srv/alice |
-s SHELL |
指定登录 Shell | -s /bin/bash |
-u UID |
指定 UID | -u 1500 |
-g GROUP |
指定主组 | -g developers |
-G G1,G2 |
指定附加组,逗号分隔 | -G wheel,docker |
-c TEXT |
设置备注信息 | -c "Alice Zhang" |
-e DATE |
设置账户过期日期 | -e 2027-12-31 |
-r |
创建系统用户 | -r |
案例:创建普通用户并设置密码:
sudo useradd -m -s /bin/bash -c "Alice Zhang" alice
sudo passwd alice
id alice
ls -ld /home/alice
Ubuntu/Debian 还常用交互式命令:
sudo adduser alice
adduser 通常会自动创建家目录、询问密码及备注;useradd 是更底层、适合脚本化的工具。
创建不能交互登录的服务账户:
sudo useradd -r -M -s /usr/sbin/nologin appsvc
-
-r:系统账户。 -
-M:不创建家目录。 -
-s /usr/sbin/nologin:拒绝交互式 Shell 登录。
4.2 passwd:设置、锁定和解锁密码
passwd # 修改自己的密码
sudo passwd alice # 设置 alice 的密码
sudo passwd -l alice # 锁定密码登录
sudo passwd -u alice # 解锁密码
sudo passwd -S alice # 查看密码状态
sudo passwd -e alice # 强制下次登录修改密码
sudo passwd -d alice # 删除密码(危险,不等于安全禁用)
注意:passwd -l 锁定的是密码认证。若账户配置了 SSH 密钥或其他认证方式,仍可能登录。需要彻底禁止登录时,应同时调整 Shell、SSH 配置或账户状态。
4.3 usermod:修改用户
语法:
sudo usermod [选项] 用户名
常用参数:
| 参数 | 含义 |
|---|---|
-aG GROUPS |
追加附加组;通常必须同时使用 -a 和 -G
|
-G GROUPS |
替换全部附加组,遗漏的组会被移除 |
-g GROUP |
修改主组 |
-d DIR -m |
修改家目录并移动原内容 |
-s SHELL |
修改登录 Shell |
-l NEWNAME |
修改登录名 |
-L / -U
|
锁定/解锁密码 |
-e DATE |
设置账户过期日期 |
案例:把 Alice 追加到开发组和 Docker 组:
sudo usermod -aG developers,docker alice
id alice
危险对比:
sudo usermod -G docker alice
上面的命令会把 Alice 原有的其他附加组全部替换掉。追加组应使用 -aG。
修改家目录:
sudo usermod -d /srv/users/alice -m alice
4.4 userdel:删除用户
sudo userdel alice # 删除账户,保留家目录
sudo userdel -r alice # 删除账户及家目录、邮件目录
删除前检查该用户的进程和文件:
pgrep -a -u alice
sudo find / -xdev -user alice -ls
-xdev 表示不跨越到其他文件系统。删除账户后遗留文件只会显示数字 UID,因此重要数据应先移交所有权:
sudo chown -R bob:developers /srv/project-a
4.5 chage:密码与账户有效期
sudo chage -l alice # 查看策略
sudo chage -M 90 -m 1 -W 7 alice # 最长90天、最短1天、提前7天提醒
sudo chage -d 0 alice # 下次登录强制改密
sudo chage -E 2027-12-31 alice # 账户到期日
sudo chage -E -1 alice # 取消账户到期日
参数:
-
-M DAYS:密码最大有效天数。 -
-m DAYS:两次修改密码的最小间隔。 -
-W DAYS:过期前警告天数。 -
-I DAYS:密码过期后多少天禁用账户。 -
-d DATE:上次修改密码日期;0表示下次登录必须修改。 -
-E DATE:账户到期日期。
5. 用户组管理
5.1 创建和删除组
sudo groupadd developers
sudo groupadd -g 2500 analysts # 指定 GID
sudo groupdel analysts
5.2 修改组
sudo groupmod -n devteam developers # 重命名组
sudo groupmod -g 2600 devteam # 修改 GID
修改 GID 后,旧文件可能仍记录旧数字 GID,需要检查并修正:
sudo find /srv -group 2500 -exec chgrp devteam {} +
5.3 添加或移除组成员
sudo usermod -aG developers alice
sudo gpasswd -a bob developers
sudo gpasswd -d bob developers
用户组变更通常在重新登录后对所有进程生效。临时启动使用新组的 Shell:
newgrp developers
6. 文件权限模型
查看权限:
ls -l report.txt
示例:
-rw-r----- 1 alice developers 2048 Sep 11 10:00 report.txt
拆解:
- rw- r-- ---
│ │ │ └─ 其他用户权限
│ │ └────── 所属组权限
│ └─────────── 所有者权限
└─────────────── 类型:- 普通文件,d 目录,l 符号链接
6.1 rwx 对文件和目录的含义
| 权限 | 普通文件 | 目录 |
|---|---|---|
r |
读取文件内容 | 列出目录中的名称 |
w |
修改文件内容 | 创建、删除、重命名目录项 |
x |
执行文件 | 进入/穿越目录并访问已知名称 |
重要细节:
- 删除文件主要取决于其父目录的
w+x权限,不取决于文件本身是否可写。 - 目录只有
r没有x时,可以看到名称但通常不能读取条目详情。 - 目录只有
x没有r时,不能列目录,但知道准确路径时可能访问文件。
7. chmod:修改权限
7.1 符号模式
语法:
chmod [选项] [ugoa][+-=][rwxXst] 文件
对象:
-
u:所有者(user)。 -
g:所属组(group)。 -
o:其他用户(others)。 -
a:全部三类用户(all)。
操作:
-
+:增加权限。 -
-:移除权限。 -
=:精确设置权限。
案例:
chmod u+x deploy.sh # 所有者增加执行权
chmod g-w report.txt # 组移除写权限
chmod o= secret.txt # 其他用户权限清空
chmod u=rw,g=r,o= file.txt # 精确设为 rw-r-----
chmod -R g+rX /srv/project # 递归给组读权限;只给目录和原本可执行文件加 x
X 比 x 更适合递归目录:它只对目录或原本已有执行位的文件添加执行权限,避免把普通文本都变成可执行文件。
7.2 数字模式
每类权限的数值:
r = 4w = 2x = 1
相加得到:
| 数值 | 权限 | 含义 |
|---|---|---|
7 |
rwx |
读写执行 |
6 |
rw- |
读写 |
5 |
r-x |
读和执行 |
4 |
r-- |
只读 |
0 |
--- |
无权限 |
案例:
chmod 640 report.txt # 所有者 rw,组 r,其他无权限
chmod 750 deploy.sh # 所有者 rwx,组 rx,其他无权限
chmod 700 ~/.ssh # 仅本人可访问 SSH 目录
chmod 600 ~/.ssh/id_ed25519
不建议随意使用:
chmod -R 777 /some/path
777 允许所有本机用户修改内容,可能导致数据篡改或代码植入。应按实际需要设置所有者、组和最小权限。
8. chown 与 chgrp:修改所有权
8.1 chown
sudo chown alice report.txt # 只改所有者
sudo chown alice:developers report.txt # 改所有者和组
sudo chown :developers report.txt # 只改组
sudo chown -R alice:developers /srv/project # 递归修改
常用参数:
-
-R:递归处理目录内容。 -
--reference=FILE:复制参考文件的所有者和组。 -
-h:修改符号链接本身,而不是其目标(具体行为受系统支持影响)。
案例:
sudo chown --reference=template.conf app.conf
8.2 chgrp
sudo chgrp developers report.txt
sudo chgrp -R developers /srv/project
普通用户只能在满足系统规则时把自己的文件改到自己所属的组;root 可任意修改。
9. 默认权限:umask
新对象的基准权限通常是:
- 普通文件:
666(默认不带执行位)。 - 目录:
777。
umask 屏蔽对应权限位。例如 022:
文件:666 去掉 022 → 644
目录:777 去掉 022 → 755
使用:
umask # 查看当前掩码
umask 027 # 当前 Shell 中设置;文件通常640,目录通常750
umask 077 # 文件通常600,目录通常700
永久设置位置因发行版和 Shell 而异,常见为:
- 用户级:
~/.profile、~/.bashrc。 - 系统级:
/etc/profile、/etc/bash.bashrc、/etc/login.defs。 - systemd 服务:服务单元中的
UMask=。
umask 是位屏蔽,不宜简单理解为普通十进制减法;涉及已有特殊权限位时尤其如此。
10. 特殊权限:SUID、SGID、Sticky Bit
10.1 SUID(数值 4000)
可执行文件运行时使用文件所有者的有效 UID。
chmod u+s program
chmod 4755 program
ls -l program
显示类似 -rwsr-xr-x。SUID 程序风险高,脚本上的 SUID 通常会被系统忽略。不要给自制程序随意设置 SUID root。
查找 SUID 文件:
sudo find / -xdev -type f -perm -4000 -print
10.2 SGID(数值 2000)
- 用于可执行文件:运行时使用文件所属组的有效 GID。
- 用于目录:新建内容继承目录的所属组,适合共享目录。
sudo chgrp developers /srv/project
sudo chmod 2770 /srv/project
此后开发组成员在目录内创建的文件通常继承 developers 组。
10.3 Sticky Bit(数值 1000)
主要用于多人可写目录:即使用户有目录写权限,也只能删除自己拥有的文件、目录所有者拥有的文件,或由 root 删除。
sudo chmod 1777 /srv/dropbox
ls -ld /srv/dropbox
显示类似 drwxrwxrwt。系统 /tmp 通常就是 1777。
11. ACL:为指定用户精确授权
传统权限只能设置一个所有者、一个组和其他用户。ACL 可额外授权指定用户或组。
所需工具通常来自 acl 软件包。
11.1 查看 ACL
getfacl /srv/report.txt
11.2 设置 ACL
setfacl -m u:bob:r-- /srv/report.txt
setfacl -m g:auditors:r-x /srv/reports
setfacl -x u:bob /srv/report.txt
setfacl -b /srv/report.txt
参数:
-
-m:修改 ACL。 -
-x:删除指定 ACL 条目。 -
-b:删除全部扩展 ACL。 -
-R:递归。 -
-d:设置目录的默认 ACL,让新建内容继承。
共享目录案例:
sudo mkdir -p /srv/team
sudo chown root:developers /srv/team
sudo chmod 2770 /srv/team
sudo setfacl -d -m u::rwx,g::rwx,o::--- /srv/team
sudo setfacl -d -m m::rwx /srv/team
getfacl /srv/team
ACL 输出中的 mask 限制命名用户(所有者除外)、命名组和所属组的最大有效权限。如果明明设置了权限却不生效,应检查 mask:
setfacl -m m::rwx /srv/team
12. 普通用户获得管理员权限
12.1 推荐方式:加入发行版管理员组
Ubuntu/Debian 通常使用 sudo 组:
sudo usermod -aG sudo alice
RHEL/Rocky/AlmaLinux/CentOS/Fedora 通常使用 wheel 组:
sudo usermod -aG wheel alice
然后让 Alice 重新登录,再验证:
id alice
sudo -l
sudo whoami
预期 sudo whoami 输出 root。
12.2 su 与 sudo 的区别
su - alice # 切换到 alice,加载其登录环境
su - # 切换到 root,通常需要 root 密码
sudo command # 经授权后,以 root 执行一个命令
sudo -i # 获得 root 登录式 Shell
sudo -u bob id # 以 bob 身份执行 id
-
su通常验证目标账户密码。 -
sudo通常验证当前用户密码,并受/etc/sudoers策略控制。 - 日常管理优先使用单条
sudo command,更容易审计,也减少长时间停留在 root Shell 的风险。
12.3 查看自己被允许执行什么
sudo -l
sudo -U alice -l # 管理员查看 alice 的 sudo 权限
12.4 sudo 常用参数
| 参数 | 含义 | 示例 |
|---|---|---|
-u USER |
以指定用户运行 | sudo -u postgres psql |
-g GROUP |
以指定组运行 | sudo -g developers command |
-i |
启动目标用户的登录式 Shell | sudo -i |
-s |
启动 Shell,环境处理与 -i 不同 |
sudo -s |
-l |
列出允许的命令 | sudo -l |
-k |
使当前认证缓存失效 | sudo -k |
-v |
验证并刷新认证缓存 | sudo -v |
-H |
将 HOME 设为目标用户家目录(是否默认取决于配置) | sudo -H command |
-- |
结束 sudo 参数解析 | sudo -- command -x |
13. 安全配置 sudoers
主配置文件是 /etc/sudoers,扩展配置通常放在 /etc/sudoers.d/。
13.1 必须使用 visudo
不要直接用普通编辑器修改,因为语法错误可能导致所有 sudo 权限失效。
sudo visudo
sudo visudo -f /etc/sudoers.d/alice
sudo visudo -c
-
-f FILE:编辑指定 sudoers 文件。 -
-c:检查配置语法。
/etc/sudoers.d/ 中的文件通常应由 root 拥有且权限为 0440:
sudo chown root:root /etc/sudoers.d/alice
sudo chmod 0440 /etc/sudoers.d/alice
sudo visudo -c
文件名避免使用 . 或以 ~ 结尾,因为某些 #includedir 规则会忽略这类文件。
13.2 sudoers 基本语法
谁 在哪些主机=(以谁:以哪个组) 标签: 命令列表
示例:
alice ALL=(root) /usr/bin/systemctl restart nginx
含义:用户 alice 可在所有适用主机上,以 root 身份运行准确列出的命令。
组授权在组名前加 %:
%webadmins ALL=(root) /usr/bin/systemctl restart nginx
13.3 管理员权限(需要密码)
alice ALL=(ALL:ALL) ALL
这相当于给予 Alice 广泛管理员权限。更推荐通过 sudo 或 wheel 管理员组统一授权。
14. 普通用户免密执行管理员命令
14.1 推荐:仅对必要命令免密
目标:允许 Alice 无密码重启和查看 nginx,但不能执行任意 root 命令。
- 找到真实命令路径:
command -v systemctl
- 编辑独立规则:
sudo visudo -f /etc/sudoers.d/alice-nginx
- 写入:
alice ALL=(root) NOPASSWD: /usr/bin/systemctl status nginx, /usr/bin/systemctl restart nginx
- 验证语法和权限:
sudo visudo -c
sudo -l -U alice
su - alice
sudo -k
sudo -n /usr/bin/systemctl status nginx
其中:
-
NOPASSWD::匹配的命令不询问密码。 -
sudo -k:清除已有 sudo 认证缓存,避免误以为免密已生效。 -
sudo -n:非交互执行;若仍需密码就直接失败,便于脚本验证。
14.2 使用命令别名管理多个命令
Cmnd_Alias NGINX_MGMT = /usr/bin/systemctl status nginx, \
/usr/bin/systemctl reload nginx, \
/usr/bin/systemctl restart nginx
%webadmins ALL=(root) NOPASSWD: NGINX_MGMT
创建组并添加成员:
sudo groupadd webadmins
sudo usermod -aG webadmins alice
用户重新登录后生效。
14.3 允许脚本免密运行时的关键风险
规则:
alice ALL=(root) NOPASSWD: /usr/local/sbin/deploy-app
必须保证 Alice 不能修改该脚本、脚本父目录、脚本加载的配置或模块:
sudo chown root:root /usr/local/sbin/deploy-app
sudo chmod 0755 /usr/local/sbin/deploy-app
namei -l /usr/local/sbin/deploy-app
否则 Alice 可以修改脚本内容,再让 sudo 以 root 执行,等同于获得任意 root 权限。脚本还应:
- 使用绝对命令路径。
- 严格校验输入。
- 固定或清理环境变量。
- 避免执行用户可控的文件、通配符或命令字符串。
- 避免调用可进入交互 Shell 的程序。
14.4 全部命令免密(高风险)
alice ALL=(ALL:ALL) NOPASSWD: ALL
或为管理员组整体开启:
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
这等同于该用户可无密码成为 root。仅适合风险已接受的受控自动化账户、临时实验环境等场景,不建议用于日常个人账户或多人服务器。
14.5 撤销免密授权
使用 visudo 删除对应规则:
sudo visudo -f /etc/sudoers.d/alice-nginx
sudo visudo -c
sudo -l -U alice
若要删除整个独立规则文件,应先确认目标文件准确无误并保留一个有效管理员会话作为恢复通道。
15. sudoers 常见陷阱
15.1 命令路径必须匹配
alice ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
如果实际执行的是另一个路径、不同参数或通过包装程序调用,可能不匹配。用以下命令确认:
command -v systemctl
sudo -l
15.2 不要随意授权编辑器、Shell 和通用解释器
以下程序一旦能以 root 运行,通常很容易获得 root Shell 或读写任意文件:
/bin/bash, /bin/sh, vim, less, more, python, perl, ruby,
find, awk, tar, rsync, cp, mv, tee, env
类似规则几乎等同于完全 root:
alice ALL=(root) NOPASSWD: /usr/bin/python3
15.3 通配符风险
sudoers 的参数匹配和 shell 通配规则容易产生意外匹配。不要用宽泛规则,例如允许用户控制任意路径或额外参数。优先写出完整、固定的命令形式,复杂场景用 root 拥有的安全包装脚本。
15.4 NOEXEC 不是绝对安全边界
NOEXEC: 可在部分环境阻止被授权程序再执行子命令,但它依赖平台和程序行为,不能替代最小权限设计。
15.5 规则顺序和标签
sudoers 中可能存在多条匹配规则,PASSWD/NOPASSWD 标签及后续规则会影响结果。始终使用以下命令确认最终解析结果:
sudo -l -U alice
16. SSH 登录与密钥权限
生成密钥(在客户端执行):
ssh-keygen -t ed25519 -C "alice@example"
-
-t ed25519:密钥算法。 -
-C:添加备注,不参与认证。
复制公钥:
ssh-copy-id alice@server.example.com
服务端常见正确权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
不要把私钥交给其他人。禁用密码登录前,应先在另一个终端验证密钥登录成功,并保留恢复通道。
17. 进程身份与权限
查看进程的用户信息:
ps -eo user,group,euser,egroup,pid,ppid,cmd
ps -u alice -f
- 真实 UID 通常表示启动身份。
- 有效 UID 用于大多数权限判断,SUID 或 sudo 可改变它。
以低权限账户运行命令:
sudo -u appsvc -- /usr/local/bin/myapp
runuser -u appsvc -- /usr/local/bin/myapp # 通常由 root 使用
systemd 服务建议直接声明身份:
[Service]
User=appsvc
Group=appsvc
NoNewPrivileges=true
PrivateTmp=true
修改服务单元后:
sudo systemctl daemon-reload
sudo systemctl restart myapp
sudo systemctl status myapp
18. 文件权限排错方法
18.1 查看路径每一级目录权限
namei -l /srv/project/data/report.csv
即使文件本身是 644,只要某一级父目录缺少 x 权限,用户也无法访问。
18.2 查看完整属性
stat /srv/project/data/report.csv
getfacl /srv/project/data/report.csv
18.3 以目标用户实际测试
sudo -u alice -- test -r /path/file && echo readable
sudo -u alice -- test -w /path/file && echo writable
sudo -u alice -- test -x /path/file && echo executable
18.4 检查文件系统只读或特殊属性
findmnt -T /path/file
lsattr /path/file
即使 Unix 权限允许,以下因素仍可能阻止访问:
- 文件系统以只读方式挂载。
- 文件被设置 immutable 属性(如
chattr +i)。 - SELinux 或 AppArmor 策略阻止。
- 容器、网络文件系统或用户命名空间有额外限制。
18.5 SELinux 简查(RHEL 系常见)
getenforce
ls -Z /path/file
sudo ausearch -m AVC -ts recent
不要把 setenforce 0 当作永久修复。应确认上下文和策略,并使用 restorecon、semanage fcontext 等方式修正。
19. 完整实战案例
案例 A:建立安全的团队共享目录
需求:Alice 和 Bob 可共同读写,其他用户不可访问,新文件自动属于 developers 组。
sudo groupadd developers
sudo usermod -aG developers alice
sudo usermod -aG developers bob
sudo mkdir -p /srv/project-a
sudo chown root:developers /srv/project-a
sudo chmod 2770 /srv/project-a
sudo setfacl -d -m u::rwx,g::rwx,o::--- /srv/project-a
sudo setfacl -d -m m::rwx /srv/project-a
验证:
ls -ld /srv/project-a
getfacl /srv/project-a
sudo -u alice touch /srv/project-a/from-alice
ls -l /srv/project-a/from-alice
用户需要重新登录,才能让新增组身份全面生效。
案例 B:给运维用户最小化 nginx 管理权限
需求:用户 operator 只能查看、重载和重启 nginx,不可执行任意 root 命令。
sudo useradd -m -s /bin/bash operator
sudo passwd operator
sudo visudo -f /etc/sudoers.d/operator-nginx
规则:
Cmnd_Alias NGINX_OPS = /usr/bin/systemctl status nginx, \
/usr/bin/systemctl reload nginx, \
/usr/bin/systemctl restart nginx
operator ALL=(root) NOPASSWD: NGINX_OPS
验证:
sudo visudo -c
sudo -l -U operator
su - operator
sudo -n /usr/bin/systemctl status nginx
sudo -n /usr/bin/systemctl restart sshd # 应失败
案例 C:临时授权管理员,到期后回收
Ubuntu/Debian:
sudo usermod -aG sudo contractor
sudo chage -E 2026-09-30 contractor
id contractor
sudo chage -l contractor
到期前或任务完成后回收管理员组:
sudo gpasswd -d contractor sudo
sudo passwd -l contractor
sudo -l -U contractor
RHEL 系将 sudo 组替换为 wheel。
案例 D:修复“Permission denied”
假设 Alice 不能读取 /srv/app/config/settings.yml:
id alice
namei -l /srv/app/config/settings.yml
stat /srv/app/config/settings.yml
getfacl /srv/app/config/settings.yml
sudo -u alice -- test -r /srv/app/config/settings.yml && echo OK || echo DENIED
如果 Alice 应通过 appreaders 组读取:
sudo groupadd appreaders
sudo usermod -aG appreaders alice
sudo chgrp -R appreaders /srv/app/config
sudo chmod 750 /srv/app/config
sudo chmod 640 /srv/app/config/settings.yml
随后重新登录并验证。不要用 chmod 777 掩盖所有者、组或父目录配置错误。
20. 权限审计常用命令
# UID 为 0 的账户
getent passwd | awk -F: '$3 == 0 {print $1}'
# 可交互登录的常规账户(需结合本机有效 Shell 列表判断)
getent passwd
cat /etc/shells
# 当前 sudo 规则语法
sudo visudo -c
# 当前用户 sudo 权限
sudo -l
# 世界可写目录(限制在当前文件系统)
sudo find / -xdev -type d -perm -0002 -print
# SUID/SGID 文件
sudo find / -xdev -type f \( -perm -4000 -o -perm -2000 \) -print
# 没有对应账户/组的文件
sudo find / -xdev \( -nouser -o -nogroup \) -print
审计结果不一定都是漏洞。例如 /tmp 世界可写但有 Sticky Bit;系统自带的部分 SUID 文件也有合法用途。应对照基线、软件包来源和业务需求判断。
21. 安全最佳实践
- 最小权限:只授权完成工作所需的用户、目录和命令。
- 优先用组:团队权限放到组上,不给每个用户重复配置。
-
sudo 规则拆分:放入
/etc/sudoers.d/,使用visudo检查。 -
免密只给固定命令:避免
NOPASSWD: ALL。 - 避免授权通用工具:Shell、解释器、编辑器、复制工具常能绕过限制。
- 保护特权脚本调用链:脚本、父目录、配置、依赖均不可由低权限用户修改。
- 管理员使用个人账户:不要多人共享 root 密码,以便审计到人。
- 服务使用专用账户:不同服务不要共用高权限身份。
- 定期清理:离职用户、临时账户、过期密钥、无主文件应及时处理。
- 先验证再退出:修改 SSH 或 sudo 权限时,保留一个已登录管理员会话,另开终端测试。
-
不要滥用递归:执行
chmod -R、chown -R前确认准确路径和符号链接影响。 - 记录变更:生产环境中记录授权原因、审批人、到期时间和回收结果。
22. 命令速查表
| 目的 | 命令 |
|---|---|
| 查看当前用户 | whoami |
| 查看用户身份 | id alice |
| 查询账户 | getent passwd alice |
| 创建普通用户 | sudo useradd -m -s /bin/bash alice |
| 设置密码 | sudo passwd alice |
| 创建组 | sudo groupadd developers |
| 追加用户到组 | sudo usermod -aG developers alice |
| 从组移除用户 | sudo gpasswd -d alice developers |
| 锁定密码 | sudo passwd -l alice |
| 查看密码期限 | sudo chage -l alice |
| 查看权限 |
ls -l PATH、stat PATH
|
| 修改权限 | chmod 640 FILE |
| 修改所有权 | sudo chown alice:developers FILE |
| 设置共享目录 SGID | sudo chmod 2770 DIR |
| 查看 ACL | getfacl PATH |
| 给 Bob 只读 ACL | setfacl -m u:bob:r-- FILE |
| 查看 sudo 权限 | sudo -l |
| 安全编辑 sudoers | sudo visudo -f /etc/sudoers.d/NAME |
| 检查 sudoers | sudo visudo -c |
| 清除 sudo 认证缓存 | sudo -k |
| 以其他用户运行 | sudo -u appsvc -- COMMAND |
| 查看路径逐级权限 | namei -l /full/path |
23. 一套推荐的授权决策顺序
遇到授权需求时,按以下顺序选择:
- 文件是否可以通过正确的所有者和所属组解决?
- 是否可以把相关人员加入一个专用用户组?
- 共享目录是否需要 SGID + 合理 umask/默认 ACL?
- 是否只需对个别用户增加 ACL?
- 是否真的需要管理员操作?若需要,能否配置成一条或几条固定的 sudo 命令?
- 是否真的必须免密?如果必须,能否只对固定命令使用
NOPASSWD? - 最后才考虑完整管理员权限,并明确审计、有效期和回收方案。
操作提示:不同系统中的命令路径可能是
/usr/bin/...或/bin/...。编写 sudoers 规则前使用command -v 命令名确认本机路径,并用sudo visudo -c检查语法。涉及远程服务器时,修改 SSH 或 sudo 配置前务必保留一个可用的管理员会话。