【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- 创建用户 ⭐

语法:

bash 复制代码
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:创建普通用户

bash 复制代码
# 创建用户testuser,使用默认设置
useradd testuser
# 系统会:
# 1. 创建用户testuser(UID≥1000)
# 2. 创建同名主组testuser(GID=UID)
# 3. 创建家目录/home/testuser
# 4. 从/etc/skel复制默认配置文件
# 5. 在/etc/passwd、/etc/shadow添加记录

案例2:创建系统用户

bash 复制代码
# 创建无法登录的系统用户(如运行服务)
useradd -r -s /sbin/nologin -M nginx
# -r:系统用户(UID<1000)
# -s /sbin/nologin:禁止登录
# -M:不创建家目录

案例3:指定UID和组

bash 复制代码
# 先创建组
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- 设置/修改密码

语法:

bash 复制代码
passwd [选项] [用户名]

核心选项:

  • 无选项:修改当前用户密码
  • 用户名:修改指定用户密码(需root)
  • -l锁定用户(Lock)
  • -u解锁用户(Unlock)
  • -d:删除密码(无密码登录,⚠️危险)
  • -e:强制下次登录修改密码
  • -S:查看密码状态
  • --stdin:从标准输入接收密码(脚本自动化)

案例1:交互式设置密码

bash 复制代码
# root用户为testuser设置密码
passwd testuser
# 输入:New password: 
# 输入:Retype new password:

案例2:非交互式设置(脚本必备)

bash 复制代码
# 方法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:密码策略管理

bash 复制代码
# 查看密码状态
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- 修改用户属性

语法:

bash 复制代码
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:追加用户到附加组

bash 复制代码
# 将testuser添加到wheel组(sudo权限)
usermod -aG wheel testuser

# 追加多个组(用逗号分隔,无空格)
usermod -aG devops,docker,kubernetes testuser

# 查看结果
id testuser
groups testuser

案例2:修改家目录

bash 复制代码
# 修改家目录并移动内容
usermod -d /home/newtestuser -m testuser
# -m必须加,否则旧家目录内容不迁移!

案例3:锁定/解锁用户

bash 复制代码
# 临时禁用用户(离职员工)
usermod -L testuser

# 重新启用
usermod -U testuser

⚠️ 注意事项:

  • 🔥 -G vs -aG-G覆盖 原有附加组,-aG才是追加!
  • 主组修改-g指定的组必须存在,用户会被移出新组
  • 家目录移动-m只能在-d后使用,确保数据完整迁移
  • 用户登录时:不能修改当前登录用户的属性,需先退出

4.userdel- 删除用户

语法:

bash 复制代码
userdel [选项] 用户名

核心选项:

  • 无选项:仅删除用户,保留家目录和邮件
  • -r递归删除家目录和邮件池(⚠️危险!)
  • -f:强制删除(即使用户已登录)

案例1:安全删除(保留数据)

bash 复制代码
# 仅删除用户,家目录保留(后续手动处理)
userdel testuser
# 家目录变成无主之目录,需手动删除或 chown -R 新用户

案例2:彻底删除(⚠️高危)

bash 复制代码
# 删除用户并清理所有数据
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- 查看用户身份信息

语法:

bash 复制代码
id [选项] [用户名]

案例:

bash 复制代码
# 查看当前用户
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 - 用户登录信息

bash 复制代码
whoami              # 当前用户(简单)
# 输出:testuser

who                 # 当前登录的用户、终端、登录时间
# 输出:
# 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 sshd

last                # 查看登录历史(读取/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语法:

bash 复制代码
su [选项] [用户名]

sudo语法

bash 复制代码
sudo [选项] 命令

案例1:su切换用户

bash 复制代码
# 切换到root(需输入root密码)
su -
# 或
su - root

# 切换到testuser(进入其环境)
su - testuser

# 不切换环境变量(当前环境)
su testuser

# 执行单条命令
su -c "yum update" root

案例2:sudo提权(推荐!)

bash 复制代码
# 配置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- 创建用户组

语法:

bash 复制代码
groupadd [选项] 组名

核心选项:

  • -g GID:指定组ID
  • -r:创建系统组(GID<1000)

案例:

bash 复制代码
# 创建普通组
groupadd developers

# 创建指定GID的组
groupadd -g 2000 devops

# 创建系统组
groupadd -r docker

2.groupmod- 修改组属性

语法:

bash 复制代码
groupmod [选项] 组名

核心选项:

  • -g 新GID:修改组ID
  • -n 新组名:修改组名

案例:

bash 复制代码
# 修改组名(慎用,可能影响权限)
groupmod -n newdev developers

# 修改GID
groupmod -g 3000 newdev

⚠️ 注意事项:

  • 🔥组名修改:如果文件系统使用组名授权(如ACL),需同步更新
  • GID修改:已登录用户需重新登录才能获取新GID
  • 主组问题 :用户主组改名后,需usermod -g重新指定

3.groupdel- 删除用户组

语法:

bash 复制代码
groupdel 组名

案例:

bash 复制代码
# 删除空组
groupdel testgroup

# 删除作为用户主组的组(会失败!)
groupdel developers
# 错误:groupdel: cannot remove the primary group of user 'testuser'
# 需先删除用户或修改用户主组

⚠️ 注意事项:

  • 🔥主组保护:不能删除作为任何用户主组的组
  • 附加组:删除组后,用户会失去该附加组权限
  • 无提示:删除成功无输出,静默操作

