用户和组管理

title

用户和组管理是Linux系统管理的基础,涉及用户账户创建、权限分配、安全配置等多个方面。

用户管理基础

添加用户

# 创建新用户
useradd username

# 创建用户并指定主目录
useradd -m -d /home/username username

# 创建用户并指定shell
useradd -s /bin/bash username

# 创建系统用户
useradd -r username

# 创建用户时指定UID
useradd -u 1001 username

# 创建用户并指定初始组
useradd -g primarygroup username

# 创建用户并指定附加组
useradd -G group1,group2 username

# 创建用户的完整示例
useradd -m -s /bin/bash -c "Full Name" -G wheel,users username

修改用户

# 修改用户密码
passwd username

# 修改用户信息
usermod -c "Full Name" username

# 修改用户主目录
usermod -d /new/home/path -m username

# 修改用户shell
usermod -s /bin/zsh username

# 锁定/解锁用户
usermod -L username    # 锁定
usermod -U username    # 解锁

# 修改用户UID
usermod -u 1002 username

# 添加用户到组
usermod -a -G groupname username

# 设置用户过期时间
usermod -e 2024-12-31 username

# 设置密码过期时间
usermod -f 30 username

删除用户

# 删除用户
userdel username

# 删除用户及其主目录
userdel -r username

# 强制删除用户
userdel -f username

组管理

创建和管理组

# 创建组
groupadd groupname

# 创建组并指定GID
groupadd -g 1001 groupname

# 创建系统组
groupadd -r groupname

# 修改组名
groupmod -n newname oldname

# 修改组GID
groupmod -g 1002 groupname

# 删除组
groupdel groupname

# 查看用户所属组
groups username
id username

# 查看组成员
getent group groupname

组成员管理

# 添加用户到组
gpasswd -a username groupname

# 从组中删除用户
gpasswd -d username groupname

# 设置组管理员
gpasswd -A admin_user groupname

# 设置组密码
gpasswd groupname

# 清空组成员
gpasswd -M "" groupname

# 批量设置组成员
gpasswd -M user1,user2,user3 groupname

高级权限管理

sudo配置

# 安全编辑sudoers文件
visudo

# 常用sudo配置示例
# 允许用户执行所有命令
username ALL=(ALL:ALL) ALL

# 允许组成员执行所有命令
%groupname ALL=(ALL:ALL) ALL

# 免密码执行特定命令
username ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx

# 限制命令执行
username ALL=(ALL) /bin/ls, /bin/cat, /usr/bin/tail

# 允许以特定用户身份执行
username ALL=(apache) /usr/bin/php

# 设置环境变量保持
username ALL=(ALL) SETENV: ALL

# 时间限制
Defaults timestamp_timeout=5

# 日志记录
Defaults logfile="/var/log/sudo.log"

ACL(访问控制列表)

# 检查文件ACL支持
getfacl filename

# 设置用户ACL权限
setfacl -m u:username:rwx filename

# 设置组ACL权限
setfacl -m g:groupname:r-x filename

# 设置默认ACL
setfacl -d -m u:username:rwx directory/

# 递归设置ACL
setfacl -R -m u:username:rwx directory/

# 删除特定ACL
setfacl -x u:username filename

# 清除所有ACL
setfacl -b filename

# 复制ACL权限
getfacl source_file | setfacl --set-file=- target_file

特殊权限

# 设置SUID权限
chmod 4755 filename
chmod u+s filename

# 设置SGID权限
chmod 2755 filename
chmod g+s filename

# 设置粘滞位
chmod 1755 directory/
chmod +t directory/

# 查找特殊权限文件
find / -perm -4000 -type f 2>/dev/null    # SUID文件
find / -perm -2000 -type f 2>/dev/null    # SGID文件
find / -perm -1000 -type d 2>/dev/null    # 粘滞位目录

用户环境配置

环境变量文件

# 全局环境变量
/etc/profile          # 所有用户登录时执行
/etc/environment      # 系统环境变量
/etc/bash.bashrc      # 所有bash用户

# 用户环境变量
~/.bashrc            # bash用户配置
~/.profile           # 用户登录配置
~/.bash_profile      # bash登录配置
~/.bash_logout       # 用户登出配置

环境变量管理

# 查看环境变量
env
printenv
set

# 查看特定环境变量
echo $PATH
printenv PATH

# 设置临时环境变量
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk
export PATH=$PATH:/new/path

# 永久设置环境变量(添加到.bashrc)
echo 'export JAVA_HOME=/usr/lib/jvm/java-8-openjdk' >> ~/.bashrc
echo 'export PATH=$PATH:/new/path' >> ~/.bashrc
source ~/.bashrc

# 系统级环境变量
echo 'JAVA_HOME="/usr/lib/jvm/java-8-openjdk"' >> /etc/environment

用户配置模板

# 创建用户模板目录
mkdir -p /etc/skel/.config

