Linux 用户

Linux 用户与组管理详解

一、核心配置文件

1.1 用户相关配置文件

/etc/passwd     # 用户账户信息
/etc/shadow     # 用户密码信息(加密)
/etc/login.defs # 用户创建的默认设置
/etc/default/useradd # useradd命令的默认值
/etc/skel/      # 新用户的家目录模板

1.2 组相关配置文件

/etc/group      # 组账户信息
/etc/gshadow    # 组密码信息

二、用户管理命令

2.1 用户创建与删除

useradd - 创建用户

# 基本用法
useradd [选项] 用户名

# 常用选项
useradd -m username          # 创建用户并建立家目录
useradd -u 1001 username     # 指定UID
useradd -g users username    # 指定主组
useradd -G wheel,dev username # 指定附加组
useradd -s /bin/bash username # 指定shell
useradd -d /home/custom username # 指定家目录路径
useradd -c "用户描述" username # 添加描述信息

# 查看默认设置
useradd -D

adduser - 交互式创建用户(部分发行版)

adduser username  # 交互式创建,会提示输入密码等信息

userdel - 删除用户

userdel username          # 删除用户但保留家目录
userdel -r username       # 删除用户同时删除家目录和邮件
userdel -f username       # 强制删除(即使用户已登录)

2.2 用户修改

usermod - 修改用户属性

# 修改用户信息
usermod -c "新描述" username      # 修改描述
usermod -d /new/home username     # 修改家目录
usermod -m -d /new/home username  # 移动家目录到新位置
usermod -s /bin/zsh username      # 修改shell
usermod -L username               # 锁定账户
usermod -U username               # 解锁账户

# 修改组关系
usermod -g newgroup username      # 修改主组
usermod -G group1,group2 username # 修改附加组(覆盖原有)
usermod -aG groupname username    # 追加附加组(推荐方式)
usermod -l newname oldname        # 修改用户名
usermod -u 新UID username         # 修改UID

chage - 修改密码过期信息

chage -l username                 # 查看密码过期信息
chage -M 90 username              # 设置密码有效天数
chage -d 0 username               # 强制下次登录修改密码
chage -E "2024-12-31" username    # 设置账户过期时间
chage -m 7 username               # 设置密码最短使用天数
chage -W 14 username              # 密码过期前警告天数

2.3 密码管理

passwd - 密码管理

passwd username           # 为用户设置密码(root权限)
passwd                    # 修改当前用户密码
passwd -l username        # 锁定用户密码
passwd -u username        # 解锁用户密码
passwd -d username        # 删除用户密码
passwd -S username        # 查看密码状态
passwd -e username        # 强制用户下次登录修改密码

三、组管理命令

3.1 组创建与删除

# 创建组
groupadd groupname
groupadd -g 1005 groupname  # 指定GID
groupadd -r groupname       # 创建系统组(GID<1000)

# 删除组
groupdel groupname          # 删除组(组不能是用户的主组)

3.2 组修改

groupmod -n newname oldname    # 修改组名
groupmod -g 新GID groupname    # 修改GID

四、用户信息查看

4.1 查看用户信息

id username                    # 显示用户UID、GID和组信息
id -u username                 # 只显示UID
id -g username                 # 只显示主组GID
id -Gn username                # 显示用户所在的所有组

whoami                         # 显示当前用户名
who                            # 显示已登录用户
w                              # 显示已登录用户及活动
last                           # 显示用户登录历史
lastlog                        # 显示所有用户最后登录时间

4.2 查看配置文件内容

cat /etc/passwd               # 查看所有用户
cat /etc/group                # 查看所有组
cat /etc/shadow               # 查看密码信息(需root)

五、特殊权限管理

5.1 sudo权限配置

# 编辑sudoers文件(使用visudo命令)
visudo

# sudoers文件示例配置
# 允许wheel组的所有权限
%wheel  ALL=(ALL)       ALL

# 允许用户执行特定命令
username  ALL=(ALL)     /usr/bin/systemctl, /usr/bin/apt

# 无需密码执行
username  ALL=(ALL)     NOPASSWD: ALL

5.2 切换用户

su username          # 切换用户(保留环境变量)
su - username        # 切换用户(加载目标用户环境)
sudo -u username command  # 以指定用户执行命令

六、用户配置文件详解

6.1 /etc/passwd 文件格式

username:x:UID:GID:描述:家目录:shell
字段说明:
1. 用户名
2. 密码占位符(x表示密码在/etc/shadow)
3. UID(用户ID)
4. GID(主组ID)
5. 用户描述信息
6. 家目录路径
7. 登录shell

6.2 /etc/shadow 文件格式