4.gpasswd- 组密码与管理

语法:

bash 复制代码
gpasswd [选项] 组名

核心选项:

  • 无选项:设置组密码(极少用)
  • -a 用户添加用户到组
  • -d 用户从组删除用户
  • -A 用户1,用户2:设置组管理员
  • -M 用户1,用户2:批量设置组成员(重置!)

案例1:管理组成员

bash 复制代码
# 添加用户到组(推荐用这个,比usermod -aG更直观)
gpasswd -a testuser docker

# 从组删除用户
gpasswd -d testuser docker

# 批量设置组成员(⚠️会覆盖原有成员)
gpasswd -M user1,user2,user3 developers

案例2:查看组成员

bash 复制代码
# 方法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- 用户账户信息

bash 复制代码
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

字段解析:

  1. 用户名:登录名
  2. 密码x表示密码在/etc/shadow
  3. UID:用户ID(0=root,1-999=系统,≥1000=普通)
  4. GID:主组ID
  5. 描述:用户全名或说明
  6. 家目录:登录后默认目录
  7. Shell :登录后执行的Shell(/sbin/nologin禁止登录)

2./etc/shadow- 用户密码信息(仅root可读)

bash 复制代码
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- 组账户信息

bash 复制代码
cat /etc/group
# 格式:组名:密码占位符:GID:组成员列表(逗号分隔)
# 示例:
wheel:x:10:testuser,admin
docker:x:993:

4./etc/gshadow- 组密码信息

bash 复制代码
sudo cat /etc/gshadow
# 格式:组名:加密密码:组管理员:组成员

四、🎯 综合实战案例

案例1:创建项目协作用户体系

bash 复制代码
#!/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:安全删除离职员工账户

bash 复制代码
# 步骤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个测试用户

bash 复制代码
#!/bin/bash
# 批量创建用户stressuser01-100

GROUP="stress"
groupadd $GROUP

for i in {01..100}; do
  USERNAME="stressuser$i"
  useradd -g $GROUP -M -s /sbin/nologin $USERNAME
  echo "${USERNAME}:Password@2024" | chpasswd
done

# 验证
getent group $GROUP
# 输出:stress:x:5003:stressuser01,stressuser02,...stressuser100

五、⚠️ 安全最佳实践

1.🔥 密码策略强化

bash 复制代码
# 查看当前策略
grep -E "PASS|RETRY" /etc/login.defs

# 关键参数:
PASS_MAX_DAYS   90      # 密码最长90天
PASS_MIN_DAYS   7       # 最少7天后可改
PASS_WARN_AGE   14      # 提前14天警告

2.🔥 禁用root远程登录

bash 复制代码
# 编辑SSH配置
nano /etc/ssh/sshd_config
# 修改:
PermitRootLogin no

# 重启SSH
systemctl restart sshd

# 使用sudo用户登录后su/sudo

3.🔥 wheel组权限控制

bash 复制代码
# 确保只有wheel组可sudo
nano /etc/sudoers
# 取消注释:
%wheel  ALL=(ALL)       ALL

# 严格控制wheel组成员
getent group wheel
# 只保留必要用户

4.🔥 定期审计账户

bash 复制代码
# 查找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.🔥 账户过期管理

bash 复制代码
# 创建临时账户(30天过期)
useradd -e $(date -d "+30 days" +%Y-%m-%d) contractor01

# 查看过期时间
chage -l contractor01

六、📚 快速命令手册

功能 命令 示例
创建用户 useradd useradd -m -s /bin/bash user01
设置密码 passwd `echo "pass"
修改用户 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
密码策略 chage chage -M 90 user01

🎓 总结 :用户管理是系统安全的第一道防线!牢记:

  1. 最小权限原则:用户只拥有必要权限,禁止777
  2. sudo优于su:全程可追溯,避免root密码泄露
  3. 定期审计:每季度检查/etc/passwd和/etc/shadow
  4. 离职必锁 :员工离职当天立即passwd -l
  5. 备份策略:删除用户前务必备份家目录!

安全无小事,用户管理疏忽可能导致整个系统沦陷!



📖原文: 不惧本心,方为自我。不拒本心,是谓自在。-- 荒《完美世界》

⌛怡然 : ...



🪁 LuminKu looks forward to seeing you again 🌌


相关推荐
linuxxx1102 小时前
Centos环境中Django项目中gunicorn的配置和使用
django·centos·gunicorn
渡我白衣2 小时前
深入理解 OverlayFS:用分层的方式重新组织 Linux 文件系统
android·java·linux·运维·服务器·开发语言·人工智能
waves浪游2 小时前
进程概念(上)
linux·运维·服务器·开发语言·c++
司铭鸿2 小时前
数学图论的艺术:解码最小公倍数图中的连通奥秘
运维·开发语言·算法·游戏·图论
CXH7283 小时前
nginx-file-server
运维·数据库·nginx
不会kao代码的小王3 小时前
从局域网到全网可用!PDFMathTranslate 翻译工具的进阶使用法
linux
寺中人3 小时前
Nginx安全策略
运维·nginx
Myosotis5133 小时前
DNS练习
linux·运维·服务器
wzyannn3 小时前
Linux字符设备驱动开发详细教程(简单字符设备驱动框架)
linux·运维·驱动开发·嵌入式