# 默认bashrc模板
cat > /etc/skel/.bashrc << 'EOF'
# User specific aliases and functions
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Custom prompt
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

# History settings
HISTCONTROL=ignoredups:ignorespace
HISTSIZE=1000
HISTFILESIZE=2000
EOF

# 默认vimrc模板
cat > /etc/skel/.vimrc << 'EOF'
set number
set tabstop=4
set shiftwidth=4
set expandtab
syntax on
EOF

用户监控和审计

用户活动监控

# 查看当前登录用户
who
w
users

# 查看用户登录历史
last username
last -n 10

# 查看失败的登录尝试
lastb
last -f /var/log/btmp

# 查看用户最后登录时间
lastlog
lastlog -u username

# 实时监控用户登录
watch -n 1 'who'

# 查看用户进程
ps aux | grep username
pgrep -u username

用户审计配置

# 启用审计服务
systemctl enable auditd
systemctl start auditd

# 审计规则示例
auditctl -w /etc/passwd -p wa -k user_management
auditctl -w /etc/group -p wa -k group_management
auditctl -w /etc/sudoers -p wa -k sudo_changes

# 查看审计日志
ausearch -k user_management
ausearch -u username
ausearch -ts today

# 生成审计报告
aureport -u
aureport -x

登录安全监控

# 配置登录失败锁定(PAM)
# 编辑 /etc/pam.d/common-auth
auth    required    pam_tally2.so deny=5 unlock_time=600

# 查看失败登录计数
pam_tally2 --user username

# 重置失败计数
pam_tally2 --user username --reset

# 监控SSH登录
tail -f /var/log/auth.log | grep ssh

# 分析登录模式
awk '/Failed password/ {print $11}' /var/log/auth.log | sort | uniq -c | sort -nr

密码策略配置

密码复杂度要求

# 安装密码质量检查库
apt install libpam-pwquality    # Ubuntu/Debian
yum install libpwquality        # CentOS/RHEL

# 配置密码策略 /etc/security/pwquality.conf
minlen = 8              # 最小长度
dcredit = -1            # 至少一个数字
ucredit = -1            # 至少一个大写字母
lcredit = -1            # 至少一个小写字母
ocredit = -1            # 至少一个特殊字符
minclass = 3            # 至少3种字符类型
maxrepeat = 2           # 最大重复字符数

密码有效期管理

# 设置密码有效期
chage -M 90 username        # 密码90天过期
chage -m 7 username         # 密码最少使用7天
chage -W 7 username         # 过期前7天警告
chage -I 7 username         # 过期后7天禁用账户

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

# 查看用户密码信息
chage -l username

# 批量设置密码策略
for user in user1 user2 user3; do
    chage -M 90 -m 7 -W 7 $user
done

PAM配置

PAM模块配置

# 主要PAM配置文件
/etc/pam.d/common-auth       # 认证配置
/etc/pam.d/common-account    # 账户配置
/etc/pam.d/common-password   # 密码配置
/etc/pam.d/common-session    # 会话配置

# SSH PAM配置示例 /etc/pam.d/sshd
auth       required     pam_sepermit.so
auth       required     pam_unix.so
account    required     pam_nologin.so
account    required     pam_unix.so
password   required     pam_unix.so sha512
session    required     pam_unix.so

限制用户资源

# 配置用户资源限制 /etc/security/limits.conf
username    soft    nproc       1000
username    hard    nproc       2000
username    soft    nofile      4096
username    hard    nofile      8192
@users      soft    cpu         60
@users      hard    cpu         120

# 动态查看和设置限制
ulimit -a                # 查看当前限制
ulimit -n 4096          # 设置文件描述符限制
ulimit -u 1000          # 设置进程数限制

批量用户管理

批量创建用户

#!/bin/bash
# batch_user_create.sh

USER_LIST="users.txt"  # 格式: username:fullname:group

while IFS=: read -r username fullname group; do
    # 检查用户是否已存在
    if id "$username" &>/dev/null; then
        echo "用户 $username 已存在"
        continue
    fi

    # 创建用户
    useradd -m -s /bin/bash -c "$fullname" -G "$group" "$username"

    # 设置临时密码
    temp_password=$(openssl rand -base64 8)
    echo "$username:$temp_password" | chpasswd

    # 强制首次登录修改密码
    chage -d 0 "$username"

    echo "创建用户 $username,临时密码: $temp_password"
done < "$USER_LIST"

批量删除用户

#!/bin/bash
# batch_user_delete.sh

USERS_TO_DELETE=("user1" "user2" "user3")

for username in "${USERS_TO_DELETE[@]}"; do
    if id "$username" &>/dev/null; then
        echo "删除用户: $username"

        # 终止用户进程
        pkill -u "$username"

        # 删除用户和主目录
        userdel -r "$username"

        echo "用户 $username 已删除"
    else
        echo "用户 $username 不存在"
    fi
done

用户信息查看和管理

详细用户信息

