👥 第07课:用户与组管理

阶段二:用户与进程 第1/6课

📚 课程目标

一、用户与组基础

1.1 用户分类

类型UID范围说明
超级用户0root,拥有全部权限
系统用户1-999服务进程使用,不允许登录
普通用户1000+实际用户,受限权限

1.2 组分类

二、核心配置文件

2.1 /etc/passwd — 用户信息

# 格式:用户名:密码占位:UID:GID:注释:家目录:Shell
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
user1:x:1000:1000:User One:/home/user1:/bin/bash
$ cat /etc/passwd | head -10
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

📋 /etc/passwd字段详解

字段说明示例
用户名登录名,1-32字符root
密码x表示存在shadow文件中x
UID用户ID号0
GID主组ID号0
注释GECOS,用户描述信息root
家目录用户登录后的初始目录/root
Shell登录Shell,/sbin/nologin禁止登录/bin/bash

2.2 /etc/shadow — 密码信息

# 格式:用户名:加密密码:最后修改:最小间隔:最大有效期:警告:不活动:过期日期:保留
root:$6$salt$hash:19000:0:99999:7:::
$ sudo cat /etc/shadow 2>/dev/null | head -5
root:!*:20512:0:99999:7:::
daemon:*:19836:0:99999:7:::
bin:*:19836:0:99999:7:::
sys:*:19836:0:99999:7:::
sync:*:19836:0:99999:7:::

📋 密码加密算法标识

前缀算法安全性
$1$MD5❌ 已破解
$5$SHA-256⚠️ 不推荐
$6$SHA-512✅ 推荐
$y$yescrypt✅ 最新推荐

2.3 /etc/group — 组信息

$ cat /etc/group | head -10
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,ubuntu
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:

三、用户管理命令

3.1 useradd — 创建用户

# 基本创建
sudo useradd username

# 完整创建(推荐)
sudo useradd -m -s /bin/bash -c "Zhang San" -G sudo,docker zhangsan
# -m: 创建家目录
# -s: 指定Shell
# -c: 注释信息
# -G: 附加组

# 指定UID和主组
sudo useradd -u 2000 -g developers -m wangwu

# 设置密码
sudo passwd zhangsan

# 使用adduser(Debian/Ubuntu交互式创建)
sudo adduser zhangsan
$ which useradd; which adduser
N/A

3.2 usermod — 修改用户

# 修改注释
sudo usermod -c "New Name" username

# 添加附加组
sudo usermod -aG docker username   # -a: 追加,不加会覆盖

# 修改主组
sudo usermod -g newgroup username

# 修改Shell
sudo usermod -s /bin/zsh username

# 锁定/解锁账户
sudo usermod -L username   # 锁定
sudo usermod -U username   # 解锁

# 修改家目录(移动旧目录)
sudo usermod -d /new/home -m username

3.3 userdel — 删除用户

# 删除用户(保留家目录)
sudo userdel username

# 删除用户及家目录
sudo userdel -r username

# 查找用户拥有的文件
sudo find / -user username 2>/dev/null

四、组管理命令

# 创建组
sudo groupadd developers
sudo groupadd -g 2000 testers    # 指定GID

# 修改组
sudo groupmod -n devteam developers   # 改名
sudo groupmod -g 2001 testers         # 改GID

# 删除组
sudo groupdel devteam

# 查看用户所属组
groups username
id username
$ id
uid=0(root) gid=0(root) groups=0(root)

五、用户切换与sudo

5.1 su命令

# 切换到root
su -         # 完整环境(推荐)
su           # 仅切换用户,保留当前环境

# 切换到其他用户
su - username

# 以root执行单个命令
su -c "command"

5.2 sudo配置

# 编辑sudoers(必须用visudo!)
sudo visudo

# 常见配置
# 用户级别
username ALL=(ALL:ALL) ALL          # 完全sudo权限
username ALL=(ALL) NOPASSWD:ALL     # 免密sudo

# 组级别
%sudo  ALL=(ALL:ALL) ALL            # sudo组
%docker ALL=(ALL) NOPASSWD: /usr/bin/docker  # 限制命令

# /etc/sudoers.d/ 目录(推荐方式)
echo "username ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/username
sudo chmod 440 /etc/sudoers.d/username
永远不要直接编辑/etc/sudoers文件!使用visudo命令,它会检查语法错误,防止配置错误导致无法sudo。

六、/etc/login.defs — 用户创建默认配置

