Linux用户与组管理:UID、GID与账户控制
检查当前用户:
id
# uid=1001(deployer) gid=1001(deployer) groups=1001(deployer),27(sudo),998(docker)
id -u # 仅显示UID
whoami # 仅显示用户名
getent passwd deployer
getent 查询NSS模块(包括LDAP),而不仅仅是直接读取文件。
访问模型与所有权
每个inode存储所有者(UID)和所属组(GID)。内核按以下顺序检查权限:进程的UID/GID → 所有者? → 组? → 其他人。第一个匹配项决定访问权限。
示例:
ls -la /var/log/nginx/
# -rw-r----- 1 www-data adm 187234 Mar 26 10:41 access.log
所有者是 www-data,组是 adm。以 www-data 身份运行的进程将获得所有者级别的访问权限,忽略其组成员身份。
UID范围:
- 0:root
- 1–999:系统账户(守护进程,无法登录)
- 1000+:普通用户
- 65534:nobody
配置位于 /etc/login.defs。
系统用户使用 /usr/sbin/nologin 或 /bin/false 防止登录:
awk -F: '$3 < 1000 && $3 > 0 {print $1, $3, $7}' /etc/passwd
组:共享访问权限
主组(/etc/passwd 中的GID)应用于新创建的文件。附加组列在 /etc/group 中。
检查成员资格:
groups # 当前所属组
getent group docker # 成员列表
docker:x:998:deployer,ci
组简化了权限控制:将用户加入 docker 组即可授予套接字访问权限,无需使用 sudo。
配置文件
/etc/passwd(对所有用户可读):
deployer:x:1001:1001:Deploy Bot,,:/home/deployer:/bin/bash
字段:用户名 | 密码占位符(x) | UID | GID | GECOS | 主目录 | shell。
/etc/shadow(仅root可读):包含SHA-512或yescrypt哈希值及密码过期设置。
deployer:$6$rounds=5000$xPwF...$kE9...hash...:19800:0:99999:7:::
/etc/group:
docker:x:998:deployer,ci-bot
安全编辑命令:
vipw # 使用锁编辑passwd文件
vigr # 编辑group文件
pwck # 验证配置正确性
创建与配置用户
使用 useradd 并搭配关键选项:
| 选项 | 说明 |
|------|------|
| -m | 创建主目录 |
| -s | 设置默认shell |
| -G | 添加附加组 |
| -r | 系统账户 |
| -u | 指定UID |
示例:
useradd -m -s /bin/bash -G sudo,docker ivan
useradd -r -s /usr/sbin/nologin ci-bot
passwd ivan # 设置密码
chpasswd <<< 'ivan:secret'
passwd -e ivan # 强制下次登录时更改密码
useradd -m 会从 /etc/skel 复制模板并设置主目录的所有权。
umask 从 0666(文件)或 0777(目录)中减去。默认值为 0022。
环境与模板
/etc/skel 存放新用户主目录的模板文件:.bashrc、.profile。
全局设置:
/etc/default/useradd:useradd的默认参数/etc/profile.d/*.sh:登录时执行的环境脚本/etc/login.defs:umask、UID范围等设置
核心要点:
- UID控制访问权限,而非用户名。
- 使用
getent进行NSS感知查询,而非cat /etc/passwd。 - 组是委派权限的主要机制。
- 配置文件务必通过
vipw或vigr编辑。 - 系统账户应使用
/usr/sbin/nologin或/bin/false,且UID小于1000。
— Editorial Team
暂无评论。