【Linux日新月异(二)】CentOS 7用户与用户组管理深度指南:保障系统安全的基石
🌌提供:
1. Kimi K2 Thinking(网站: 大语言模型(Large Language Model, LLM),是当前人工智能领域的重要技术分支,专注于自然语言处理和生成任务。)【开源】「AL」〖✿✿✿✿✿〗
🔔说明: 本文内容由Kimi K2生成。AI创作虽经校对,仍难免疏漏或偏颇之处。若您发现错漏、或有任何建议,恳请不吝赐教。您的每一次指正,都是我改进与成长的重要指引。
📓摘要:
略...(有好建议的可以留言哦~~~(✿◕‿◕✿))
👥 CentOS 7用户与用户组管理深度指南
Linux是多用户多任务操作系统,用户管理是系统安全的基石!CentOS 7提供了一套完整的用户/组管理命令,配合
/etc/passwd、/etc/shadow等配置文件,构建起强大的权限隔离体系!
一、👤 用户管理核心命令
1.useradd- 创建用户 ⭐
语法:
useradd [选项] 用户名
核心选项:
-u UID:指定用户ID(默认自增)-g GID/组名:指定主组-G 组1,组2:指定附加组-d 家目录:自定义家目录路径-s Shell:指定登录Shell(如/bin/bash,/sbin/nologin)-m:自动创建家目录(默认)-M:不创建家目录(系统用户常用)-c "描述":添加用户说明-e YYYY-MM-DD:设置账户过期日期
案例1:创建普通用户
# 创建用户testuser,使用默认设置
useradd testuser
# 系统会:
# 1. 创建用户testuser(UID≥1000)
# 2. 创建同名主组testuser(GID=UID)
# 3. 创建家目录/home/testuser
# 4. 从/etc/skel复制默认配置文件
# 5. 在/etc/passwd、/etc/shadow添加记录
案例2:创建系统用户
# 创建无法登录的系统用户(如运行服务)
useradd -r -s /sbin/nologin -M nginx
# -r:系统用户(UID<1000)
# -s /sbin/nologin:禁止登录
# -M:不创建家目录
案例3:指定UID和组
# 先创建组
groupadd -g 1005 developers# 创建用户并指定属性
useradd -u 1050 -g developers -G wheel,devops \-d /home/testuser01 -s /bin/bash \-c "DevOps Engineer" -e 2025-12-31 testuser01# 查看结果
id testuser01
# uid=1050(testuser01) gid=1005(developers) groups=1005(developers),10(wheel),1006(devops)
⚠️ 注意事项:
- 🔥UID冲突:检查UID是否已存在
cat /etc/passwd | cut -d: -f3 | sort -n - 组不存在:
-g指定的组必须存在,否则会报错 - 家目录权限:自动创建的家目录权限默认700(仅所有者可读写执行)
- 配置文件:默认从
/etc/skel复制,可自定义用户模板 - 密码未设置:新建用户默认无密码,需用
passwd设置
2.passwd- 设置/修改密码
语法:
passwd [选项] [用户名]
核心选项:
无选项:修改当前用户密码用户名:修改指定用户密码(需root)-l:锁定用户(Lock)-u:解锁用户(Unlock)-d:删除密码(无密码登录,⚠️危险)-e:强制下次登录修改密码-S:查看密码状态--stdin:从标准输入接收密码(脚本自动化)
案例1:交互式设置密码
# root用户为testuser设置密码
passwd testuser
# 输入:New password:
# 输入:Retype new password:
案例2:非交互式设置(脚本必备)
# 方法1:使用--stdin(推荐)
echo "Temp@123456" | passwd --stdin testuser# 方法2:chpasswd(批量)
echo "testuser:Temp@123456" | chpasswd# 方法3:批量修改(从文件)
cat users.txt | chpasswd
# users.txt格式:user1:pass1\nuser2:pass2
案例3:密码策略管理
# 查看密码状态
passwd -S testuser
# 输出:testuser PS 2024-11-15 0 99999 7 -1 (Password set, SHA512 crypt.)# 锁定用户(立即禁用)
passwd -l testuser
# 锁定后,/etc/shadow密码前会加!!# 解锁用户
passwd -u testuser
⚠️ 注意事项:
- 🔥密码复杂度:CentOS 7默认启用
pam_pwquality模块,密码需符合复杂度要求 - 禁用用户:锁定用户用
passwd -l,不要直接修改/etc/shadow - root特权:普通用户只能改自己密码,root可改任何人
- 密码安全:避免在命令行明文写密码(history可查看),用
read -s更安全 - 加密方式:CentOS 7默认SHA512,可通过
authconfig --passalgo修改
3.usermod- 修改用户属性
语法:
usermod [选项] 用户名
核心选项:(大部分与useradd对应)
-u UID:修改用户ID-g 组:修改主组-G 组1,组2:重置附加组-aG 组1,组2:追加附加组(常用!)-d 新家目录:修改家目录路径-m:移动家目录内容到新家-s Shell:修改登录Shell-L:锁定用户(类似passwd -l)-U:解锁用户-e YYYY-MM-DD:修改账户过期日-c "新描述":修改说明
案例1:追加用户到附加组
# 将testuser添加到wheel组(sudo权限)
usermod -aG wheel testuser# 追加多个组(用逗号分隔,无空格)
usermod -aG devops,docker,kubernetes testuser# 查看结果
id testuser
groups testuser
案例2:修改家目录
# 修改家目录并移动内容
usermod -d /home/newtestuser -m testuser
# -m必须加,否则旧家目录内容不迁移!
案例3:锁定/解锁用户
# 临时禁用用户(离职员工)
usermod -L testuser# 重新启用
usermod -U testuser
⚠️ 注意事项:
- 🔥
-Gvs-aG:-G会覆盖原有附加组,-aG才是追加! - 主组修改:
-g指定的组必须存在,用户会被移出新组 - 家目录移动:
-m只能在-d后使用,确保数据完整迁移 - 用户登录时:不能修改当前登录用户的属性,需先退出
4.userdel- 删除用户
语法:
userdel [选项] 用户名
核心选项:
无选项:仅删除用户,保留家目录和邮件-r:递归删除家目录和邮件池(⚠️危险!)-f:强制删除(即使用户已登录)
案例1:安全删除(保留数据)
# 仅删除用户,家目录保留(后续手动处理)
userdel testuser
# 家目录变成无主之目录,需手动删除或 chown -R 新用户
案例2:彻底删除(⚠️高危)
# 删除用户并清理所有数据
userdel -r testuser
# 删除内容:
# 1. /etc/passwd, /etc/shadow记录
# 2. /home/testuser家目录
# 3. /var/spool/mail/testuser邮件
⚠️ 注意事项:
- 🔥备份数据:执行
-r前,务必备份/home/username重要数据 - 用户进程:删除前确保用户无运行进程
ps -u username - 文件归属:删除后,该用户创建的文件会变成数字UID,需手动清理
- 主组问题:如果用户主组是私有组(同名),组不会被自动删除
- 生产环境:建议先
passwd -l锁定,观察30天后再删除
5.id- 查看用户身份信息
语法:
id [选项] [用户名]
案例:
# 查看当前用户
id
# uid=1000(testuser) gid=1000(testuser) groups=1000(testuser),10(wheel)# 查看指定用户
id root
# uid=0(root) gid=0(root) groups=0(root)# 只显示UID
id -u testuser # 输出:1000# 只显示所有组(空格分隔)
id -G testuser # 输出:1000 10
6.whoami/who/ w / last - 用户登录信息
whoami # 当前用户(简单)
# 输出:testuserwho # 当前登录的用户、终端、登录时间
# 输出:
# testuser pts/0 2024-11-15 10:30 (192.168.1.100)
# root pts/1 2024-11-15 11:00 (192.168.1.101)w # 更详细(含负载、进程)
# 输出:
# 11:05:30 up 2 days, 3:20, 2 users, load average: 0.10, 0.05, 0.01
# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
# testuser pts/0 192.168.1.100 10:30 0.00s 0.12s 0.00s bash
# root pts/1 192.168.1.101 11:00 2:30 0.08s 0.08s sshdlast # 查看登录历史(读取/var/log/wtmp)
# 输出:
# testuser pts/0 192.168.1.100 Fri Nov 15 10:30 still logged in
# root pts/1 192.168.1.101 Fri Nov 15 11:00 - 11:05 (00:05)lastlog # 查看所有用户最后登录时间
# 用户 端口 来自 最后登录时间
# root pts/1 192.168.1.101 五 11月 15 11:00:01 +0800 2024
# testuser pts/0 192.168.1.100 五 11月 15 10:30:22 +0800 2024
# nginx **从未登录过**
7.su/sudo- 切换用户与提权
su语法:
su [选项] [用户名]
sudo语法:
sudo [选项] 命令
案例1:su切换用户
# 切换到root(需输入root密码)
su -
# 或
su - root# 切换到testuser(进入其环境)
su - testuser# 不切换环境变量(当前环境)
su testuser# 执行单条命令
su -c "yum update" root
案例2:sudo提权(推荐!)
# 配置sudo权限(root执行)
visudo
# 或
nano /etc/sudoers
# 添加:
testuser ALL=(ALL) ALL
# 或免密码:
testuser ALL=(ALL) NOPASSWD:ALL# 使用sudo
sudo yum install nginx
sudo systemctl restart nginx# 切换到root shell
sudo -i
# 或
sudo su -# 查看sudo权限
sudo -l
⚠️ 注意事项:
- 🔥su vs sudo:
- su:知道root密码,完全切换
- sudo:使用自己密码,可审计,更安全!
- wheel组:CentOS中wheel组成员默认有sudo权限
- sudo日志:所有sudo操作记录在
/var/log/secure - 默认禁止:安装后默认只有root能sudo,需手动配置
二、👥 用户组管理命令
1.groupadd- 创建用户组
语法:
groupadd [选项] 组名
核心选项:
-g GID:指定组ID-r:创建系统组(GID<1000)
案例:
# 创建普通组
groupadd developers# 创建指定GID的组
groupadd -g 2000 devops# 创建系统组
groupadd -r docker
2.groupmod- 修改组属性
语法:
groupmod [选项] 组名
核心选项:
-g 新GID:修改组ID-n 新组名:修改组名
案例:
# 修改组名(慎用,可能影响权限)
groupmod -n newdev developers# 修改GID
groupmod -g 3000 newdev
⚠️ 注意事项:
- 🔥组名修改:如果文件系统使用组名授权(如ACL),需同步更新
- GID修改:已登录用户需重新登录才能获取新GID
- 主组问题:用户主组改名后,需
usermod -g重新指定
3.groupdel- 删除用户组
语法:
groupdel 组名
案例:
# 删除空组
groupdel testgroup# 删除作为用户主组的组(会失败!)
groupdel developers
# 错误:groupdel: cannot remove the primary group of user 'testuser'
# 需先删除用户或修改用户主组
⚠️ 注意事项:
- 🔥主组保护:不能删除作为任何用户主组的组
- 附加组:删除组后,用户会失去该附加组权限
- 无提示:删除成功无输出,静默操作
4.gpasswd- 组密码与管理
语法:
gpasswd [选项] 组名
核心选项:
无选项:设置组密码(极少用)-a 用户:添加用户到组-d 用户:从组删除用户-A 用户1,用户2:设置组管理员-M 用户1,用户2:批量设置组成员(重置!)
案例1:管理组成员
# 添加用户到组(推荐用这个,比usermod -aG更直观)
gpasswd -a testuser docker# 从组删除用户
gpasswd -d testuser docker# 批量设置组成员(⚠️会覆盖原有成员)
gpasswd -M user1,user2,user3 developers
案例2:查看组成员
# 方法1:getent
getent group docker
# 输出:docker:x:993:user1,user2# 方法2:查看/etc/group
grep docker /etc/group# 方法3:查看用户所属组
groups testuser
⚠️ 注意事项:
- 🔥
-M是重置 :会清空组内其他成员,慎用! - 主组问题:
gpasswd -d不能删除用户的主组 - 组管理员:非root用户如被设为组管理员,可管理该组成员
三、📋 核心配置文件解析
1./etc/passwd- 用户账户信息
cat /etc/passwd
# 格式:用户名:密码占位符:UID:GID:描述:家目录:Shell
# 示例:
root:x:0:0:root:/root:/bin/bash
testuser:x:1000:1000:testuser:/home/testuser:/bin/bash
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
字段解析:
- 用户名:登录名
- 密码:
x表示密码在/etc/shadow - UID:用户ID(0=root,1-999=系统,≥1000=普通)
- GID:主组ID
- 描述:用户全名或说明
- 家目录:登录后默认目录
- Shell:登录后执行的Shell(
/sbin/nologin禁止登录)
2./etc/shadow- 用户密码信息(仅root可读)
sudo cat /etc/shadow
# 格式:用户名:加密密码:最后修改时间:最小天数:最大天数:警告天数:失效天数:过期日期:保留
# 示例:
root:$6$rounds=656000$...:19874:0:99999:7:::
testuser:$6$...:19874:0:99999:7:::
密码字段前缀:
$1$= MD5$5$= SHA-256$6$= SHA-512(CentOS 7默认)
3./etc/group- 组账户信息
cat /etc/group
# 格式:组名:密码占位符:GID:组成员列表(逗号分隔)
# 示例:
wheel:x:10:testuser,admin
docker:x:993:
4./etc/gshadow- 组密码信息
sudo cat /etc/gshadow
# 格式:组名:加密密码:组管理员:组成员
四、🎯 综合实战案例
案例1:创建项目协作用户体系
#!/bin/bash
# 为项目ProjectX创建用户体系# 1. 创建项目组
groupadd -g 5000 projectx
groupadd -g 5001 projectx-dev
groupadd -g 5002 projectx-test# 2. 创建项目目录
mkdir -p /opt/projectx/{dev,test,prod}
chown root:projectx /opt/projectx
chmod 775 /opt/projectx# 3. 创建用户并分配
useradd -u 6001 -g projectx-dev -G projectx -c "Dev User" -m devuser01
useradd -u 6002 -g projectx-dev -G projectx -c "Dev User" -m devuser02
useradd -u 6101 -g projectx-test -G projectx -c "Test User" -m testuser01# 4. 设置初始密码
echo "Dev@2024#01" | passwd --stdin devuser01
echo "Dev@2024#02" | passwd --stdin devuser02
echo "Test@2024#01" | passwd --stdin testuser01# 5. 配置sudo权限(dev可重启服务)
echo "devuser01 ALL=(ALL) NOPASSWD:/bin/systemctl restart projectx" >> /etc/sudoers.d/projectx
echo "devuser02 ALL=(ALL) NOPASSWD:/bin/systemctl restart projectx" >> /etc/sudoers.d/projectx# 6. 验证
id devuser01
# 输出:uid=6001(devuser01) gid=5001(projectx-dev) groups=5001(projectx-dev),5000(projectx)
案例2:安全删除离职员工账户
# 步骤1:锁定账户(立即失效)
passwd -l leaveruser# 步骤2:查看进程并终止
ps -u leaveruser
kill -9 <PID># 步骤3:备份家目录
tar -czf /backup/leaveruser_$(date +%Y%m%d).tar.gz /home/leaveruser# 步骤4:备份30天后删除账户
# (添加到crontab每天检查)
# 0 2 * * * find /home -maxdepth 1 -type d -mtime +30 -name "leaveruser*" | xargs -I {} userdel -r {}
案例3:批量创建100个测试用户
#!/bin/bash
# 批量创建用户stressuser01-100GROUP="stress"
groupadd $GROUPfor i in {01..100}; doUSERNAME="stressuser$i"useradd -g $GROUP -M -s /sbin/nologin $USERNAMEecho "${USERNAME}:Password@2024" | chpasswd
done# 验证
getent group $GROUP
# 输出:stress:x:5003:stressuser01,stressuser02,...stressuser100
五、⚠️ 安全最佳实践
1.🔥 密码策略强化
# 查看当前策略
grep -E "PASS|RETRY" /etc/login.defs# 关键参数:
PASS_MAX_DAYS 90 # 密码最长90天
PASS_MIN_DAYS 7 # 最少7天后可改
PASS_WARN_AGE 14 # 提前14天警告
2.🔥 禁用root远程登录
# 编辑SSH配置
nano /etc/ssh/sshd_config
# 修改:
PermitRootLogin no# 重启SSH
systemctl restart sshd# 使用sudo用户登录后su/sudo
3.🔥 wheel组权限控制
# 确保只有wheel组可sudo
nano /etc/sudoers
# 取消注释:
%wheel ALL=(ALL) ALL# 严格控制wheel组成员
getent group wheel
# 只保留必要用户
4.🔥 定期审计账户
# 查找90天未登录用户
lastlog -b 90# 查找无密码账户(危险!)
awk -F: '($2=="") {print $1}' /etc/shadow# 查找UID=0的非root账户(后门检测)
awk -F: '($3==0 && $1!="root") {print $1}' /etc/passwd
5.🔥 账户过期管理
# 创建临时账户(30天过期)
useradd -e $(date -d "+30 days" +%Y-%m-%d) contractor01# 查看过期时间
chage -l contractor01
六、📚 快速命令手册
| 功能 | 命令 | 示例 |
|---|---|---|
| 创建用户 | useradd | useradd -m -s /bin/bash user01 |
| 设置密码 | passwd | echo "pass" | passwd --stdin user01 |
| 修改用户 | usermod | usermod -aG wheel user01 |
| 删除用户 | userdel | userdel -r user01 |
| 创建组 | groupadd | groupadd devops |
| 管理组 | gpasswd | gpasswd -a user01 docker |
| 查看身份 | id | id user01 |
| 切换用户 | su | su - user01 |
| 提权执行 | sudo | sudo yum install nginx |
| 查看登录 | w | w |
| 登录历史 | last | last | grep user01 |
| 密码策略 | chage | chage -M 90 user01 |
🎓 总结 :用户管理是系统安全的第一道防线!牢记:
- 最小权限原则:用户只拥有必要权限,禁止777
- sudo优于su:全程可追溯,避免root密码泄露
- 定期审计:每季度检查/etc/passwd和/etc/shadow
- 离职必锁:员工离职当天立即
passwd -l - 备份策略:删除用户前务必备份家目录!
安全无小事,用户管理疏忽可能导致整个系统沦陷!
📖原文: 不惧本心,方为自我。不拒本心,是谓自在。-- 荒《完美世界》
⌛怡然: ...