username:加密密码:最后修改:最小天数:最大天数:警告期:失效期:保留
字段说明:
1. 用户名
2. 加密密码(!或*表示锁定)
3. 最后修改时间(1970-1-1至今的天数)
4. 密码最小使用天数
5. 密码最大使用天数
6. 密码过期前警告天数
7. 密码过期后账户失效天数
8. 账户失效日期(1970-1-1至今的天数)
9. 保留字段

6.3 /etc/group 文件格式

组名:组密码:GID:组成员

七、UID和GID范围

范围 用途 说明
0 root用户 超级管理员
1-999 系统用户 系统服务使用的用户
1000-60000 普通用户 手动创建的用户
65534 nobody用户 无特权用户

八、实用脚本示例

8.1 批量创建用户

#!/bin/bash
# batch_create_users.sh

USER_LIST="user1 user2 user3"
DEFAULT_PASS="ChangeMe123!"

for USER in $USER_LIST; do
    # 创建用户
    useradd -m -s /bin/bash -c "批量创建用户" $USER
    
    # 设置初始密码
    echo "$USER:$DEFAULT_PASS" | chpasswd
    
    # 强制首次登录修改密码
    chage -d 0 $USER
    
    echo "用户 $USER 创建成功"
done

8.2 检查系统用户

#!/bin/bash
# check_system_users.sh

echo "=== 系统用户检查 ==="
echo "1. 空密码用户:"
awk -F: '($2 == "") {print $1}' /etc/shadow

echo -e "\n2. UID为0的用户:"
awk -F: '($3 == 0) {print $1}' /etc/passwd

echo -e "\n3. 无家目录的用户:"
awk -F: '($6 == "" || $6 == "/") {print $1}' /etc/passwd

echo -e "\n4. 无效shell的用户:"
awk -F: '($7 == "/bin/false" || $7 == "/usr/sbin/nologin") {print $1}' /etc/passwd

8.3 迁移用户到新系统

#!/bin/bash
# migrate_user.sh

OLD_USER="olduser"
NEW_USER="newuser"

# 1. 创建用户(保持相同UID/GID)
OLD_UID=$(id -u $OLD_USER)
OLD_GID=$(id -g $OLD_USER)

useradd -u $OLD_UID -g $OLD_GID -m -d /home/$NEW_USER $NEW_USER

# 2. 复制家目录内容
cp -ra /home/$OLD_USER/. /home/$NEW_USER/

# 3. 设置正确的权限
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER

# 4. 迁移cron任务
crontab -u $OLD_USER -l | crontab -u $NEW_USER -

echo "用户 $OLD_USER 已迁移到 $NEW_USER"

九、安全最佳实践

9.1 账户安全策略

# 设置密码策略
# 编辑 /etc/pam.d/common-password
# 添加:password requisite pam_pwquality.so retry=3 minlen=12 difok=3

# 编辑 /etc/login.defs
PASS_MAX_DAYS   90      # 密码最大使用天数
PASS_MIN_DAYS   7       # 密码最小使用天数
PASS_WARN_AGE   14      # 密码过期前警告天数
LOGIN_RETRIES   5       # 登录重试次数
LOGIN_TIMEOUT   60      # 登录超时时间

9.2 审计与监控

# 查看失败登录尝试
lastb

# 查看授权日志
grep "Failed password" /var/log/auth.log
grep "Accepted password" /var/log/auth.log

# 检查空密码账户
awk -F: '($2 == "") {print $1}' /etc/shadow

十、故障排查

10.1 常见问题及解决

问题1:用户无法登录

# 检查账户状态
passwd -S username
# 解锁账户
usermod -U username
# 重置密码
passwd username

问题2:权限不足

# 检查用户所在组
id username
# 添加到所需组
usermod -aG groupname username

问题3:家目录权限错误

# 修复家目录权限
chown -R username:username /home/username
chmod 700 /home/username

十一、相关命令速查表

命令 功能 常用选项
useradd 创建用户 -m, -s, -g, -G, -u
usermod 修改用户 -L, -U, -aG, -d, -s
userdel 删除用户 -r, -f
groupadd 创建组 -g, -r
groupmod 修改组 -n, -g
groupdel 删除组
passwd 密码管理 -l, -u, -d, -S
chage 密码过期 -l, -M, -E, -W
id 用户信息 -u, -g, -Gn
su 切换用户 -, -c
sudo 提权执行 -u, -l

注意

  1. 使用 visudo 而不是直接编辑 /etc/sudoers 文件
  2. 谨慎使用 userdel -r,会删除用户所有数据
  3. 定期审计系统账户和权限
  4. 遵循最小权限原则分配sudo权限