ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux主机安全基线检查实操指南:从命令到脚本

Linux主机安全基线检查实操指南:从命令到脚本 简介这份《Linux操作系统基线检查指导书1.0版》面向主机安全运维人员、等保测评从业者及信息安全初学者聚焦Linux服务器安全合规自查场景帮助读者系统掌握基线核查的检查项、命令与预期结果。内容围绕身份鉴别、访问控制、安全审计等核心类别展开逐条给出检查方法与判定标准例如通过pwdck、cat /etc/passwd、cat /etc/login.defs等命令核验口令策略与空口令账户借助system-auth配置项确认登录失败处理与非法登录锁定并说明SSH加密传输、账户唯一性、权限分离及审计日志要素等要求可直接用于日常巡检与合规整改对照。资源包共1个PDF文件约402KB单文件结构便于按章节查阅与打印。目前已有289人学习下载适合需要快速建立Linux安全基线检查思路、对照命令逐项落地核查的读者参考使用。1. 一份能直接照着做的 Linux 基线检查清单到底长什么样很多做运维或者安全的朋友第一次接到等保测评或者内部合规检查的通知时心里其实是没底的。面对一台跑了几年甚至十几年的 Linux 服务器要从哪里开始查查什么命令敲下去返回什么结果才算合规这份《主机安全 - Linux操作系统基线检查指导书1.0版.pdf》就是来解决这个问题的。它不是那种泛泛而谈的安全科普而是一份按检查项、检查方法、预期结果三段式结构编排的实操手册。整份文档围绕身份鉴别、访问控制、安全审计、剩余信息保护、入侵防范、恶意代码防范、资源控制七个大类展开每一项都给出了具体的命令和判断标准。适合谁用系统管理员、安全运维、等保测评配合人员以及需要定期做主机安全自查的团队。你不需要从头到尾通读把它当成一本字典哪项拿不准就翻到哪一页照着敲命令、对结果就行。2. 身份鉴别与访问控制从 /etc/passwd 到权限分离的落地检查身份鉴别和访问控制是基线检查里最基础也最容易出问题的两块。很多服务器被扫出弱口令、空口令、权限过大根子都在这里。这一章把指导书里这两类的检查逻辑拆开配上可以直接复现的命令和判断依据。2.1 空口令账户排查与口令复杂度策略验证空口令是红线中的红线。指导书里给了两条路一条是用pwdck命令批量查另一条是直接翻/etc/passwd和/etc/shadow。实际环境中pwdck不一定有所以手工查 shadow 文件更通用。# 方法一使用 pwdck 检查所有账户的空口令情况部分系统可能未安装 pwdck -n ALL # 方法二直接查看 /etc/shadow 中密码字段为空的账户 # 密码字段为空表示无需密码即可登录密码字段为 !! 或 * 表示账户被锁定 awk -F: ($2 ) {print $1 存在空口令} /etc/shadow # 查看 /etc/passwd 中所有可登录 shell 的账户 grep -v /sbin/nologin\|/bin/false /etc/passwd第一条命令pwdck -n ALL在 AIX 上常见Linux 上不一定有返回为空说明没有空口令账户。第二条awk命令是通用做法直接解析/etc/shadow的第二个字段如果为空就打印用户名。第三条用来确认哪些账户是真正能登录的因为/sbin/nologin和/bin/false的账户即使有密码也无法交互登录排查时可以降低优先级。口令复杂度策略要看/etc/login.defs和 PAM 配置。指导书里明确要求长度不小于 8 位包含数字、大小写字母和特殊符号并且有更换周期。# 查看密码策略配置 cat /etc/login.defs | grep -E PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_MIN_LEN|PASS_WARN_AGE # 查看 PAM 中口令复杂度模块的配置 cat /etc/pam.d/system-auth | grep -E pam_cracklib|pam_pwquality|pam_unixPASS_MAX_DAYS控制密码最长使用天数一般建议 90 天以内PASS_MIN_LEN控制最小长度至少 8PASS_WARN_AGE是过期前多少天开始提醒。PAM 那行如果看到pam_pwquality.so或pam_cracklib.so后面通常会跟minlen8 ucredit-1 lcredit-1 dcredit-1 ocredit-1这类参数分别代表至少一个大写、一个小写、一个数字、一个特殊字符。如果这两处都没配那口令复杂度这项基本就是不符合。验证的时候别只看配置文件要实际创建一个不符合要求的用户试试。指导书里写得很清楚以不符合复杂度要求和不符合长度要求的口令创建用户时均应提示失败。# 尝试用短口令创建用户预期失败 useradd testuser passwd testuser # 输入 123 或 abc观察是否被系统拒绝 # 检查完毕后删除测试账户 userdel -r testuser这里有个细节有些系统 PAM 配置生效但login.defs没同步导致passwd命令能拦住但chpasswd或者脚本批量改密时绕过了策略。所以检查时最好两种方式都试一下。2.2 登录失败处理与远程管理加密的检查路径登录失败处理看的是/etc/pam.d/system-auth里有没有pam_tally2或pam_faillock模块。指导书要求启用登录失败处理、限制非法登录次数、自动退出结束会话。# 查看登录失败处理配置 cat /etc/pam.d/system-auth | grep -E pam_tally2|pam_faillock # 典型配置示例在 auth 段添加 # auth required pam_tally2.so deny5 unlock_time300 even_deny_root root_unlock_time600 # account required pam_tally2.sodeny5表示连续失败 5 次锁定unlock_time300表示锁定 300 秒后自动解锁。even_deny_root表示 root 账户也受限制root_unlock_time单独给 root 设置解锁时间。如果系统用的是pam_faillock配置在/etc/security/faillock.conf里参数含义类似。测试方法就是故意输错密码超过设定次数看系统是否锁定或断开。注意测试时别把自己锁死在外面建议先开一个已登录的会话保底。远程管理加密这块指导书要求确认是否使用 SSH 协议并且没有采用明文传输协议。检查方法很直接# 确认 SSH 服务正在运行 ps -ef | grep sshd # 查看当前监听的端口确认没有 telnet 等明文服务 netstat -tlnp | grep -E :23|:21 # 检查 SSH 配置中是否允许空口令登录和 root 直接登录 cat /etc/ssh/sshd_config | grep -E PermitEmptyPasswords|PermitRootLogin|ProtocolPermitEmptyPasswords必须是noPermitRootLogin建议设为no或prohibit-password。如果看到Protocol 1也要注意SSHv1 已经不安全了应该只保留 SSHv2。抓包验证明文传输这个操作指导书里提了但没展开实际做的时候可以用tcpdump抓一下管理端口的包看能不能直接看到密码字符串。如果能那肯定不符合。2.3 默认账户处理与权限分离的核查方法默认账户这块指导书要求重命名系统默认账户、修改默认口令、禁用来宾账户。检查命令就是看/etc/passwd里有没有guest、admin、root之外的异常账户。# 查看所有账户及其 UID cat /etc/passwd # 查看 UID 为 0 的账户除了 root 之外不应有其他账户 awk -F: ($3 0) {print $1} /etc/passwd # 查看账户的最近登录情况 lastlogUID 为 0 的账户必须只有 root 一个。如果发现第二个 UID 为 0 的账户那基本可以判定存在后门或者配置错误。lastlog可以帮你发现长期未登录的账户这些账户如果不需要就应该删除或锁定。权限分离检查的是系统管理员、安全管理员、安全审计员是否由不同人员担任权限是否互斥。指导书里提到至少要有系统管理员和安全管理员审计员在有第三方审计工具时可以不要求。实际操作中检查/etc/passwd和/etc/group里有没有专门的审计账户以及sudo配置是否做了角色划分。# 查看 sudo 配置确认权限分配 cat /etc/sudoers | grep -v ^# # 查看 wheel 组或其他管理组的成员 grep -E wheel|admin|sudo /etc/group如果所有管理操作都集中在 root 一个账户上没有单独的审计账户那权限分离这项就不符合。常见做法是创建auditadmin之类的账户只赋予查看日志的权限不赋予修改配置的权限。3. 安全审计与剩余信息保护auditd 配置与日志完整性验证安全审计和剩余信息保护是等保测评里容易被忽视但扣分很重的部分。很多服务器 auditd 装了但没配规则或者日志可以被随意删除这些都是硬伤。3.1 auditd 服务状态与审计规则配置指导书要求审计范围覆盖每个操作系统用户审计内容包括重要用户行为、系统资源异常使用、重要系统命令等。检查第一步是确认 auditd 和 syslog 是否在跑。# 检查审计服务进程 ps -ef | grep auditd ps -ef | grep syslog # 查看 auditd 配置文件 cat /etc/audit/auditd.conf # 查看审计规则 cat /etc/audit/audit.rulesauditd.conf里关注log_file、max_log_file、num_logs、space_left_action这几个参数。max_log_file控制单个日志文件大小num_logs控制保留多少个轮转文件space_left_action建议设为email或syslog这样磁盘快满时能告警。审计规则文件里至少要包含用户添加删除、权限变更、登录退出、审计功能启停这几类事件。典型规则如下# 监控用户和组文件变更 -w /etc/passwd -p wa -k user_modify -w /etc/shadow -p wa -k user_modify -w /etc/group -p wa -k group_modify # 监控 sudo 配置变更 -w /etc/sudoers -p wa -k sudoers_modify # 监控登录事件 -w /var/log/lastlog -p wa -k logins -w /var/run/utmp -p wa -k session # 监控审计配置变更 -w /etc/audit/auditd.conf -p wa -k audit_config-w指定监控的文件或目录-p wa表示监控写和属性变更-k是自定义的关键字方便后续用ausearch -k user_modify检索。规则改完后要重启 auditd 或者用augenrules重新加载。验证审计记录是否包含必要要素用ausearch或直接看日志# 查看最近的审计记录 ausearch -ts recent # 查看特定关键字的审计记录 ausearch -k user_modify # 直接查看审计日志文件 tail -50 /var/log/audit/audit.log每条记录里应该有time、type、pid、uid、auid、comm、exe、key这些字段。如果缺了主体标识或者结果字段那审计内容这项就不完整。3.2 审计进程与审计记录的保护措施指导书明确要求保护审计进程和审计记录避免被未预期中断、删除、修改或覆盖。检查方法是看有没有对审计进程做监控保护以及有没有把日志备份到专用服务器或存储设备。# 查看 auditd 是否设置了不可变模式 auditctl -s | grep enabled # 查看日志是否配置了远程备份 cat /etc/rsyslog.conf | grep -E | | grep -v ^#auditctl -s返回的enabled如果是2表示审计规则不可变只有重启才能修改这能防止攻击者运行时篡改规则。如果是1表示规则可变安全性稍弱。远程备份方面rsyslog.conf里如果有开头的行表示用 TCP 转发日志到远程服务器是 UDP。UDP 不可靠建议用 TCP。剩余信息保护这块指导书要求鉴别信息存储空间被释放或再分配前完全清除以及文件、目录、数据库记录所在存储空间被释放前完全清除。Linux 默认会清除 swap 中的内存内容但硬盘上的文件删除后数据块可能还能恢复。检查方法是看有没有使用shred之类的工具做安全删除或者有没有全盘加密。# 查看是否配置了 swap 清理 cat /etc/sysctl.conf | grep vm.swappiness # 查看是否有安全删除工具 which shred wipe # 查看 /etc/issue 和 /etc/issue.net 是否清除了系统信息 cat /etc/issue cat /etc/issue.net/etc/issue和/etc/issue.net如果包含操作系统版本、内核版本等信息建议清空或只保留法律声明。指导书里把这项归在剩余信息保护下逻辑是这些信息可能被攻击者利用来匹配漏洞。4. 入侵防范与恶意代码防范最小安装原则与防病毒部署入侵防范和恶意代码防范是主动防御的两道防线。指导书里的检查项偏管理但落地时有很多技术细节可以抠。4.1 最小安装原则与危险服务排查指导书要求系统遵循最小安装原则仅安装需要的组件和应用程序不必要的服务不启动不必要的端口不打开补丁及时更新。检查运行服务# 查看正在运行的服务 service --status-all | grep running # 查看监听端口 netstat -tlnp # 查看已安装的软件包 rpm -qa | wc -lservice --status-all在 systemd 系统上可能不适用可以用systemctl list-units --typeservice --staterunning替代。重点排查echo、shell、login、finger、r命令这些危险服务以及talk、ntalk、pop-2、sendmail、imapd、pop3d这些非必需服务。如果发现telnet、ftp在跑基本可以判定不符合因为指导书明确要求没有明文传输协议。补丁检查# 查看已安装的补丁RPM 系 rpm -qa | grep patch # 查看内核版本 uname -r # 查看系统更新记录 yum history # CentOS/RHEL apt list --installed # Debian/Ubuntu补丁升级机制这块指导书要求先测试再升级。实际操作中生产环境不会直接yum update而是先在测试环境验证再分批推。检查时看有没有配置内部 yum 源或者补丁管理平台。4.2 防恶意代码软件与病毒库更新检查指导书要求安装防恶意代码软件及时更新版本和病毒库主机防恶意代码产品与网络防恶意代码产品的恶意代码库不同并且支持统一管理。# 查看是否安装了防病毒软件以 ClamAV 为例 which clamscan clamscan --version # 查看病毒库更新日期 ls -l /var/lib/clamav/ # 查看防病毒服务状态 systemctl status clamav-daemon如果系统里没有任何防病毒软件这项直接不符合。有些环境用rkhunter或chkrootkit做主机入侵检测但指导书明确说的是防恶意代码软件所以最好有 ClamAV、Sophos、Trend Micro 这类产品。病毒库更新日期如果超过一周也可能被判定为不及时。主机防恶意代码库和网络防恶意代码库不同这个要求检查时看主机上的病毒库版本和网络侧如防火墙、邮件网关的病毒库版本是否一致。如果完全一样可能说明没有独立的主机防护能力。统一管理方面看有没有集中管理平台或者有没有配置自动更新策略。# 查看 ClamAV 自动更新配置 cat /etc/cron.d/clamav-freshclam # 或 systemctl status clamav-freshclam5. 资源控制与避坑排查TMOUT、limits 与那些容易翻车的细节资源控制是基线检查的最后一类包括终端登录限制、操作超时锁定、服务器资源监视、单用户资源限制、服务水平检测报警。这一章除了讲检查方法还会把前面几类里容易踩的坑集中列出来。5.1 终端接入限制与 TMOUT 超时配置指导书要求通过设定终端接入方式、网络地址范围等条件限制终端登录。检查/etc/hosts.deny和/etc/hosts.allow# 查看终端登录限制配置 cat /etc/hosts.deny cat /etc/hosts.allow # 典型配置默认拒绝所有只允许特定网段 # /etc/hosts.deny: ALL: ALL # /etc/hosts.allow: sshd: 192.168.1.0/24hosts.deny里写ALL: ALL表示默认拒绝所有连接然后在hosts.allow里放行特定网段。注意顺序hosts.allow优先于hosts.deny。如果两个文件都是空的那这项就不符合。操作超时锁定看/etc/profile里的TMOUT变量# 查看 TMOUT 设置 grep TMOUT /etc/profile # 如果没有设置可以添加 echo TMOUT600 /etc/profile echo export TMOUT /etc/profileTMOUT600表示 600 秒无操作自动退出。这个值别设太小否则运维人员正常操作时会被频繁踢出反而影响效率。一般 300 到 900 秒之间比较合理。设置完后要source /etc/profile或者重新登录才生效。单用户资源限制看/etc/security/limits.conf# 查看资源限制配置 cat /etc/security/limits.conf # 典型配置 # * soft core 0 # * hard core 0 # * soft nproc 1024 # * hard nproc 2048 # * soft nofile 4096 # * hard nofile 8192nproc控制进程数nofile控制打开文件数core控制核心转储。soft是软限制用户可以自己调高到hard值hard是硬限制普通用户不能突破。如果这两个值都是unlimited那资源控制这项就不符合。服务器资源监视和服务水平检测报警指导书里提到可以用系统资源监控器或第三方监控平台。检查时看有没有部署nagios、zabbix、prometheus这类监控工具以及有没有配置告警规则。# 查看是否有监控代理在运行 ps -ef | grep -E zabbix|nagios|prometheus|node_exporter # 查看系统日志中是否有告警记录 grep -i alert\|warning /var/log/messages | tail -205.2 基线检查中常见的五个翻车点现象一pwdck命令找不到。原因pwdck是 AIX 上的命令Linux 默认没有。解决改用awk -F: ($2 ) {print $1} /etc/shadow直接解析 shadow 文件效果一样。现象二PAM 配置改了但创建用户时策略没生效。原因/etc/pam.d/system-auth可能被/etc/pam.d/password-auth覆盖或者login.defs和 PAM 配置不一致。解决两个文件都检查确保pam_pwquality.so或pam_cracklib.so在password段中并且login.defs的PASS_MIN_LEN和 PAM 的minlen保持一致。现象三auditd 规则加了但ausearch查不到记录。原因规则没加载或者 auditd 服务没重启。解决用auditctl -l确认规则已加载如果没有执行augenrules --load或service auditd restart。另外检查auditd.conf里的log_file路径是否正确。现象四TMOUT 设置了但用户登录后不生效。原因/etc/profile只对交互式登录 shell 生效如果用户通过su切换或者用非登录 shell可能读不到。解决同时在/etc/bashrc或/etc/profile.d/下加一个脚本设置TMOUT确保所有 shell 都能加载。现象五hosts.deny配了ALL: ALL导致自己被锁在外面。原因hosts.allow没放行自己的管理 IP或者顺序写反了。解决改配置前先开一个已登录的会话保底改完后用另一个终端测试。如果不小心锁了通过控制台或单用户模式恢复。6. 把检查结果落成可复用的脚本从手工敲命令到半自动化巡检手工敲命令做基线检查一次两次还行每个月都来一遍谁也受不了。我的习惯是把指导书里的检查项拆成函数写成一个巡检脚本输出成结构化报告。这样每次检查只需要跑一遍脚本然后人工复核异常项就行。#!/bin/bash # linux_baseline_check.sh # 基于《主机安全 - Linux操作系统基线检查指导书1.0版》整理 REPORT/tmp/baseline_report_$(date %Y%m%d).txt exec (tee -a $REPORT) 21 echo Linux 基线检查报告 $(date) # 1. 空口令账户检查 echo -e \n[1] 空口令账户检查 EMPTY_PW$(awk -F: ($2 ) {print $1} /etc/shadow) if [ -z $EMPTY_PW ]; then echo 通过未发现空口令账户 else echo 不通过以下账户存在空口令 - $EMPTY_PW fi # 2. UID 为 0 的账户检查 echo -e \n[2] UID 为 0 的账户检查 UID0$(awk -F: ($3 0) {print $1} /etc/passwd) echo UID 为 0 的账户$UID0 if [ $(echo $UID0 | wc -l) -gt 1 ]; then echo 不通过存在多个 UID 为 0 的账户 else echo 通过仅 root 一个 UID 为 0 的账户 fi # 3. 密码策略检查 echo -e \n[3] 密码策略检查 grep -E PASS_MAX_DAYS|PASS_MIN_LEN /etc/login.defs # 4. SSH 配置检查 echo -e \n[4] SSH 配置检查 grep -E PermitEmptyPasswords|PermitRootLogin /etc/ssh/sshd_config # 5. auditd 服务检查 echo -e \n[5] auditd 服务检查 if ps -ef | grep -q [a]uditd; then echo 通过auditd 正在运行 auditctl -s | grep enabled else echo 不通过auditd 未运行 fi # 6. TMOUT 检查 echo -e \n[6] TMOUT 超时检查 grep TMOUT /etc/profile || echo 不通过未设置 TMOUT # 7. 危险服务检查 echo -e \n[7] 危险服务检查 for svc in telnet ftp rsh rlogin; do if netstat -tlnp 2/dev/null | grep -q :$svc; then echo 不通过$svc 服务正在监听 fi done echo 检查完毕 echo -e \n 报告结束 这个脚本把最关键的几项做成了自动判断输出直接带「通过/不通过」标记。exec (tee -a $REPORT) 21这行是把所有输出同时打印到屏幕和写入报告文件方便存档。awk解析 shadow 和 passwd 的部分前面已经讲过这里直接复用。ps -ef | grep -q [a]uditd里的[a]是个小技巧防止grep匹配到自己的进程。危险服务检查用netstat看监听端口如果发现telnet或ftp在跑直接标记不通过。脚本跑完后人工复核的重点是那些标记「不通过」的项以及需要看配置文件内容的项比如密码策略、SSH 配置。自动化能覆盖 70% 的检查量剩下的 30% 靠人工判断这样效率最高。从那以后我每次做基线检查都强制先跑一遍这个脚本把报告拉出来对着指导书逐项核对。手工敲命令的时代已经过去了但指导书里的检查逻辑和判断标准才是真正值钱的东西。希望帮到你。本文还有配套的精品资源点击获取
返回列表