$ cat /etc/login.defs | grep -v '^#' | grep -v '^$' | head -20
MAIL_DIR        /var/mail
FAILLOG_ENAB		yes
LOG_UNKFAIL_ENAB	no
LOG_OK_LOGINS		no
SYSLOG_SU_ENAB		yes
SYSLOG_SG_ENAB		yes
FTMP_FILE	/var/log/btmp
SU_NAME		su
HUSHLOGIN_FILE	.hushlogin
ENV_SUPATH	PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH	PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
TTYGROUP	tty
TTYPERM		0600
ERASECHAR	0177
KILLCHAR	025
UMASK		022
HOME_MODE	0750
PASS_MAX_DAYS	99999
PASS_MIN_DAYS	0
PASS_WARN_AGE	7

七、/etc/skel — 家目录模板

$ ls -la /etc/skel
total 28
drwxr-xr-x   2 root root  4096 Apr 23  2024 .
drwxr-xr-x 130 root root 12288 May 19 21:32 ..
-rw-r--r--   1 root root   220 Mar 31  2024 .bash_logout
-rw-r--r--   1 root root  3771 Mar 31  2024 .bashrc
-rw-r--r--   1 root root   807 Mar 31  2024 .profile

/etc/skel目录的内容会在创建用户时(使用-m选项)自动复制到用户家目录。可以在此放置默认配置文件。

八、故障排查

❌ 问题:用户无法登录

# 1. 检查账户是否被锁定
sudo passwd -S username

# 2. 检查Shell是否正确
grep username /etc/passwd

# 3. 检查密码是否过期
sudo chage -l username

# 4. 检查是否在登录限制文件中
grep username /etc/security/access.conf 2>/dev/null

# 5. 查看登录日志
sudo journalctl -u sshd | grep username
sudo lastb | grep username    # 失败的登录

❌ 问题:sudo报"user not in sudoers"

# 需要root权限修复
su -
visudo
# 添加: username ALL=(ALL:ALL) ALL

# 或使用pkexec(桌面环境)
pkexec visudo

九、批量用户管理

# 批量创建用户脚本
#!/bin/bash
# create-users.sh
while read username fullname; do
    sudo useradd -m -s /bin/bash -c "$fullname" "$username"
    echo "$username:ChangeMe123!" | sudo chpasswd
    sudo passwd -e "$username"   # 强制首次登录修改密码
    echo "Created user: $username"
done << userlist.txt
zhangsan 张三
lisi 李四
wangwu 王五
userlist.txt

# 批量删除
cut -d: -f1 userlist.txt | while read user; do
    sudo userdel -r "$user" 2>/dev/null
done

十、练习

📝 练习1:创建与管理用户

# 1. 创建用户dev1,附加组sudo和docker
sudo useradd -m -s /bin/bash -G sudo,docker dev1
sudo passwd dev1

# 2. 创建用户dev2
sudo useradd -m -s /bin/bash dev2

# 3. 创建组developers
sudo groupadd developers

# 4. 将dev1和dev2加入developers
sudo usermod -aG developers dev1
sudo usermod -aG developers dev2

# 5. 验证
id dev1
id dev2
groups dev1

# 6. 清理
sudo userdel -r dev1
sudo userdel -r dev2
sudo groupdel developers
🏆

成就解锁:用户管理员

✅ 理解用户/组分类与UID/GID

✅ 掌握用户增删改查命令

✅ 理解passwd/shadow/group文件

✅ 学会sudo配置与用户切换

十一、LDAP与集中用户管理

企业环境通常使用LDAP(OpenLDAP/389 DS)或AD(Active Directory)集中管理用户,而非在每台服务器上手动创建。

# 安装LDAP客户端
sudo apt install libpam-ldapd nscd

# 配置/etc/nslcd.conf
uri ldap://ldap.example.com
base dc=example,dc=com

# 配置NSS
# /etc/nsswitch.conf
passwd: files ldap
group: files ldap
shadow: files ldap

# 配置PAM自动创建家目录
# /etc/pam.d/common-session
session optional pam_mkhomedir.so skel=/etc/skel umask=077

📋 本地用户 vs LDAP用户对比

特性本地用户LDAP用户
存储位置/etc/passwdLDAP目录
管理方式逐台服务器集中管理
适用规模<50台服务器任意规模
单点登录
依赖LDAP服务器可用

十二、密码安全管理

# 密码策略设置
# 修改密码过期策略
sudo chage -M 90 username     # 90天后过期
sudo chage -m 7 username      # 最少7天才能改密码
sudo chage -W 14 username     # 提前14天警告
sudo chage -l username        # 查看策略

# 锁定/解锁账户
sudo passwd -l username       # 锁定
sudo passwd -u username       # 解锁
sudo usermod -L username      # 锁定(另一种方式)
sudo usermod -U username      # 解锁

# 强制下次登录修改密码
sudo passwd -e username
sudo chage -d 0 username