1. 项目概述:在 CentOS 8 中安全、可控地管理用户账户
“Добавление и удаление пользователей в CentOS 8”——这句俄语标题直译是“在 CentOS 8 中添加和删除用户”,但它背后承载的远不止两条命令的语法。作为一名从 RHEL 5 时代就开始部署生产服务器的系统运维老兵,我见过太多因用户管理失当引发的事故:误删关键服务账户导致数据库集群离线;新同事被赋予过宽权限后误操作清空日志分区;临时测试账户长期滞留未清理,成为渗透链路的跳板;甚至有团队把 root 密码写在共享文档里,只因“adduser 太麻烦”。CentOS 8 虽已进入 EOL(生命周期终止)阶段,但其用户管理体系——尤其是基于
adduser
/
useradd
、
userdel
、
sudo
和
wheel
组
的权限分层模型——仍是当前主流 Linux 发行版(如 Rocky Linux 8/9、AlmaLinux 8/9、RHEL 8/9)的基石。你搜索的热词如
vm安装centos 8
、
sudo属于root并设置了setuid位
、
用户加入wheel组和vi sudoers区别
,恰恰印证了这个基础操作在真实工作流中的高频与高危特性。它不是教科书里的练习题,而是每天都在发生的权限治理实践。本文不讲抽象理论,只聚焦一个目标:让你在虚拟机或物理服务器上,用最稳妥的方式完成用户增删,确保每一步都可审计、可回滚、权限最小化。适合刚配好
vm安装centos 8
环境的新人,也适合想厘清
sudo
权限底层逻辑的中级运维——比如你是否真正理解为什么
sudo
命令必须由 root 拥有且 setuid 位被设置?为什么直接编辑
/etc/sudoers
是高危操作,而
usermod -aG wheel username
才是标准答案?接下来的内容,全部来自我过去十年在金融、电商、政企客户现场踩过的坑和验证过的方案。
2. 用户管理的核心设计逻辑与方案选型依据
2.1 为什么不用
useradd
而推荐
adduser
?一条命令背后的用户体验哲学
在 CentOS 8 的 man 手册里,
adduser
和
useradd
被明确标注为“同一程序的符号链接”。表面上看,
useradd john
和
adduser john
效果完全一致。但实际使用中,二者的行为差异巨大,这种差异不是 bug,而是 Red Hat 工程师刻意为之的设计哲学。
useradd
是一个纯粹的底层工具,它只做最核心的事:修改
/etc/passwd
、
/etc/shadow
、
/etc/group
这三张“用户户籍表”,创建家目录(如果加
-m
参数),复制
/etc/skel
骨架文件。它不问你密码强度、不提醒你设置 shell、不帮你配置家目录权限。而
adduser
是
useradd
的一个封装脚本,它内置了一套面向人类的操作流程。当你执行
adduser alice
时,系统会自动:
-
创建用户
alice,UID 自动分配(避开系统保留 UID 1–999); -
强制创建家目录
/home/alice,并递归设置权限为700(仅属主可读写执行); -
将
/etc/skel下所有文件(.bashrc,.bash_profile,.vimrc等)完整复制进去; - 启动交互式密码设置流程,要求你输入两次密码,并进行基础强度校验(至少8位,含大小写字母和数字);
-
自动为该用户指定默认 shell
/bin/bash; -
如果系统启用了 SELinux(CentOS 8 默认开启),还会自动为家目录打上正确的
user_home_t上下文标签。
提示:你可以用
which adduser和which useradd验证它们指向同一二进制文件,再用ls -l /usr/sbin/adduser查看其文件属性——它是一个指向useradd的符号链接。真正的魔法在/usr/sbin/adduser脚本的源码逻辑里,它调用useradd时预置了大量-m、-s /bin/bash、-c "Full Name"等参数。这就是为什么我们坚持说“adduser是给运维人用的,useradd是给自动化脚本用的”。
我曾在一个银行核心系统迁移项目中,因脚本错误使用了裸
useradd
而未加
-m
参数,导致新用户登录时家目录不存在,
~/.ssh/authorized_keys
无法加载,SSH 公钥认证全线失效。故障排查花了整整两小时,最后发现根源竟是家目录没创建。从此,我的所有初始化脚本里,
adduser
前面都加了注释:“此处严禁替换为 useradd,除非你已手动处理家目录、shell、SELinux 上下文”。
2.2
wheel
组 vs 直接编辑
/etc/sudoers
:权限管控的“高速公路”与“手挖隧道”
热词里反复出现的
用户加入wheel组和vi sudoers区别
,是新手最容易混淆的权限管理误区。很多教程会教你打开
/etc/sudoers
文件,找到
# %wheel ALL=(ALL) NOPASSWD: ALL
这一行,去掉前面的
#
号,然后保存。这看起来很直接,但风险极高。
/etc/sudoers
是一个语法极其严格的配置文件,一个多余的空格、一个漏掉的逗号、一个未闭合的引号,都会导致整个 sudo 系统崩溃。一旦出错,你将无法再用
sudo
执行任何命令,包括修复这个文件本身——因为
visudo
命令本身也需要 sudo 权限来启动。此时,你只能重启进入单用户模式,手动挂载根文件系统并编辑,这对线上服务器是不可接受的停机。
而
wheel
组机制,则是 Red Hat 官方推荐的、经过充分验证的“安全通道”。它的设计逻辑是:
权限授予 = 组成员身份 + 预定义策略
。CentOS 8 默认在
/etc/sudoers
中已存在如下策略:
%wheel ALL=(ALL) ALL
这行配置的意思是:“所有属于
wheel
组的用户,在任意主机上,可以以任意用户(包括 root)身份,执行任意命令”。它没有
NOPASSWD
,意味着每次执行 sudo 都需要输入自己的密码——这本身就是一道重要的安全确认环节。你只需执行一条简单、原子、可逆的命令:
sudo usermod -aG wheel alice
-aG
参数是关键:
-a
表示“append”(追加),
-G
表示“groups”,即把用户
alice
追加到
wheel
组,而不影响她已有的其他组成员身份。这条命令只会修改
/etc/group
文件中
wheel
组的成员列表,操作极轻量,几乎不可能失败。即使你误操作,
gpasswd -d alice wheel
也能瞬间撤销。
注意:
usermod -aG是唯一安全的追加方式。如果你写成usermod -G wheel alice(少了-a),系统会把alice从所有其他组(比如users、docker)中踢出去,只保留在wheel组。这可能导致她无法访问某些共享目录或 Docker 守护进程,引发连锁故障。我在某次政务云平台升级中就遇到过,一位开发人员被误删出docker组,导致 CI/CD 流水线卡死,排查时才发现是usermod参数少了个-a。
2.3
userdel
的“温柔一刀”与“彻底清除”:删除用户时的三种现实场景
删除用户远比添加复杂,因为它牵涉到数据归属、磁盘空间、服务依赖等多重因素。
userdel
命令提供了
-r
(remove home directory)、
-f
(force)、
-Z
(SELinux context)等参数,但如何组合,取决于你的具体场景。我将其归纳为三类典型情况:
场景一:临时测试账户,需彻底销毁(推荐
userdel -r
)
这是最干净的场景。比如你在
vm安装centos 8
后,为测试某个软件包创建了
testuser
,现在测试完毕,要完全擦除痕迹。执行:
sudo userdel -r testuser
-r
参数会同时删除
/home/testuser
目录及其所有内容,以及
/var/spool/mail/testuser
邮件队列。这是标准操作,无副作用。
场景二:离职员工账户,需保留家目录供审计(禁用
userdel -r
)
这是企业合规的硬性要求。你不能直接删掉
john
的家目录,因为其中可能存有项目文档、代码片段、沟通记录,法务或审计部门随时可能调取。正确做法是先锁定账户,再删除用户条目:
# 第一步:锁定密码,使其无法登录(在 /etc/shadow 中密码字段前加 '!')
sudo passwd -l john
# 第二步:移除其所有组成员身份(避免通过组权限间接访问资源)
sudo gpasswd -d john wheel
sudo gpasswd -d john docker
# ... 依此类推,检查并移除所有非必要组
# 第三步:删除用户条目,但保留家目录
sudo userdel john
执行完
userdel
(无
-r
)后,
/home/john
目录依然存在,但其属主 UID 已变为一个无效数字(如
1001
),普通用户无法访问。你可以将其重命名为
/home/john_20240520_archived
,并设置权限
700
,仅供管理员审计。
场景三:系统服务账户,删除后需手动清理残留(
userdel
不足,需人工介入)
像
nginx
、
mysql
、
redis
这类服务,通常会创建专用的系统用户(UID < 1000)。
userdel nginx
只会删除用户条目,但
/var/lib/nginx
、
/var/log/nginx
这些目录的属主仍为
nginx
,且服务配置文件(如
/etc/nginx/nginx.conf
)中仍有
user nginx;
指令。此时,
userdel
只是第一步,你还必须:
-
修改服务配置,将
user指令改为nobody或www-data; -
手动
chown -R nobody:nobody /var/lib/nginx; -
清理
/etc/systemd/system/multi-user.target.wants/nginx.service中的软链接; -
最后运行
sudo systemctl daemon-reload。
这解释了为什么热词中会出现
sudo systemctl start local-mount.mount
这类看似无关的命令——它往往是删除某个依赖特定用户的挂载服务后,必须执行的刷新操作。用户管理从来不是孤立的命令,而是整个系统服务生态的一部分。
3. 核心实操步骤与关键细节解析
3.1 从零开始:在全新 CentOS 8 虚拟机中创建第一个管理用户
假设你已完成
vm安装centos 8
,系统已启动,你正以 root 用户登录(或通过 Vagrant 的
vagrant
用户并拥有 sudo 权限)。现在,你要创建一个名为
opsadmin
的日常运维账户,并赋予其完整的管理权限。以下是精确到每个回车键的实操流程:
第一步:创建用户并设置密码
# 执行 adduser 命令,全程按提示操作
sudo adduser opsadmin
# 系统会输出:
# Adding user `opsadmin' ...
# Adding new group `opsadmin' (1001) ...
# Adding new user `opsadmin' (1001) with group `opsadmin' ...
# Creating home directory `/home/opsadmin' ...
# Copying files from `/etc/skel' ...
# 接着会提示你输入新用户的密码(两次)
# Enter new UNIX password:
# Retype new UNIX password:
# 然后是可选的用户信息(全都可以直接回车跳过)
# Full Name []:
# Room Number []:
# Work Phone []:
# Home Phone []:
# Other []:
实操心得:密码输入时屏幕不会显示任何字符(这是 Unix 传统,防止旁观者通过字符长度猜测密码强度),请务必记牢。如果输错,按
Ctrl+C中断,重新执行adduser即可。adduser的交互式设计,天然规避了useradd -p参数带来的明文密码泄露风险(-p参数要求你提供加密后的密码字符串,极易在 shell 历史中留下痕迹)。
第二步:将用户加入
wheel
组
sudo usermod -aG wheel opsadmin
执行此命令后,无需重启,权限立即生效。但注意:
opsadmin
用户当前的 shell 会话(如果已登录)并不会自动获得新组权限。他需要退出当前会话,重新 SSH 登录,或者执行
newgrp wheel
切换组上下文。这是 Linux 组权限的固有机制——组成员身份是在用户登录时一次性加载的。
第三步:验证 sudo 权限是否生效
让
opsadmin
用户登录,然后执行:
# 尝试执行一个需要 root 权限的命令
opsadmin$ sudo ls -l /root
# 系统会提示:
# [sudo] password for opsadmin:
# (输入 opsadmin 自己的密码)
# 如果看到 /root 目录下的文件列表,说明成功。
# 如果报错 "opsadmin is not in the sudoers file",说明 usermod 命令未执行或 /etc/sudoers 中 %wheel 行被注释了。
关键原理:
sudo命令之所以能提权,是因为它自身是一个 setuid 程序。ls -l /usr/bin/sudo的输出一定是-rwsr-xr-x,其中那个s就是 setuid 位。这意味着,当普通用户opsadmin运行sudo时,操作系统会临时将该进程的有效用户 ID(EUID)提升为root(UID 0),从而获得读取/root目录的权限。这正是热词中sudo 必须属于 用户 id 0 设置swtuid的本质——sudo程序文件的所有者必须是root,且其 setuid 位必须被设置。你可以用sudo chmod u-s /usr/bin/sudo来故意破坏它,然后就会看到sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?这个经典错误。修复只需sudo chmod u+s /usr/bin/sudo。
3.2 删除用户的完整闭环:从锁定到归档的七步法
删除一个用户,绝不是
userdel
一条命令就能结束的。我总结了一套在生产环境验证过的“七步法”,确保无遗漏、可追溯:
步骤 1:确认用户当前状态
# 查看用户基本信息
id opsadmin
# 输出类似:uid=1001(opsadmin) gid=1001(opsadmin) groups=1001(opsadmin),10(wheel)
# 查看其登录会话(是否有活跃连接)
who | grep opsadmin
# 或更全面的:loginctl list-users | grep opsadmin
# 查看其正在运行的进程
ps -u opsadmin -o pid,ppid,cmd
步骤 2:强制用户登出所有会话
# 获取该用户所有会话的 session ID
loginctl list-sessions | grep opsadmin | awk '{print $1}'
# 逐个终止(假设 session ID 是 3)
loginctl terminate-session 3
# 或一键终止该用户所有会话
loginctl kill-user opsadmin
步骤 3:锁定用户密码(立即生效)
sudo passwd -l opsadmin
# 输出:passwd: password expiry information changed.
# 此时 /etc/shadow 中 opsadmin 行的密码字段会变成 !<encrypted_password>
步骤 4:撤销所有额外组权限
# 列出用户所属的所有组
groups opsadmin
# 逐个移除非必要组(保留 primary group opsadmin 和 wheel)
sudo gpasswd -d opsadmin docker
sudo gpasswd -d opsadmin apache
# ... 依此类推
步骤 5:停止并禁用该用户启动的服务
# 查找该用户拥有的 systemd 服务
systemctl --user list-units --type=service --state=running | grep opsadmin
# 停止并禁用(如果存在)
systemctl --user stop myapp.service
systemctl --user disable myapp.service
步骤 6:执行用户删除
# 如果确定家目录无需保留,执行彻底删除
sudo userdel -r opsadmin
# 如果需要保留家目录用于审计,执行:
sudo userdel opsadmin
# 然后手动重命名并加固
sudo mv /home/opsadmin /home/opsadmin_20240520_deleted
sudo chown root:root /home/opsadmin_20240520_deleted
sudo chmod 700 /home/opsadmin_20240520_deleted
步骤 7:最终验证与清理
# 确认用户已从系统中消失
id opsadmin # 应返回 "no such user"
# 确认家目录(如果保留)已无法被普通用户访问
sudo -u nobody ls /home/opsadmin_20240520_deleted # 应返回 "Permission denied"
# 清理 sudo 历史(可选,增强审计性)
sudo rm -f /var/log/sudo.log
# 注意:这会删除所有 sudo 日志,生产环境慎用,建议先备份。
这套流程的每一个步骤,都对应着一个真实的故障点。比如步骤 2,如果跳过,
opsadmin
的 SSH 会话可能仍在后台运行一个长任务(如
rsync
),
userdel
会失败并报错
userdel: user opsadmin is currently used by process 12345
。步骤 6 的重命名规则(带日期戳),则是为了满足 ISO 27001 等合规审计要求,证明数据被妥善归档而非随意删除。
3.3
sudo
权限的精细化控制:超越
wheel
组的三种进阶场景
%wheel ALL=(ALL) ALL
是一个“全开”策略,适用于小团队或开发测试环境。但在中大型企业,你需要更精细的权限划分。
/etc/sudoers
文件支持复杂的规则语法,以下是我常用的三种安全模式:
模式一:免密执行特定命令(解决
missing sudo password
的常见需求)
开发人员经常需要频繁执行
systemctl restart nginx
,每次都输密码很烦。可以为他们创建一个专用组
webadmin
,并授权:
# 先创建组
sudo groupadd webadmin
sudo usermod -aG webadmin devuser
# 编辑 sudoers(必须用 visudo!)
sudo visudo
# 在文件末尾添加:
%webadmin ALL=(root) NOPASSWD: /bin/systemctl restart nginx, /bin/systemctl reload nginx
这样,
devuser
就可以无密码执行
sudo systemctl restart nginx
,但不能执行
sudo rm -rf /
。
NOPASSWD:
后面的命令路径必须绝对精确,且不能包含通配符(
*
),否则会带来严重安全风险。
模式二:限制可切换的用户(
sudo -u
的安全边界)
DBA 团队需要以
postgres
用户身份执行
pg_dump
,但不应允许他们切换到
root
。可以这样配置:
# 创建 dba 组
sudo groupadd dba
sudo usermod -aG dba dbauser
# 在 sudoers 中:
%dba ALL=(postgres) /usr/bin/pg_dump, /usr/bin/pg_restore
dbauser
执行
sudo -u postgres pg_dump mydb
是允许的,但
sudo -u root whoami
会被拒绝。
模式三:基于主机的权限隔离(多租户环境必备)
如果你的 CentOS 8 服务器托管了多个客户的网站,可以为每个客户创建独立用户(
clientA
,
clientB
),并限制他们只能管理自己的目录:
# 在 sudoers 中:
clientA ALL=(clientA) /bin/bash -c "cd /var/www/clientA && *"
clientB ALL=(clientB) /bin/bash -c "cd /var/www/clientB && *"
这行规则的意思是:
clientA
用户可以在
clientA
身份下,执行任何以
cd /var/www/clientA &&
开头的命令。这是一种粗粒度的目录级隔离,比直接给
chroot
更轻量。
实操心得:所有对
/etc/sudoers的修改,必须通过sudo visudo命令进行。visudo会在保存前自动语法检查,如果发现错误,会阻止你保存并给出错误行号。这是唯一安全的编辑方式。我见过太多人用nano /etc/sudoers直接编辑,结果一个括号没闭合,整个 sudo 系统瘫痪,最后只能重装系统。visudo就是你的最后一道保险。
4. 常见问题与排查技巧实录
4.1 “sudo: effective uid is not 0” 错误的五层排查法
这个错误信息(
sudo 必须属于 用户 id 0 设置swtuid
的直接体现)是用户管理中最常遇到的“拦路虎”。它表明
sudo
命令无法以 root 身份运行。不要慌,按以下顺序逐层排查,99% 的问题都能定位:
| 排查层级 | 检查命令 | 预期正常输出 | 异常表现与修复 |
|---|---|---|---|
| L1:sudo 程序文件权限 |
ls -l /usr/bin/sudo
|
-rwsr-xr-x. 1 root root ... /usr/bin/sudo
|
如果没有
s
(如
-rwxr-xr-x
),执行
sudo chmod u+s /usr/bin/sudo
|
| L2:sudo 程序所有者 |
ls -l /usr/bin/sudo | awk '{print $3,$4}'
|
root root
|
如果所有者不是
root
,执行
sudo chown root:root /usr/bin/sudo
|
| L3:文件系统挂载选项 |
mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep nosuid
| 无输出 |
如果输出包含
nosuid
,说明该分区被挂载时禁用了 setuid。编辑
/etc/fstab
,移除
nosuid
选项,然后
sudo mount -o remount /
|
| L4:SELinux 上下文 |
ls -Z /usr/bin/sudo
|
system_u:object_r:bin_t:s0 /usr/bin/sudo
|
如果上下文异常(如
unconfined_u:object_r:usr_t:s0
),执行
sudo restorecon -v /usr/bin/sudo
|
| L5:sudoers 配置语法 |
sudo visudo -c
|
syntax OK
|
如果报错,
visudo
会指出错误行号。常见错误:
Defaults env_reset
后面多了一个逗号;
%wheel
行被意外注释;
#includedir /etc/sudoers.d
目录下有语法错误的文件
|
实操心得:我习惯把这五条命令写成一个快速诊断脚本
sudo-check.sh,放在/usr/local/bin/下。当同事报告 sudo 失效时,我让他直接运行sudo-check.sh,几秒钟就能定位到是 L1 还是 L3 的问题。其中 L3(nosuid挂载)最容易被忽略——比如你用mount -o remount,nosuid /临时调试,忘记改回来,就会导致这个错误。所以,mount命令的临时选项,一定要在/etc/fstab中同步更新,否则重启后问题重现。
4.2
userdel: user xxx is currently used by process yyy
的实战破解
这个错误意味着你要删除的用户
xxx
仍有活跃进程在运行,
userdel
出于安全考虑拒绝删除。强行加
-f
(force)参数是危险的,可能导致进程异常终止、数据损坏。正确解法是“主动终结,而非暴力摧毁”:
第一步:精准定位所有相关进程
# 使用 pgrep(比 ps 更精准)
pgrep -u xxx
# 或查看所有属于该用户的进程树
ps -U xxx -o pid,ppid,comm,args --forest
# 特别关注守护进程(daemon)和 systemd --user 服务
systemctl --user list-units --type=service --state=running --user | grep xxx
第二步:分类处理进程
-
SSH 会话
:
loginctl terminate-user xxx是最干净的,它会优雅地关闭所有终端会话。 -
Web 服务器子进程
(如 Apache 的
httpd):这些进程通常由root启动,但以xxx身份运行。你需要先停止主服务:sudo systemctl stop httpd,然后再userdel。 -
遗留的 nohup 进程
:
ps aux \| grep xxx \| grep -v grep \| awk '{print $2}' \| xargs kill -TERM,发送TERM信号让其自行清理后退出。如果 10 秒后还存在,再发KILL:... | xargs kill -KILL。
第三步:检查并清理内核对象
有时,进程已退出,但内核中仍有残留(如 POSIX 信号量、共享内存段)。用
ipcs -q -m -s
查看,再用
ipcrm
清理:
# 查看属于用户 xxx 的 IPC 对象(需要知道其 UID)
id -u xxx # 假设是 1001
ipcs -q -m -s | awk '$5 == 1001 {print $2}' | xargs -I {} ipcrm -q {}
# 依此类推清理 -m(共享内存)和 -s(信号量)
实操心得:在自动化脚本中,我从不直接调用
userdel。而是封装一个函数:
safe_userdel() {
local user=$1
echo "Terminating sessions for $user..."
loginctl terminate-user "$user" 2>/dev/null || true
echo "Stopping user services..."
systemctl --user stop --all "$user" 2>/dev/null || true
echo "Killing remaining processes..."
pkill -u "$user" 2>/dev/null || true
sleep 2
echo "Deleting user..."
userdel -r "$user"
}
这个函数把所有“前置清理”步骤打包,确保
userdel
总是能成功执行。
4.3
wheel
组权限不生效的四大隐形陷阱
sudo usermod -aG wheel username
执行成功,但用户仍无法使用 sudo,这是新手最困惑的问题。原因往往藏在你看不见的地方:
陷阱一:用户未重新登录(Session 未刷新)
这是最高频的原因。组成员身份在登录时加载,修改后必须重新登录。
su - username
切换也不行,因为
su
不会重新读取组数据库。唯一可靠的方法是:完全退出当前 SSH 会话,再新建一个。
陷阱二:
/etc/nsswitch.conf
配置错误
这个文件定义了系统查询用户、组、主机等信息的顺序。如果其中
group:
行被错误地配置为
group: files sss
(启用了 SSSD),但 SSSD 服务未运行,那么
groups username
命令可能只返回本地组,而
sudo
内部的组查询却失败。检查:
grep "^group:" /etc/nsswitch.conf
# 正常应为:group: files
# 如果是 group: files sss,且你没用 LDAP,就把它改回 group: files
陷阱三:SELinux 策略限制(CentOS 8 默认启用)
SELinux 可能阻止
sudo
访问其所需的策略模块。检查:
# 查看最近的 SELinux 拒绝日志
sudo ausearch -m avc -ts recent | grep sudo
# 如果看到类似 "avc: denied { execute } for ... comm="sudo" name="sudo" dev="dm-0" ino=123456" 的日志,说明 SELinux 在拦截。
# 临时放行(仅用于测试):
sudo setsebool -P allow_sudo_on_system 1
# 或永久恢复默认策略:
sudo semanage permissive -a sudo_t
陷阱四:
/etc/sudoers
中存在冲突规则
sudoers
文件是自上而下解析的。如果在
%wheel
规则之前,有一条
username ALL=(ALL) DENY
的规则,那么
username
就会被拒绝。用
sudo -l -U username
命令可以清晰地看到该用户被允许和禁止执行的命令列表,这是最权威的验证方式。
实操心得:我养成了一个习惯,在为新用户配置完
wheel组后,立刻用sudo -l -U username验证。这个命令会输出类似:
Matching Defaults entries for devuser on localhost:
!env_reset, mail_badpass, secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User devuser may run the following commands on localhost:
(ALL) ALL
只要看到
(ALL) ALL
,就说明权限已正确继承。这比反复
sudo whoami
更高效、更全面。
5. 生产环境加固与最佳实践清单
5.1 用户生命周期管理的 SOP(标准操作流程)
在真实的生产环境中,用户管理不是一次性的命令,而是一套需要文档化、可审计、可复现的流程。我为你整理了一份精简但完备的 SOP 清单,适用于任何规模的 CentOS 8(及兼容发行版)环境:
新增用户 SOP:
-
审批
:获取书面(邮件/工单)审批,明确用户名、全名、部门、岗位、所需权限级别(
wheel/webadmin/dba)。 -
创建
:
sudo adduser <username>,密码强度必须符合公司策略(至少12位,含大小写字母、数字、特殊字符)。 -
授权
:
sudo usermod -aG <group> <username>,严格遵循最小权限原则。 -
通知
:向用户发送欢迎邮件,包含初始密码(首次登录强制修改)、SSH 公钥上传指引、
sudo使用规范。 - 记录 :在 CMDB(配置管理数据库)中登记该用户,关联其所属服务器、权限组、审批工单号。
删除用户 SOP:
- 触发 :收到 HR 离职通知或项目结束通知。
-
冻结
:
sudo passwd -l <username>,立即锁定账户。 -
审计
:导出该用户近30天的
sudo日志(/var/log/secure)、SSH 登录日志(/var/log/secure)、关键目录访问日志(如有)。 - 清理 :执行前述“七步法”,家目录必须重命名归档,保留至少180天。
-
确认
:
id <username>返回no such user,sudo -l -U <username>返回unknown user。 -
归档
:在 CMDB 中将该用户状态标记为
Archived,并关联归档路径/home/<username>_YYYYMMDD_archived。
变更用户 SOP(如权限升级):
- 审批 :必须有新的、独立的审批,不能沿用原审批。
-
操作
:
sudo usermod -aG <new_group> <username>,严禁使用-G覆盖。 -
验证
:
sudo -l -U <username>确认新权限已生效。 - 记录 :在 CMDB 中更新权限组列表,并备注变更原因和审批号。
个人体会:这套 SOP 看似繁琐,但它在一次重大安全事件中救了我们。当时,一个外包开发人员的账户被钓鱼攻击,攻击者利用其
wheel权限植入了挖矿木马。由于我们严格执行了 SOP,所有操作都有 CMDB 记录和工单号,我们能在 15 分钟内定位到该账户的创建时间、审批人、所有 sudo 命令历史,并迅速向法务和监管机构提交了完整证据链。没有 SOP,你面对的将是一团乱麻的日志和无法追溯的责任。
5.2 五个被低估但至关重要的安全加固点
除了基本的增删改查,还有五个细节,决定了你的 CentOS 8 用户管理体系是“可用”还是“可信”:
加固点一:禁用 root 远程 SSH 登录(
PermitRootLogin no
)
这是 Linux 安全的黄金法则。在
/etc/ssh/sshd_config
中,确保这一行存在且未被注释。然后
sudo systemctl restart sshd
。所有管理操作,必须通过普通用户(如
opsadmin
)登录,再
sudo su -
。这迫使攻击者必须先攻破一个普通账户,再突破 sudo 权限,大大增加了攻击成本。
加固点二:为
wheel
组启用密码复杂度策略
仅仅加入
wheel
组还不够。你需要确保
wheel
组成员的密码足够强壮。编辑
/etc/pam.d/system-auth
,在
password requisite pam_pwquality.so
行后添加:
retry=3 minlen=12 d
390

被折叠的 条评论
为什么被折叠?



