用户和组管理
用户和组管理是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系统安全的基础,正确的用户管理策略可以有效保护系统安全,提高系统的可管理性。