# 查看当前用户
whoami
id

# 查看用户详细信息
id username
getent passwd username
finger username

# 查看用户登录历史
last username
lastlog -u username

# 查看用户进程
ps -u username
pgrep -u username -l

# 查看用户文件
find /home -user username -type f

# 查看用户组信息
groups username
getent group

系统用户统计

# 统计系统用户数量
wc -l /etc/passwd

# 查看系统用户列表
awk -F: '$3 >= 1000 {print $1}' /etc/passwd

# 查看系统服务用户
awk -F: '$3 < 1000 && $3 > 0 {print $1}' /etc/passwd

# 查看有登录权限的用户
awk -F: '$7 != "/sbin/nologin" && $7 != "/bin/false" {print $1}' /etc/passwd

# 查看密码为空的用户
awk -F: '$2 == "" {print $1}' /etc/shadow

安全加固

用户安全策略

# 禁用不必要的系统用户登录
usermod -s /sbin/nologin username

# 设置账户自动锁定
usermod -f 30 username  # 30天不活动后锁定

# 设置密码强度要求
# 在 /etc/login.defs 中配置
PASS_MAX_DAYS   90
PASS_MIN_DAYS   7
PASS_MIN_LEN    8
PASS_WARN_AGE   7

# 限制su命令使用
# 编辑 /etc/pam.d/su
auth required pam_wheel.so use_uid

用户登录限制

# 限制用户登录时间 /etc/security/time.conf
login ; * ; users ; Al0800-1800

# 限制用户登录位置
# 编辑 /etc/security/access.conf
- : ALL EXCEPT root : ALL EXCEPT LOCAL

# 设置最大登录会话数
# 在 /etc/security/limits.conf 中
username    hard    maxlogins   2

故障排查

常见问题

# 用户无法登录
# 检查密码过期
chage -l username

# 检查账户锁定
passwd -S username

# 检查Shell设置
getent passwd username

# 检查主目录权限
ls -ld /home/username

# 重置用户密码
passwd username

# 解锁用户账户
usermod -U username
passwd -u username

# 检查用户组问题
groups username
id username

用户环境问题

# 修复用户环境
# 重建用户配置文件
cp /etc/skel/.bashrc /home/username/
cp /etc/skel/.profile /home/username/
chown username:username /home/username/.*

# 检查环境变量
su - username -c 'env'

# 检查PATH变量
su - username -c 'echo $PATH'

自动化脚本

用户管理监控脚本

#!/bin/bash
# user_monitor.sh

LOG_FILE="/var/log/user_monitor.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

# 检查新创建的用户
check_new_users() {
    local new_users=$(awk -F: -v "date=$(date -d '1 day ago' +%s)" '
        $3 >= 1000 && $3 < 65534 {
            cmd = "stat -c %Y /home/" $1
            cmd | getline mtime
            close(cmd)
            if (mtime > date) print $1
        }' /etc/passwd)

    if [ -n "$new_users" ]; then
        echo "[$DATE] 发现新用户: $new_users" >> $LOG_FILE
    fi
}

# 检查密码即将过期的用户
check_password_expiry() {
    local expiring_users=$(chage -l $(awk -F: '$3 >= 1000 {print $1}' /etc/passwd) 2>/dev/null | \
        awk '/Password expires/ {
            if ($4 != "never" && $4 != "password") {
                cmd = "date -d \"" $4 "\" +%s"
                cmd | getline exp_date
                close(cmd)
                cmd = "date -d \"+7 days\" +%s"
                cmd | getline warn_date
                close(cmd)
                if (exp_date <= warn_date) print $0
            }
        }')

    if [ -n "$expiring_users" ]; then
        echo "[$DATE] 密码即将过期的用户: $expiring_users" >> $LOG_FILE
    fi
}

# 检查长时间未登录的用户
check_inactive_users() {
    local inactive_users=$(lastlog | awk '
        NR > 1 && $2 != "**Never" {
            cmd = "date -d \"" $4 " " $5 " " $6 "\" +%s 2>/dev/null"
            cmd | getline last_login
            close(cmd)
            if (last_login != "" && last_login < systime() - 90*24*3600) {
                print $1
            }
        }')

    if [ -n "$inactive_users" ]; then
        echo "[$DATE] 长期未登录用户(>90天): $inactive_users" >> $LOG_FILE
    fi
}

# 执行检查
check_new_users
check_password_expiry
check_inactive_users

相关命令和工具

  • id - 显示用户和组ID信息
  • whoami - 显示当前用户名
  • su - 切换用户
  • sudo - 以其他用户身份执行命令
  • newgrp - 切换到新的组
  • getent - 查询系统数据库
  • finger - 显示用户信息
  • chfn - 修改用户信息
  • chsh - 修改用户shell

用户和组管理是Linux系统安全的基础,正确的用户管理策略可以有效保护系统安全,提高系统的可管理性。


powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:47:16

results matching ""

    No results matching ""