1. 为什么用户管理和 sudo 权限是 Linux 运维的第一道防线
先聊个实际场景。我接手过不少服务器,第一个动作永远是看两样东西:一是/etc/passwd里躺着多少个 UID 0 的账号,二是sudoers文件里到底给哪些人开了多大的口子。多数被爆破、被删库、被挂马的机器,问题不是出在什么高深漏洞上,而是"账号权限管得太松"这种基础问题。Linux 系统管理员的日常里,"用户管理"和"sudo 权限控制"这两件事,表面看是几个命令的事,实际上决定了整台服务器的边界到底有多宽。
这篇文章想讲清楚的不只是useradd、usermod、visudo怎么敲,而是背后的设计逻辑:为什么用户要分组、为什么 sudo 要白名单、为什么visudo比直接编辑/etc/sudoers安全、为什么你配了 NOPASSWD 之后心里反而要更警惕。内容适合刚接手服务器的初级运维、准备系统学习 Linux 的开发者,以及那些已经会敲命令但没系统梳理过权限模型的"野路子"管理员。看完你可以直接照着配置一套可用、可审计、可回退的用户权限方案。
顺便说一句,标题里那个"精细化控制"不是虚的。Linux 的权限模型最大的优点就是你能精确到"谁、在哪台机器上、能以什么身份、执行哪几个命令",这种粒度放到云计算、容器环境里一样适用。把这一套吃透,你后面看 Docker 的 user namespace、K8s 的 RBAC、堡垒机的授权策略,会发现都是同一个思路的变体。
1.1 先想清楚:你要管的不只是"建号"和"授权"
很多人对用户管理的理解停留在"加个人、给个密码、加进 wheel 组"。但真实生产环境里,用户管理是贯穿账号全生命周期的:创建时的默认 Shell、家目录权限、密码策略,使用过程中的组变更、Shell 变更、锁定与恢复,直到最后的删除、归档、审计记录清理。任何一步马虎,后面都会以奇怪的方式反噬。
举个我踩过的坑:有次新建用户时手滑没指定-m,结果用户登录后家目录没创建,一堆程序写临时文件报错。后来排查半天才发现是家目录缺失加权限不对。这类问题不会让系统立刻崩溃,但会让用户和程序的行为变得不可预测,最难查。
sudo 权限更是这样。给运维一个 root 密码是最省事但最危险的做法:你无法知道谁在哪台机器上干了什么,出了问题连个追溯的抓手都没有。sudo 的核心价值不在"免输 root 密码",而在可控和可审计。所以这篇文章会把 sudoers 的语法、Default 参数、日志审计串起来讲,而不是单教你怎么放行某条命令。
1.2 这套体系适合谁、能解决什么问题
如果你是单机个人用户,那确实随便玩,反正机器就你一个人。但只要服务器超过三台,或者有第二个同事要登录,你就必须建立规矩:
- 多人共用同一账号?不行,出了问题无法定责。
- 人人都有 root 权限?不行,误操作和恶意操作的边界会消失。
- sudo 规则千篇一律全放行?不行,那跟直接给 root 没区别。
这篇文章给的是一套"最小权限"落地方案:每个人有自己的账号,按职责分组,sudo 只放行工作需要的命令,所有提权操作留日志。这套方案不需要额外装商业软件,纯靠 Linux 自带的机制就能搭起来。不管是 CentOS/RHEL 系的云服务器,还是 Ubuntu/Debian 的虚拟机,命令细节略有差异,但原理完全通用。
有人可能会问:现在不都上堡垒机、上云 IAM 了吗,学 sudo 还有用吗?答案是当然有。堡垒机做的是入口管控,但到了机器内部,sudo 依然是最后一道防线;云 IAM 管的是云 API,到了操作系统这一层,靠的还是/etc/passwd、/etc/sudoers。底层能力永远不过时。
2. 用户管理实操:从创建到生命周期管理
2.1 先搞懂账号体系的底层文件,别当黑盒
想真正把用户管理做好,得先看懂系统是怎么存储账号信息的。Linux 的用户信息主要落在四个文件里:
| 文件 | 作用 | 关键字段 |
|---|---|---|
/etc/passwd | 用户账号基本信息 | 用户名、UID、GID、家目录、登录 Shell |
/etc/shadow | 密码加密信息与过期策略 | 加密密码、修改间隔、过期天数、失效日期 |
/etc/group | 用户组信息 | 组名、GID、组成员 |
/etc/gshadow | 组密码与组管理员信息 | 一般用得少,了解即可 |
/etc/passwd里每一行是冒号分隔的七个字段,比如:
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash用户名后的x表示密码占位,真正的密码哈希在/etc/shadow里,普通用户不可读。UID 是个关键数字:UID 0 是 root,UID 1-999 一般是系统账号,普通用户的 UID 通常从 1000 开始。判断一个账号是不是"超级账号",看的不是用户名,而是 UID。所以安全审计时,我一定会扫一遍有没有非 root 用户的 UID 是 0——这是后门最爱用的手段。
/etc/shadow里的密码字段长这样:
zhangsan:$6$rounds=656000$salt$hash:19000:0:99999:7:::$6$表示 SHA-512 加密,19000是上次修改密码的日期(从 1970-01-01 起的天数),99999是密码最长有效期,7是过期前多少天提醒。这些策略参数用chage命令也能调,改文件反而容易出错。
注意:任何时候都不要手动编辑
/etc/passwd来改密码字段。正确做法是passwd改密码、chage改策略、usermod改属性。手改文件的坏处一是容易破坏字段结构,二是不会触发相关的锁机制。
2.2 创建用户的完整姿势:useradd 的参数陷阱
创建一个生产环境可用的用户,最精简的命令是:
useradd -m -s /bin/bash -G wheel zhangsan passwd zhangsan这几个参数分别做的是:-m创建家目录,-s指定登录 Shell,-G加入附加组。我见过太多人只敲useradd zhangsan就完事,结果家目录没有、Shell 是/bin/sh,后面一堆问题。
我建议养成写"完整参数"的习惯,尤其注意这几个:
-m/--create-home:不写的话,大部分发行版默认不创建家目录,用户登录后落在根目录,后果很麻烦。-s /bin/bash:不指定可能落到/bin/sh,交互体验差事小,关键是有些脚本兼容性会出问题。-G:把用户加入该加的附加组。生产环境最常见的附加组是wheel(RHEL 系的管理员组)或sudo(Debian 系的管理员组),加进去才有 sudo 资格。-r:创建系统账号,UID 会落在系统区段,一般用于跑服务,不用于登录。-d:自定义家目录路径,跨盘家目录场景用得上,配-m才生效。
用户创建完一定要立即passwd设置密码,否则账号处于无密码锁定状态,用户根本无法登录。如果你用的是密钥登录的服务器,可以跳过密码,但至少要给个初始密码或临时密码,防止用户卡在登录环节。
创建之后建议顺手检查一遍:
id zhangsan ls -ld /home/zhangsan chage -l zhangsanid看用户和组归属,ls -ld看家目录权限,chage -l看密码策略。三分钟检查,能少踩很多坑。特别提醒一点:家目录权限默认是drwx------,只有用户自己能进。如果你开了 NFS 共享或者别的服务要读这个家目录,记得用usermod -d调整或用 ACL 细化,别粗暴chmod 777——那是把自己家大门拆了。
2.3 用户组与属主属组调整:权限管理的地基
Linux 的权限模型里,组是连接"多人协作"和"文件访问"的桥梁。我通常按职能建组,例如:
dev:开发人员组,共享项目代码目录。ops:运维人员组,有日志查看、服务重启的 sudo 权限。data:数据分析组,只读访问数据目录。
建组和调整成员的常用命令:
groupadd dev usermod -aG dev zhangsan gpasswd -a lisi dev gpasswd -A zhangsan dev # 指定组管理员usermod -aG里的-a是 append,不加-a会把用户从原有附加组里踢出去。这个坑我提醒过无数次:有同事想给用户加个组,结果把用户从wheel组里踢了,管理员权限当场消失,权限变更还没人发现。
组确定之后,文件权限用"属主 + 属组 + 其他"三层模型来控制。举个例子,项目代码目录这样设置:
mkdir /srv/project chown root:dev /srv/project chmod 2770 /srv/project2770里的2是 setgid 位,作用是这个目录下新建的文件自动继承dev组,而不是创建者的主组。这样团队成员互相创建的文件都能互相读改,避免了一堆chmod补救操作。这是我在多开发者的服务器上强烈推荐的做法,理解起来很简单:目录上贴一个"此目录内文件都归 dev 组"的便签。
2.4 用户删除、锁定与审计:善后比创建更重要
用户离职或者不再需要访问权限时,最忌讳的是图省事直接userdel zhangsan。这个命令默认不删家目录和邮件池,留下的是无主文件和残留账号。
我的标准流程是:
- 先锁定账号:
usermod -L zhangsan或passwd -l zhangsan。 - 确认没有进程还在跑:
ps -u zhangsan。 - 导出或归档家目录里的业务数据,再决定删除方式。
- 清理账号:
userdel -r zhangsan(-r会连家目录和邮件池一起删,慎用)。 - 最后审计一遍相关 crontab、systemd 定时器、sudoers 里的规则。
锁定账号这事也有讲究。usermod -L是在/etc/shadow的密码哈希前加!,达到禁用密码登录的效果,但密钥登录依然可能生效。要彻底禁止登录,可以考虑把用户的 Shell 改成/sbin/nologin:
usermod -s /sbin/nologin zhangsan或者更彻底一点,锁定账号的同时调整 Shell,双保险。日常审计时,我会定期跑一条命令把"有登录 Shell 且密码近期未变更"的账号列出来:
awk -F: '($7 != "/sbin/nologin" && $7 != "/bin/false" && $3 >= 1000) {print $1}' /etc/passwd再配合chage -l抽查密码策略。这套流程看起来啰嗦,但正是这些重复动作,让服务器在被入侵之前就提前关掉了大部分风险敞口。
3. Sudo 权限精细化控制:从入门到进阶
3.1 sudoers 语法拆解:一条规则读作一句话
sudo的精髓全在/etc/sudoers文件里。它最常见的规则格式是:
user host=(runas) command翻译成大白话就是:谁(user),在哪台机器上(host),能以什么身份(runas),执行什么命令(command)。很多人刚看这个格式容易懵,我建议你用这个句式去读每一条规则,读通之后就会觉得它其实非常直白。
实际例子:
zhangsan ALL=(ALL) /usr/bin/systemctl读作:zhangsan 在任意主机上,能以任意身份,执行systemctl命令。注意这里只允许 systemctl 这一个命令,除了它之外,zhangsan 没有别的提权能力。
再进阶一点:
%ops ALL=(root) /usr/bin/systemctl restart httpd这条规则里%ops表示 ops 组的所有成员,(root)表示只能以 root 身份,命令精确到了systemctl restart httpd。这意味着用户不能执行systemctl stop httpd、不能改别的服务。这,就叫精细化。
sudoers 还支持标签(Tags),最常用的是NOPASSWD::
zhangsan ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx意思是执行这条命令不用输密码。适合自动化脚本和频繁重启服务的场景,但使用要克制——NOPASSWD越多,暴力破解后的损失越大。我的经验是:交互式操作保留密码验证,自动化专用账号才用 NOPASSWD。
3.2 重要提醒:编辑 sudoers 必须用 visudo
直接vim /etc/sudoers是新手最常见的错误。这个文件有严格的语法,写错一句整台机器的 sudo 就废了,还会连锁导致你连提权修复的机会都没有。
visudo的作用是:编辑前锁定文件、编辑后自动校验语法,并且在你保存退出时确认没有语法问题才真正生效。操作方式:
visudo打开的其实是同一个文件,只是多了保护。如果语法错误,visudo 会提示类似:
>>> /etc/sudoers: syntax error near line 23 <<<这时候它不会让你直接退出,会问你是要e重新编辑、x放弃改动,还是q强行退出。选了q才会真正写入错误的文件,选e回去改掉,一切安全。
再次强调:所有 sudoers 的改动,一律
visudo。再着急也别直接编辑文件。如果哪天真不小心把 sudoers 改坏了导致无法提权,可以参考本文第 5 章的单用户模式恢复方法。
对于复杂规则,我更推荐把配置写进/etc/sudoers.d/目录下的独立文件,而不是全堆在主文件里。比如:
visudo -f /etc/sudoers.d/ops_policy这样做的好处一是按业务拆分,好维护;二是升级系统时不会因为主文件冲突导致扑街。注意/etc/sudoers.d/下的文件名不能有.和~结尾(具体要求看 visudo 的 man page),而且文件的权限必须是 root:root 且 0440,否则 sudo 会直接忽略它并报错。
3.3 别名机制:批量授权不再靠复制粘贴
服务器多了、人多了之后,一条条写规则会非常啰嗦。sudoers 的别名机制就是为批量管理设计的。别名分四类:User_Alias、Host_Alias、Cmnd_Alias、Runas_Alias。
我实际生产里的配置类似这样:
# 定义用户别名 User_Alias ADMINS = zhangsan, lisi, wangwu User_Alias DEV_TEAM = %dev, %qa # 定义命令别名 Cmnd_Alias SERVICE_CTRL = /usr/bin/systemctl, /usr/bin/service Cmnd_Alias LOG_VIEW = /usr/bin/tail, /usr/bin/grep, /usr/bin/less Cmnd_Alias PKG_MGMT = /usr/bin/yum, /usr/bin/dnf # 授权规则 ADMINS ALL=(ALL) ALL DEV_TEAM ALL=(ALL) NOPASSWD: SERVICE_CTRL, LOG_VIEW注意Cmnd_Alias里写的是命令的完整路径,因为 sudo 匹配的是路径而不是命令名。用which systemctl查路径,别凭记忆写。路径写错的结果就是用户明明有权限,执行时报 command not allowed,排查起来还以为是权限问题。
ALL是最危险的词,能用具体值就别用ALL。ADMINS ALL=(ALL) ALL这种规则,本质上是把 root 权限交给了 ADMINS 里的所有人。所以 ADMINS 的成员要极其克制——这是"管理员",不是"所有能用 sudo 的人"。
还可以用!做排除,比如:
zhangsan ALL=(ALL) ALL, !/usr/bin/passwd root, !/usr/bin/su表示 zhangsan 有全权,但不能改 root 密码、不能切换 root。这种"先放后堵"的写法在 sudoers 里是合法的,但顺序敏感——sudoers 是顺序匹配,后面的规则会覆盖前面的。实际项目里我很少用排除法,因为安全模型应该默认拒绝、白名单放行,而不是默认全员、再一个个封。排除法容易漏,维护成本高。
3.4 别忘了 Defaults 参数:sudo 的行为也能定制
sudoers 里除了授权规则,还有一堆Defaults参数控制 sudo 的行为细节,这些参数决定了你的 sudo 有多安全、多顺手。
Defaults env_reset Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin Defaults timestamp_timeout = 5 Defaults logfile = "/var/log/sudo.log" Defaults log_input, log_outputenv_reset:重置环境变量,防止用户通过环境变量注入影响执行的命令。默认就是开启的,别去关。secure_path:关键中的关键。它定义了 sudo 环境下的 PATH,防止用户在普通环境里放一个同名恶意脚本劫持 sudo 执行的命令。很多"sudo: xxx command not found"的诡异问题,也是因为命令不在 secure_path 里。timestamp_timeout:一次输密码后的有效时间,默认 5 分钟,单位是分钟。设成 0 表示每次都要输密码,设成 -1 是永不过期(极度不推荐)。log_input, log_output:记录 sudo 会话的输入输出流,适合用来做操作审计。日志会记录用户敲了什么以及执行结果,出问题时有据可查。mail_badpass、mail_always:失败密码或每次执行都发邮件提醒,小规模环境有价值。
这些参数我建议先在测试机上用sudo -l验证再上生产。sudo -l能列出当前用户实际拥有的权限,是排查权限问题最顺手的工具,后面会专门说。
3.5 sudo 日志与审计:出事时不背锅的底气
sudo 默认用 syslog 记录到/var/log/secure(RHEL 系)或/var/log/auth.log(Debian 系)。如果你和我在同一套配置里设置了logfile,那审计日志就独立出来了,方便集中收集和分析。每一条 sudo 执行记录大体包含:时间、主机、用户名、执行的命令。例如:
Mar 12 10:24:31 web01 sudo: zhangsan : TTY=pts/0 ; PWD=/home/zhangsan ; COMMAND=/usr/bin/systemctl restart nginx这行日志就是"谁在什么时间、在哪台机器、执行了什么命令"的完整铁证。生产环境的排障和追责,靠的就是这些记录。我是建议再叠加一层:把 sudo 日志通过 syslog 转发到集中的日志服务器,或者至少每天做一次归档,别让日志只留在本机——服务器被重置或者日志文件被清理的时候,你已经拿不出任何追溯材料了。
4. 三个真实场景的完整配置流程
4.1 场景一:给开发人员配置"能重启服务但不能碰系统"的权限
背景:某项目组有三位开发(张三、李四、王五),需要在测试服务器上重启 nginx 和查看日志,但绝不能有 root 的完整权限,更不能改系统配置。
第一步,建组并加入用户:
groupadd devops useradd -m -s /bin/bash -G devops zhangsan useradd -m -s /bin/bash -G devops lisi useradd -m -s /bin/bash -G devops wangwu passwd zhangsan第二步,写 sudoers 规则:
visudo -f /etc/sudoers.d/devops内容如下:
%devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx %devops ALL=(ALL) /usr/bin/tail, /usr/bin/less第三步,验证:
su - zhangsan sudo -l sudo systemctl restart nginx sudo systemctl stop nginx # 这条应该被拒绝sudo systemctl stop nginx会在日志里报 command not allowed,这正好证明规则生效了。这种"细到命令"的授权,比给整个 wheel 组权限安全一个数量级。
这里有个细节要强调:白名单里写了systemctl restart nginx,但用户依然可以用systemctl start nginx或systemctl stop nginx绕过吗?不会,因为 sudo 匹配的是整条命令字符串,路径和参数都对得上才放行。当然,严格说 systemctl 本身支持通配,为了绝对安全你甚至可以用!排除危险参数。测试环境里这个粒度够用了。
4.2 场景二:开启完整的 sudo 审计,日志独立落盘
背景:服务器上有多位管理员,老板要求能追踪每个管理员执行过的所有提权操作。
操作步骤:
visudo在 sudoers 中添加或确认以下 Defaults:
Defaults logfile = "/var/log/sudo.log" Defaults log_input, log_output Defaults iolog_dir = "/var/log/sudo-io" Defaults timestamp_timeout = 2保存退出后,把日志目录做好权限设置:
mkdir -p /var/log/sudo-io chmod 700 /var/log/sudo-io chown root:root /var/log/sudo-iolog_input和log_output开启后,sudo 会把用户的输入输出按会话记录在iolog_dir下,这个功能对"审计用户到底干了什么"极其有用。回放命令记录可以用sudoreplay:
sudoreplay -l # 列出记录 sudoreplay -d /var/log/sudo-io <session_id> # 回放这套配置我建议至少在管理级账号的机器上开启。日常使用无非是多写点日志,磁盘开销可以忽略,但真到了"谁删了文件、谁改了配置"的扯皮时刻,它就是唯一的裁判。
4.3 场景三:快速把普通用户加入 sudo 权限组
这个场景最贴近日常:来了个新同事,你只需要给他 sudo 资格但不细管命令。
RHEL/CentOS 系统:
usermod -aG wheel zhangsanDebian/Ubuntu 系统:
usermod -aG sudo zhangsan改完让用户重新登录,执行sudo -l检查。两个发行版的差别在于:RHEL 系里wheel组的 sudo 规则默认在/etc/sudoers里就有了,Debian 系则对应sudo组。非要在这套场景里也做精细化,建议别用默认组,而是像场景一那样单独建组、单独写规则。
这里提醒一句:不要把用户同时加进多个管理员组。我见过把用户既加进wheel又加进sudo的,其实没坏处,但会增加审计的混乱度。保持"一个用户对应一套清晰的权限来源",排查问题时会省很多事。
5. 常见问题与排查技巧实录
5.1 "xxx is not in the sudoers file"到底怎么破
新用户第一次sudo,几乎都会撞见类似这样的报错:
[zhangsan@web01 ~]$ sudo yum install tigervnc-server [sudo] password for zhangsan: zhangsan is not in the sudoers file. This incident will be reported.第一反应别慌,这个报错的意思是:用户没有被任何 sudo 规则覆盖。排查路径非常固定:
- 确认用户是否在正确的管理员组里:
id zhangsan,看输出里有没有wheel或sudo。 - 缺组就补:
usermod -aG wheel zhangsan。 - 重新登录,再
sudo -l验证。 - 如果组没问题,检查 sudoers 文件及其
/etc/sudoers.d/下所有规则,看有没有%wheel或对应组的授权行。
注意"重新登录"不是可选项。用户当前的登录会话持有的组信息是旧的,就算你加了组,当前会话的sudo也可能感知不到。让用户退出重登,或者干脆执行su - zhangsan切换一次,这是最容易忽略的一步。
5.2 sudoers 语法错误连累所有用户怎么办
这属于"手滑造成的重大事故":你或者同事直接编辑了/etc/sudoers,写错一行语法,然后所有用户的 sudo 都挂了,连你自己都提不了权。我处理过不止一次。
解决思路是进入单用户模式修复。以 RHEL 系为例:
- 重启服务器,在 GRUB 菜单按
e进入编辑。 - 在
linux16或linux开头的行尾追加single(或init=/bin/bash)。 - 按
Ctrl+X引导进入单用户模式。 - 以只读方式挂载根文件系统后重挂为读写,修正 sudoers 文件。
- 重新启动。
严格命令清单因发行版有差异,但思路一致:进入没有 sudo 依赖的最小环境,把文件改回来。Ubuntu 等系统可能还需要mount -o remount,rw /,不然文件系统只读没法写。
防止这种事故的最好办法永远只有一个:动 sudoers 只走visudo,并且养成备份的习惯:
cp /etc/sudoers /etc/sudoers.bak.$(date +%F)有备份在手,恢复就是一次拷贝的事,而不是在单用户模式里手忙脚乱。
5.3 权限相关的其他高发坑
我把这些年遇到的高频问题整理成了一张速查表,供你排查时直接对照:
| 现象 | 常见原因 | 解决方向 |
|---|---|---|
sudo: xxx: command not found | 命令不在secure_path里,或用了相对路径 | 用绝对路径写规则,检查 secure_path |
/etc/sudoers.d/xxx被忽略 | 文件名含.或~,或权限不对 | 改名,chown root:root,chmod 0440 |
| 用户执行命令要输入密码但不想输 | 未配NOPASSWD:标签 | 在规则命令前加NOPASSWD: |
| sudo 总是提示密码(明明刚输过) | timestamp_timeout太短,或环境变量被重置 | 调整 timestamp_timeout,确认 env_reset |
| 用户有权限但仍被拒绝 | 命令路径写错,或规则顺序靠后被覆盖 | sudo -l查实际生效规则 |
| 文件权限问题但改不动 | 文件属主不是用户,或目录缺写权限 | 用 root 处理属主属组,或用 ACL |
另外再补一个常见误区:很多人以为sudo su -和sudo -i是一样的。其实sudo su -是"先用 sudo 执行 su,然后 su 切换 root",而sudo -i是"直接以 root 身份启动一个登录 Shell",两者在环境变量继承上有细微差别。日常使用推荐sudo -i,干净直接,也少一层 su 的审计盲区。
5.4 排查权限问题的通用套路
如果上面的表格没覆盖到你的情况,我一般遵循这个排查顺序:
id看用户和组归属是否符合预期。sudo -l看实际生效的权限列表。visudo -c校验 sudoers 文件语法。- 看认证日志:
tail -f /var/log/secure或/var/log/auth.log。 - 检查
/etc/sudoers.d/下所有文件:grep -r "" /etc/sudoers.d/。
visudo -c特别实用,它不只是检查语法,还会报告每个文件的加载状态。如果某个文件因为权限或命名问题被忽略,它会直接提示,省得你盲目猜测。
这套排查顺序练熟了,处理权限问题就是流水线作业:先看身份对不对,再看规则有没有,再看日志说了什么。90% 的问题在这三步内就能定位。
6. 实操心得与后续扩展
写了这么多,最后说几句实际体会。我在生产环境里踩过最多的坑,几乎都源于同一个心理:"先给权限,出了问题再收"。但权限这事的特性是:给出去容易,收回极难。一个用户如果已经习惯了某个 sudo 权限,你再想收回来,轻则引起抱怨,重则业务流程中断。所以我现在的原则是:新用户一律先给最小权限,明确需求之后再加;每周用脚本扫一遍 sudoers 和用户状态,看看有没有"僵尸权限"。
另外一个很实用的习惯:所有服务器都启用 sudo 日志+主机名记录,并且在搭建好之后,特意用一个临时账号执行若干危险命令,确认日志里全部有迹可循。这个"自测审计链路"的习惯帮我提前发现过好几次日志配置失效的问题,比出事之后再回头查日志靠谱得多。
这篇文章覆盖的内容,本质上是你踏上 Linux 系统管理之路的"第一性原理":用户是身份的锚点,sudo 是动作的闸门。把这两样整理利索了,后面学 SELinux、学容器安全、学云上权限体系,都会顺畅很多。最后再补一条小技巧:定期跑一遍awk -F: '($3 == 0) {print}' /etc/passwd,看看 UID 0 的账号是否只有 root 一个——这个习惯我保持了十年,它曾不止一次帮我发现被偷偷埋下的后门账号。安全管理无大事,也无小事,所谓"精细化",就是从这些不起眼的日常检查里一点点长出来的。