等保2.0 Linux基线检查实战:从身份鉴别到安全审计的命令手册
简介《主机安全 - Linux操作系统基线检查指导书1.0版》是一份面向Linux系统运维、安全基线核查及等保合规测评人员的PDF文档适用于企业内网服务器上线前或等级保护测评准备阶段的主机安全自检与加固场景。文档框架来源于启明信息安全中心围绕身份鉴别、访问控制、安全审计三大核心控制类别展开以“检查项-检查方法-预期结果-符合情况”表格化方式呈现并给出pwdck、cat /etc/passwd、cat /etc/shadow、cat /etc/login.defs、cat /etc/pam.d/system-auth等常用检测命令及验证示例覆盖口令复杂度、登录失败锁定、权限分离、默认账户处置、敏感标记与审计日志配置等合规核查点便于读者逐项对照并快速定位不合规项。资源包共1个pdf文件整体大小约402KB结构紧凑、条款分级明确。已有289人学习下载可作为等保自查、安全培训或日常运维巡检的速查手册。1. 这不是一份PPT等保 Linux 基线检查到底查什么如果你经历过等保测评现场一定见过这种场面测评师指着终端问「口令策略在哪配的登录失败锁定几次审计有没有覆盖到普通用户」旁边的人翻开系统设置翻了半天最后只能支支吾吾。这份《主机安全检查指导书Linux 操作系统 V1.0》就是把这类问题提前拆平的落地手册。它把 Linux 基线检查拆成「检查项、检查方法、预期结果、符合情况」四列覆盖身份鉴别、访问控制、安全审计、剩余信息保护、入侵防范、恶意代码防范、资源控制七大类别每条都给到可复现的命令和判断标准。适合三类人准备等保达标自查的运维、接整改项目的集成商、刚接手 Linux 主机安全的新手。2. 身份鉴别四件事口令策略、登录失败、SSH 加密与 UID 唯一性身份鉴别是等保 2.0 主机安全的第一个大类也是测评师最爱深挖的部分。它表面上是「看配置」实际上是「看你能不能解释清每条命令背后的策略逻辑」。我按检查顺序拆成四块口令文件一致性、口令复杂度策略、登录失败处理、远程管理加密与账户唯一性。2.1 先跑一轮组合命令pwdck、passwd/shadow 与 login.defs# 1) 检查 /etc/passwd 和 /etc/shadow 是否出现不一致空口令、无对应账户等 pwdck -n ALL # 2) 查看口令有效期策略 cat /etc/login.defs | grep -E ^PASS_ # 3) 查看 shadow 中是否存在密码字段为空的账户 awk -F: ($2 || $2!){print empty/disabled:, $1} /etc/shadow # 4) 查看是否有 UID0 的账户非 root 的 UID 0 账户是典型的提权后门 awk -F: ($30){print uid0:, $1, $3} /etc/passwd第一条pwdck -n ALL是文档里明确给的检查法。它在 RHEL/CentOS 上输出为空说明 passwd 和 shadow 两个文件内容一致没有空口令、也没有影子文件缺失这类低级问题如果输出了报错信息说明这两个文件被人手工改过得翻开逐行对。第二条直接过滤login.defs里的 PASS_ 开头项这就是口令生命周期的总开关我一般在生产环境看到的标准值是PASS_MAX_DAYS 90、PASS_MIN_DAYS 大于0、PASS_MIN_LEN 不小于8、PASS_WARN_AGE 不小于7。第三条 awk 找 shadow 第二列为空或为!的用户正常用户的第二列是一长串加密哈希为空代表无口令、为!代表锁定这两种都属于「密码为空或不可用」的可疑状态。第四条是我自己习惯追加的筛法把 UID 为 0 的账户全部列出来正常情况只能有 root 一个多出来的每个都要查。这一步对应的预期结果是系统使用口令鉴别机制、错误口令或空口令无法登录、不存在密码为空的用户。做完这三件事身份鉴别的「基础面」就算立住了。2.2 登录失败处理pam_tally2 与 faillock 的两种写法# 查看当前登录失败处理配置RHEL/CentOS 7 以下看 system-auth新版看 password-auth cat /etc/pam.d/system-auth # CentOS 6 时代常见的 tally2 写法 # auth required pam_tally2.so deny5 unlock_time600 even_deny_root # account required pam_tally2.so # CentOS 7 常见的 faillock 写法两条 auth 一条 account # auth required pam_faillock.so preauth audit silent deny5 unlock_time600 # auth [defaultdie] pam_faillock.so authfail audit deny5 unlock_time600 # account required pam_faillock.so这里要特别注意 pam 模块的放置顺序这也是很多人翻车的地方。faillock 的preauth行必须放在 auth 段的最前面authfail行放在 auth 段靠后的位置account段必须单独加一行pam_faillock.so。只有authfail没有preauth锁定逻辑不会在密码验证前生效等于白配。deny5表示连续失败 5 次锁定unlock_time600表示锁 600 秒even_deny_root表示 root 也参与锁定——这个参数在测评时是加分项但生产环境要掂量清楚root 被锁后如果带外控制台和单用户模式都没配置好就只能进机房了。文档要求「超过系统规定的非法登录次数时系统锁定或自动断开连接」。实际验证方法是故意输错密码超过 deny 次数观察系统是否提示账户被锁定。这一步在测评里通常是现场演示所以我一般在交付前先做一轮真实测试别到了现场第一次试。2.3 SSH 加密确认与 UID 唯一性测试# 确认远程管理走 SSH检查是否禁用明文协议telnet、rlogin 等 grep -E ^(Protocol|PermitRootLogin|PasswordAuthentication) /etc/ssh/sshd_config netstat -tlnp | grep -E :(23|513|514)\b || echo no telnet/rlogin listed # 测试 UID 唯一性不加 -o 重复分配已存在的 UID 应失败 useradd -u 0 hacker echo useradd exit: $?Protocol 2表示只允许 SSHv2PermitRootLogin在测评中建议设为prohibit-password或noPasswordAuthentication看企业内部策略如果配了密钥登录可以设 no。检查 23、513、514 端口有没有 listen23 是 telnet、513 是 rlogin、514 是 rsh任何一个在监听都说明存在明文远程管理通道这就是文档里说的「没有采用明文的传输协议进行远程管理」的反面证据。UID 唯一性这条很多测试人员会顺手加个-o参数结果 useradd 成功了被记不符合。实际上useradd -u 0 hacker不带-o时系统会报UID 0 is not unique并以非 0 状态退出这正是文档预期的「添加测试账户不会成功」一旦带了-o等于显式要求系统允许重复 UID这就变成主动绕过检查了。最后文档里「采用两种或两种以上组合鉴别技术」属于面访项实践中常见应答是堡垒机 动态口令或 SSH 密钥 口令双因子提前把方案写在整改说明里测评时就不虚。3. 访问控制从 /etc/shadow 权限到三角色互斥账户访问控制这一类目表面是查文件权限底下埋的是「最小权限」和「权限分离」两条主线。我把检查路径拆成三节关键文件权限摸底、角色权限互斥与账户清理、敏感标记的实际落地。3.1 关键文件权限ls -l 之外再补一条 find# 查看关键文件和目录的权限、属主 ls -l /etc/passwd /etc/shadow /etc/gshadow /etc/sudoers /etc/grub.conf /etc/rc.local # 找出系统目录中权限过宽的常规文件other 位可写 find /etc /usr/lib/systemd /opt -type f -perm -0002 2/dev/null | head -50预期值很固定/etc/shadow和/etc/gshadow应该是 600 或 000/etc/passwd是 644/etc/sudoers是 440/etc/grub.conf是 600/etc/rc.local不低于 750。这些文件如果权限放宽到 666 或 777意味着任意低权限用户都能改系统账户或开机启动项属于严重不符合项。第二行 find 是查普通文件里 other 位带写权限的-perm -0002匹配的是「其他人有写权限」的文件这类文件是提权链条的常见跳板我在交付检查时都会扫一遍。ls 命令本身是文档里给的检查法但 ls 只能看单点文件find 能看全局两者配合才能在测评现场把「重要文件已合理设置访问控制策略」这句话说圆。3.2 三角色互斥与默认账户处理# 分别创建系统管理、安全管理、审计管理三类账户并加入对应组 useradd -g sysadmin sysadmin useradd -g secadmin secadmin useradd -g auditadmin auditadmin # 查看账户归属确认没有一个用户同时属于两个管理组 groups sysadmin secadmin auditadmin # 列出所有可登录账户shell 不是 nologin/false 的定位多余或过期账户 grep -vE nologin|false /etc/passwd文档要求「系统管理员、安全管理员、安全审计员由不同人员担当权限互斥」。落到 Linux 上就是这三类账户不能有交集sysadmin 组的用户不能同时在 auditadmin 组里。如果公司人少至少要有两个独立管理账户一个管系统、一个管审计安全管理员职责可以挂在其中一人身上但用户名必须独立。第三行grep -vE nologin|false是清理多余过期账户的核心命令输出里除了 root、管理和业务账户出现 games、ftp、mail 这类历史账户都要逐一确认不需要就userdel掉防止共享账户和僵尸账户留痕。默认账户处理这个点要单独说。文档写的「重命名系统默认账户、修改默认口令、禁用来宾账户」在 RHEL/CentOS 上很少真的把 root 改名因为一堆服务脚本硬编码了 root 的 UID 和名称。常见做法是保留本地 root但把 SSH 远程登录禁掉同时把 guest 这类来宾账户直接userdel或锁定。测评时把这个解释写清楚配合 shadow 里锁定账户的状态一般能过。3.3 敏感标记落地SELinux 与文件安全上下文# 查看 SELinux 运行模式生产环境建议 Enforcing getenforce # 查看重要文件/目录的安全上下文敏感标记 ls -Z /etc/passwd /etc/shadow /var/www/html # 给业务资源打上明确的类型标记以 Web 目录为例 chcon -t httpd_sys_content_t /data/webapp/文档里「对重要信息资源设置敏感标记」「依据安全策略严格控制用户对有敏感标记信息资源的操作」乍看像概念题实际对应的就是 SELinux 的安全上下文。getenforce返回Enforcing才算真正开启Permissive或Disabled都要记不符合或部分符合。ls -Z查看的 SELinux 标签就是这套体系里的「敏感标记」。chcon是临时改标签重启后可能被恢复要永久生效就得用semanage fcontext加规则再restorecon。测评中不需要把所有文件都打标只要关键业务目录有独立的安全上下文、SELinux 处于 enforcing就能证明「设置了敏感标记并且能通过标记控制访问」。4. 安全审计与剩余信息保护auditd 规则、审计报表和三处必查配置安全审计这一类目测评师最看重的是「审计规则覆盖面和报表可读性」。很多人 auditd 开着但规则只有默认那几条一问审计内容就露馅。这章把审计服务确认、规则写法、报表生成、剩余信息保护四件事串起来。4.1 先确认审计服务syslog 和 auditd 一个都不能少# 确认系统日志服务和内核审计服务都在运行 ps -ef | grep -E syslog|rsyslog|auditd | grep -v grep # 查看审计守护进程的关键配置 grep -E ^(max_log_file|num_logs|space_left|action_mail_acct) /etc/audit/auditd.conf第一行是文档给的手工检查法rsyslog负责系统日志auditd负责内核审计两者都在才算「审计功能已开启」。第二行看审计自身的持久化配置我一般把max_log_file设成 100单位 MBnum_logs保留 5 个轮转文件space_left设成 75剩余空间低于 75MB 触发告警action_mail_acct填审计员邮箱。这套参数的意义是日志轮转和空间告警都有了审计进程不会因为磁盘满而静默停摆对应文档里「保护审计进程避免未预期中断」的要求。4.2 audit.rules 的写法-w 路径够了关键操作别漏# 将规则写入持久文件再加载RHEL/CentOS 7 的推荐方式 cat /etc/audit/rules.d/hostsec.rules EOF -w /etc/passwd -p wa -k user_passwd -w /etc/shadow -p wa -k user_passwd -w /etc/sudoers -p wa -k sudoers -w /var/log/audit/ -p wa -k audit_log -a always,exit -F archb64 -S openat -F auid1000 -F auid!4294967295 -k user_open EOF augenrules --load auditctl -l-w是监控路径-p wa表示记录写和属性变更-k是给这组规则打标签。文档要求的审计内容——用户的添加和删除对应 passwd/shadow 变更、权限变更对应 sudoers、审计策略的调整对应 audit_log 目录、系统资源异常使用——这些路径规则都能覆盖。最后一行-a always,exit -F archb64 -S openat -F auid1000记录所有 64 位进程的 openat 系统调用但auid1000限定只记录普通用户auid!4294967295把内核线程排除掉否则日志量会大到失控。加载后auditctl -l列出的就是实际生效的规则。4.3 审计报表能翻出来才叫配置好# 按标识查关键事件t 是今天recent 是最近 10 分钟 ausearch -k user_passwd -ts today # 生成认证审计报告和汇总报告 aureport -au -i aureport --summary # 定时生成报表的简单做法加入 crontab # 30 2 * * * aureport -l --failed /var/log/audit/report_$(date \%F).txt 21ausearch -k user_passwd能把 passwd/shadow 的改动记录全部筛出来-ts today限定时间范围。aureport -au是认证审计报告能看到所有登录成功和失败记录--summary是一页概要。文档要求「根据记录数据进行分析并生成审计报表」最简单可复现的方式就是 crontab 定时把aureport的输出落盘成文件留痕既清晰又好看。审计记录里的日期、时间、类型、主体标识、客体标识、结果六要素SYSCALL 类型的事件天然全带不用担心缺项。4.4 剩余信息保护banner 和 swap 两件事# 清空登录前和登录后的系统信息 banner避免泄露发行版和内核版本 cat /dev/null /etc/motd cat /dev/null /etc/issue cat /dev/null /etc/issue.net # swap 中的残留数据需要 swapoff 再 swapon 才能彻底清除 swapoff -a swapon -a/etc/issue是本地登录前显示的/etc/issue.net是 SSH/telnet 登录前显示的/etc/motd是成功登录后显示的这三处如果保留默认内容会把发行版名称和内核版本直接暴露给所有能连到端口的人文档里明确要求删除。swap 那一行要特别谨慎文档原文写「linux 默认会清除 swap 中的存储内容」但实际只有swapoff -a再swapon -a才真正把交换分区内容抹掉生产业务机执行这一步前先确认内存余量足够否则在高峰时段做会导致业务进程被换出甚至 OOM。我一般建议低峰窗口操作或者只在测试机演示。5. 入侵防范、恶意代码与资源控制最小安装、补丁、防病毒到 TMOUT入侵防范和恶意代码防范在测评里属于「看服务、看补丁、看杀毒、看资源限制」的硬核面每条都要拿得出命令输出。这章按最小安装、补丁与完整性、防病毒与资源控制三个维度展开。5.1 最小安装原则与危险服务关停# 列出所有正在运行的服务老系统用 service新系统用 systemctl service --status-all 2/dev/null | grep running systemctl list-units --typeservice --staterunning # 查看开机自启的服务 chkconfig --list | grep :on systemctl list-unit-files --typeservice | grep enabled # 发现危险服务先停止再关闭自启以 echo 为例 service echo stop chkconfig echo off文档里点名要求关闭的危险网络服务实践中按这个表核对服务名风险说明echo / chargenUDP 反射放大攻击的常见载体shell / login / finger明文协议或泄露用户信息rsh / rlogin / rexecr 命令族无加密认证talk / ntalk明文即时通信sendmail / imapd / pop3d非必要邮件服务常被利用service --status-all在 CentOS 6 上适用CentOS 7 用systemctl两套命令都要会。凡是在运行列表里出现 echo、chargen、rsh 这类服务直接 stop 加 chkconfig off 或 systemctl disable 关掉。输出剩下来的服务越少越能说明「遵循了最小安装原则」这是对应「非必要服务没有启动、非必要端口没有打开」的预期。5.2 补丁更新机制与程序完整性# 查看最近安装的补丁包和关键软件版本 rpm -qa --last | head -20 rpm -q kernel glibc openssh-server # 确认补丁源指向内部镜像示例配置 # cat /etc/yum.repos.d/internal.repo # [internal] # nameinternal-updates # baseurlhttp://repo.internal.example.com/centos/$releasever/os/x86_64/ # gpgcheck1 # 完整性和基线比对以 aide 为例 aide --init mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz aide --checkrpm -qa --last按安装时间倒序列出所有包一眼能看出最近有没有补丁进来。文档要求「补丁先测试再升级、补丁号较新」对应到流程上就是内部 yum 源先同步官方仓库测试机打完补丁验证业务无异常再推到生产。完整性检测最常用的开源工具是 aideaide --init生成基线数据库注意生成的是aide.db.new.gz必须手动mv成aide.db.gz否则aide --check找不到基线库。之后任何文件被篡改check 输出都会列出变更路径这就是文档里「检测到完整性受到破坏后具有恢复措施」的落地证据——先用rpm -V定位被改的包再重装恢复。5.3 恶意代码防范与资源控制参数# 检查主机防病毒软件及病毒库版本ClamAV 示例 clamscan --version freshclam 21 | tail -3 # 限制终端登录来源tcp_wrappers 方式 cat /etc/hosts.deny cat /etc/hosts.allow # 会话超时锁定与单用户资源限制 grep -E ^export TMOUT /etc/profile grep -vE ^#|^$ /etc/security/limits.conf病毒库要看的不是装了没有而是日期。freshclam拉更新后clamscan --version里会带病毒库版本号和发布日期测评现场打开这条输出胜过解释半天。文档要求的「主机防恶意代码产品应具有与网络防恶意代码产品不同的恶意代码库」在实际项目里体现为主机用 ClamAV 或国产终端安全软件网络侧用防火墙/IPS 的病毒库两者来源不同、更新通道独立。资源控制部分/etc/hosts.deny预期写all:all/etc/hosts.allow里只放运维网段 IP顺序反了等于白设。TMOUT是会话超时秒数一般设 600 秒并加readonly防止用户自己取消。limits.conf里常见做法是给运维人员配nofile 65535、nproc 4096限制单个用户对 CPU、内存、文件句柄的最大使用量这是文档 d、e 两项的答案。6. 高频排查记录三个测试里最容易翻车的场景与修复做这套检查大半年踩过的坑基本集中在三个地方写出来给后面接手的人省点时间。这三个坑都是我自己或同事在现场真实翻车过的每条按现象到原因到解决讲清楚。排查一UID 唯一性测试用错参数。现象是测评要求「添加与原用户 UID 相同的账户不会成功」测试人员在命令里顺手加了个-o结果useradd -o -u 0 hacker成功创建了账户被记了个不符合。原因是 useradd 默认会检查 UID 唯一性并报错退出-o是显式允许重复 UID 的选项加了它等于主动绕过系统检查。解决方法是测试时只用useradd -u 0 hacker不带-o看到UID 0 is not unique且命令返回非 0才是文档预期的「添加测试账户不会成功」。排查二改 /etc/pam.d/system-auth 把自己锁在门外。现象是改完 pam 配置后SSH 登录任何账户都报 permission denied连 root 也进不去。原因是 faillock 的preauth行位置放错或模块路径写错PAM 整条认证链直接拒绝所有登录。解决方法是登录前先开启第二个会话窗口把改前cp的备份文件还原或者通过带外控制台/单用户模式恢复。从那以后我每次动 PAM 都先cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak.$(date %F)改完立刻开一个新 SSH 会话验证通过才敢关旧窗口。排查三auditd 规则写重导致服务重启失败。现象是service auditd restart报规则冲突或内存不足服务起不来审计记录断档。原因是在/etc/audit/rules.d/下多个文件里重复加了相同的-w路径或规则总量超过内核审计缓冲区上限。解决方法是先用augenrules --load看具体报错把重复规则删掉只留一份规则确实多就调大内核缓冲auditctl -b 8192再重新加载。从那以后我每次写审计规则都先auditctl -l确认当前生效列表再追加新规则避免重复加载。这三个坑都有一个共同解法改任何配置前先备份备份了才有后悔药。希望帮到你。本文还有配套的精品资源点击获取