返回首页

Linux 用户 UID GID 组管理

文章详解 Linux 中通过 UID/GID 的用户识别、访问模型、文件 /etc/passwd shadow group。命令 id getent useradd vipw 用于诊断和账户管理。

Linux 用户管理:UID 组 useradd
Advertisement 728x90

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 → 所有者? → 组? → 其他人。第一个匹配项决定访问权限。

Google AdInline article slot

示例:

ls -la /var/log/nginx/
# -rw-r----- 1 www-data adm 187234 Mar 26 10:41 access.log

所有者是 www-data,组是 adm。以 www-data 身份运行的进程将获得所有者级别的访问权限,忽略其组成员身份。

UID范围:

Google AdInline article slot
  • 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 中。

Google AdInline article slot

检查成员资格:

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/useradduseradd 的默认参数
  • /etc/profile.d/*.sh:登录时执行的环境脚本
  • /etc/login.defs:umask、UID范围等设置

核心要点:

  • UID控制访问权限,而非用户名。
  • 使用 getent 进行NSS感知查询,而非 cat /etc/passwd
  • 组是委派权限的主要机制。
  • 配置文件务必通过 vipwvigr 编辑。
  • 系统账户应使用 /usr/sbin/nologin/bin/false,且UID小于1000。

— Editorial Team

Advertisement 728x90

继续阅读