简介:面向运维人员与系统管理员的安全加固参考手册,从安装阶段的关键安全设置入手,系统梳理密码安全策略、用户帐号安全、网络服务安全等必备知识点。内容具体涵盖密码影子文件、密码强度检查与密码管理,以及服务过滤、inetd配置、远程登录服务、TCP访问控制、hosts等效文件等网络服务加固细节,同时延伸到NFS、Sendmail、finger等常见服务的风险收敛,能帮助读者建立从账号密码到网络服务的完整加固思路。手册采用章节化结构,每部分均给出针对性检查项和操作要点,适合需要提升服务器基线安全水平的中级运维人员,也可作为企业安全自查与配置整改的速查文档。资源包为单个PDF文档,共一个文件,大小约40KB,便于下载后快速查阅;已有1332人学习,内容精炼无冗余,实用性强。
1. 先隔离再卸载:装系统阶段就要做对的两件事
LINUX 安全加固这件事,大多数人开始的时机就错了:系统已经连上公网、业务正在跑,然后才想起来补洞。这份《LINUX 安全加固手册》开篇第一页就点名了正确顺序——先在隔离网络里完成安装,把没必要的软件卸载干净,再考虑接外网。手册把加固拆成用户账号、网络服务、系统设置、文件系统四个面,一共 16 页,每一面都给了可以直接抄的命令行。适合刚接手一台 Linux 服务器、准备做等保整改、或者面试前想把安全基线完整过一遍的人。读它不需要多深的基础,但最好手边有一台能随便折腾的测试机,因为里面有十几个命令,执行完的后果是立竿见影的,比如锁定 /etc/passwd 之后,你连加个用户都会报错。
2. 用户帐号安全:密码、su 权限和文件锁的四道关
2.1 先弄明白密文存哪:/etc/shadow 的结构和密码基线
早期 Linux 的密码哈希直接放在 /etc/passwd 第二字段,这个文件所有用户都能读,等于把密文公开给暴力破解工具。现在默认用 shadow 机制,真正的哈希挪到 /etc/shadow,只有 root 能读,这就是手册里说的 Password Shadowing。我们做加固前,先要清楚 shadow 每一列在说什么。
/etc/shadow 一行有九个冒号分隔的字段,常见顺序是:用户名、加密口令、最近更改密码日期、最短使用天数、最长使用天数、提前警告天数、宽限天数、失效日期、保留位。实战中关键就看第二字段:如果以$6$开头是 SHA-512 哈希,$1$是 MD5,!或*表示锁定或未设置密码,第二字段为空则意味着这个账号根本没有密码保护,是最危险的漏洞。密码基线上,手册建议口令至少 6 位且包含特殊字符,这个标准放到现在偏低,等保和大多数企业基线已经要求 8 位以上、大小写字母加数字加特殊字符至少三类,我一般直接把 PASS_MIN_LEN 提到 12,下属服务器一律按新基线走。
2.2 自查弱口令:john、crack 和一条 awk 命令
手册给了两条自查路径:用 john、crack 这类离线暴力破解工具跑 shadow 文件,或者用 Emailcrk、流光这类在线穷举工具。实际项目里我很少直接跑完整字典,成本高、还容易被安全设备告警,更常见的是先扫描空密码和弱密码账号,再做人工抽查。
awk -F: 'length($2)==0 {print $1}' /etc/shadow这条命令的要点是-F:把冒号当分隔符,$2取第二列也就是密码哈希字段,length($2)==0判断该字段长度为 0,命中的用户名直接打印出来。在旧的 NIS、NIS+ 环境或者迁移过的系统上,空密码账号经常是历史残留,这条命令一次扫完,比翻遍 passwd 文件快得多。扫出来之后立刻passwd 用户名补上密码,并短信或邮件通知使用者。
2.3 密码有效期与 su 限制:login.defs 和 pam_wheel
光有复杂度不够,密码还得有生命周期。编辑 /etc/login.defs,重点调几个参数:PASS_MAX_DAYS 控制最长使用天数,建议 90;PASS_MIN_DAYS 是最短修改间隔,建议 5 到 7,防止用户刚改完又改回弱密码;PASS_WARN_AGE 是到期前提醒天数,建议 7。注意一点,login.defs 里的 PASS_MIN_LEN 在现代系统上经常不生效,因为密码复杂度已经被 PAM 的 pam_pwquality 模块接管了,这个坑后面排查章还会展开。
再限制 su 的使用范围,让只有 wheel 组的用户能切到 root。编辑 /etc/pam.d/su,把这两行注释放开:
auth sufficient /lib/security/pam_rootok.so debug auth required /lib/security/pam_wheel.so group=wheel第一行的 pam_rootok.so 允许 root 自己免密通过,所以 root 切 root 不受影响;第二行是真正卡人的地方,要求认证用户必须在 wheel 组里,不在的直接拒绝。然后把运维账号加进组:
usermod -G10 admin注意这里-G是大写,表示附加组,-g小写是主组,写错了会把用户从原来的主组里挪走。加完组之后,用普通用户执行su -验证一次,能不能切、提示什么,都在这一步确认完再部署到生产。
2.4 清理账户和锁文件:userdel 与 chattr 的执行顺序
系统装完默认带了一堆用不上的账户,手册建议逐个删掉:adm、lp、sync、shutdown、halt、news、uucp、operator、games、gopher、ftp。我的习惯是分两步走:先确认服务没在用,再删。games 在不用 X Window 的机器上删,ftp 在不开 FTP 服务的机器上删,剩下那些系统内部账户,先ps -ef | grep 用户名看一眼有没有相关进程,别拿着 userdel 一通乱删,删完发现某个服务起不来就尴尬了。
userdel adm userdel lp userdel sync userdel shutdown userdel halt userdel news userdel uucp userdel operator userdel games userdel gopher userdel ftp删账户本身不复杂,真正让新手翻车的是后面这一步:把关键文件锁死。手册建议用 chattr 给 passwd、shadow、group、gshadow 加上不可改变位:
chattr +i /etc/passwd chattr +i /etc/shadow chattr +i /etc/group chattr +i /etc/gshadow+i的作用是文件变为 immutable,连 root 都改不了、删不掉、不能创建硬链接。这是双刃剑:锁上之后系统安全了一个量级,但后续 useradd、passwd、给用户改组成员全部会报错。所以这个操作一定要放在所有账号调整的最后一步做,做之前把该建的账号建完、该改的权限改完,做完之后立刻测试一条useradd testuser,确认会报错,再删掉测试用户。要改动时先chattr -i解锁,改完再加回,这个习惯我从第一次锁死 passwd 之后就再也没丢过。
3. 网络服务安全:先关 19 个危险端口,再给剩余服务上 tcp_wrapper
3.1 服务过滤清单:哪些端口不该对外开放
手册反复强调两个原则:只对外开放需要的服务,把不同服务分散到不同主机。后者很多人不重视,觉得多台机器麻烦,但一台机器上跑着 Web、数据库、FTP、邮件,任何一个服务被打穿,其他服务的数据都在同一台机器上等着被翻,物理隔离是最朴素也最有效的防线。
服务过滤的清单,我按手册整理了一张常用表:
| 服务 | 端口 | 协议 | 加固建议 |
|---|---|---|---|
| echo | 7 | TCP/UDP | 默认关闭,可被用于反射放大攻击 |
| systat | 11 | TCP | 泄露系统信息,关闭 |
| netstat | 15 | TCP | 泄露网络信息,关闭 |
| tftp | 69 | UDP | 无认证,手册要求任何情况都不启动 |
| sunrpc | 111 | TCP/UDP | 配合 NFS 使用,外部一律过滤 |
| snmp | 161 | UDP | 默认口令风险极高,关闭或改 community |
| exec | 512 | TCP | R 服务,关闭 |
| login | 513 | TCP | R 服务,关闭 |
| shell | 514 | TCP | R 服务,关闭 |
| printer | 515 | TCP | 网络打印机,多数场景用不到 |
| x11 | 6000+ | TCP | X Window 转发风险大,外部过滤 |
这里要特别提一句 UDP 服务,手册明确点出 rpc.ypupdated、rpc.statd、rpc.ttdbserver、sadmind 这一类既能被用来做 DoS 放大、又存在远程溢出的老漏洞,比 TCP 服务更容易被忽略。配置完之后用 nmap 从外部扫一遍,nmap -sT -sU 目标IP把 TCP 和 UDP 都扫,扫出来的开放端口和你的服务清单逐行比对,多一个就查一个。
3.2 /etc/inetd.conf 与 xinetd:600 权限和注释的艺术
老版本的 Linux 把一堆小服务挂在 inetd 超级守护进程下面,手册里的操作思路今天依然适用,只是配置文件的位置变了。先做权限和属主检查:
chmod 600 /etc/inetd.conf chown root:root /etc/inetd.conf600 权限意味着只有 root 能读写,防止普通用户篡改服务配置。接着把不需要的服务在 inetd.conf 里逐行注释,注释完重启 inetd 让配置生效,再用 netstat 验证:
/etc/rc.d/init.d/inetd restart netstat -an | grep LISTENnetstat 输出里 LISTEN 状态的行就是当前对外监听的服务,对照服务清单看有没有多出来的。红帽系的 CentOS 7 之后已经换成了 xinetd,配置在 /etc/xinetd.d/ 目录下,每个服务一个文件,想停掉某个服务就把文件里的disable = no改成disable = yes。网上很多教程还在教老路径,照着执行会发现根本没有这个文件,先ls /etc/xinetd.d/确定自己系统属于哪一类再动手。
3.3 tcp_wrapper:hosts.deny 全拒,hosts.allow 精准放行
tcp_wrapper 的原理是让 tcpd 程序顶替真实服务程序,先截获客户端请求,记录来源 IP 和时间,按访问控制规则检查,符合规则才把连接转交给真正的服务程序。它相当于在服务前面加了一道门卫,适合对 telnet、ftp、rsh 这类老协议做来源限制。
配置分两个文件,先写 /etc/hosts.deny,默认拒绝一切:
ALL: ALL@ALL, PARANOIDALL@ALL 表示所有来源的所有服务,PARANOID 是个特殊匹配项,专门拦截主机名和 IP 地址无法对应的连接,防止源地址伪造。然后写 /etc/hosts.allow,精确放行需要访问的机器:
sshd: 208.164.186.1 gate.openarch.com这行的意思是允许 IP 为 208.164.186.1、主机名为 gate.openarch.com 的客户端访问 sshd。生产环境我习惯写成网段形式,比如sshd: 192.168.1.放行整个内网段,比逐个 IP 好维护。配置完用 tcpdchk 检查:
tcpdchktcpdchk 会遍历 inetd/xinetd 配置,检查每个服务有没有正确使用 tcpd,以及访问规则语法是否正确。这里有个容易忽略的细节:使用 tcp_wrapper 时,inetd.conf 里对应服务行要带 nowait 选项,否则连接处理会被阻塞。另外要记住 tcp_wrapper 的匹配顺序是 hosts.allow 优先于 hosts.deny,先匹配到谁就按谁执行,白名单没写对就开始写黑名单,很容易把管理员自己也关在门外,这个翻车案例放到第 5 章详细讲。
3.4 NFS 与 sendmail:两个最容易留后门的服务
NFS 的问题在于它依赖 sunrpc 和 mountd 这类动态端口服务,防火墙规则很难收口。手册给的做法是在外部路由上直接过滤 111 和 2049 端口,然后在 /etc/exports 里严格控制导出权限,并用 exportfs 命令动态调整:
exportfs -o access=engineering,ro=dancer /usr exportfs -u /usr第一条命令把 /usr 目录导出,access=engineering限定只有 engineering 组可以访问,ro=dancer表示对 dancer 主机只读;第二条-u是取消导出。每次改完 exports 文件,用showmount -e 本机IP看看实际导出了什么,和预期对比。我见过不止一次 exports 里写了 rw 全局共享,一台测试机把整个 /home 挂成可写,几天后数据被清空才被发现。另外 exports 文件权限建议 644、属主 root,别让其他用户有机会改。
sendmail 是另一个重灾区,它的默认配置里有几个特性会让服务器变成开放转发中继。手册里列了六个特性,我整理成一张决策表:
| 特性 | 作用 | 建议 |
|---|---|---|
| promiscuous_relay | 打开任意转发功能 | 关闭,否则变成垃圾邮件中继 |
| accept_unqualified_senders | 接受不含合法主机名的发件地址 | 关闭 |
| loose_relay_check | 放宽源路由邮件的转发检查 | 关闭 |
| accept_unresolvable_domains | 接受无法解析域名的主机发信 | 按需开启(防火墙后场景) |
| blacklist_recipients | 打开接收黑名单功能 | 开启,可用于拦截特定收件人 |
| relay_entire_domain | 为本地域所有主机提供转发 | 关闭,只信任 access db 里的 RELAY 主机 |
配置方式是把特性写进 .mc 文件,用 m4 宏工具生成 sendmail.cf。不过在 2024 年的环境里,我建议新部署的邮件服务直接考虑 postfix 或 qmail,配置思路更清晰、攻击面更小,没必要在 sendmail 上死磕,除非是既有系统迁移成本太高。
3.5 FTP 与 finger:能不开就不开
FTP 服务手册里给了三条硬约束:第一,用最新版本,wu-ftpd 2.6.1、proftp、ncftp 任选,老版本漏洞多到数不清;第二,设置 /etc/ftpusers 文件,把 root、bin、daemon 这些系统账户全部写进去禁止登录;第三,务必用 chroot 把 FTP 用户限制在自己的目录里,否则登录用户能直接翻到 /etc/passwd。配置文件方面,/etc/ftpaccess 设置最大连接数、禁止泄露系统信息,/etc/ftphosts 按主机限制访问,日志 /var/log/xferlog 权限改成 600、属主 root,日志记录谁在什么时候传了什么文件,出事是取证的第一手材料。
finger 服务就一句话:不该启动。它会把用户名、登录时间、终端信息全部暴露给任意远程访问者,是信息收集阶段最好的帮手。生产环境有任何一个 finger 端口开着,安全扫描第一时间就会标记出来。
4. 系统设置与内核参数:关 ping、锁控制台、堵住三个内核入口
4.1 限制控制台:console.apps 与 pam_console
物理接触服务器的攻击者拥有最高权限,所以控制台的访问控制不能省。手册的做法是删除 /etc/security/console.apps 里用不到的服务入口,让普通用户无法通过控制台执行关机、重启、启动 X Server 这类操作:
rm -f /etc/security/console.apps/halt rm -f /etc/security/console.apps/poweroff rm -f /etc/security/console.apps/reboot rm -f /etc/security/console.apps/shutdown rm -f /etc/security/console.apps/xserver删掉这些文件之后,普通用户在控制台上敲 reboot 或 shutdown 会直接提示没有权限,只有 root 能操作。xserver 那一条影响比较大:删掉之后普通用户无法从控制台启动图形界面,如果你这台机器上有开发人员依赖图形登录,删之前先沟通好。顺手把 /etc/pam.d/ 里所有包含 pam_console.so 的行注释掉,控制台的本地授权就彻底收回了。
4.2 内核三个开关:icmp、源路由、rp_filter
手册提到的关闭 ping,本质是改内核参数 icmp_echo_ignore_all,让它对 ICMP 回显请求不做任何响应。和它配套的还有两个同样重要的开关,一起贴出来:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter第一行设成 1 之后,这台机器不再响应 ping,扫描器少一个探测入口;第二行把 IP 源路径路由关掉,防止攻击者通过伪造路由路径绕过访问控制;第三行的 rp_filter 是反向路径过滤,检查进入的数据包源地址是否可从对应网卡返回,设成 1 能挡住一部分 IP 欺骗。这三个参数直接写到 /proc 下只对当前运行生效,重启就没了,必须落进 /etc/sysctl.conf 才能持久化:
echo "net.ipv4.icmp_echo_ignore_all=1" >> /etc/sysctl.conf echo "net.ipv4.conf.all.accept_source_route=0" >> /etc/sysctl.conf echo "net.ipv4.conf.all.rp_filter=1" >> /etc/sysctl.conf sysctl -p最后一个sysctl -p重载配置,让写入的值立即生效,这是无数人重启服务器后发现 ping 又通了的原因:只改了 /proc,没写配置文件。
4.3 /etc/securetty 与 /etc/host.conf:登录终端和 DNS 顺序
/etc/securetty 文件控制 root 能从哪些终端登录,文件里的每一行是一个终端设备名。默认情况下包括 console、tty1 到 tty11,把用不到的终端注释掉,可以缩小 root 的物理登录入口。这里有个关键细节:如果文件不存在,系统会认为 root 可以在任何终端登录,所以做加固时千万不要直接删掉这个文件,注释行比删文件安全得多。改完文件之后最好开两个终端测试,一个留着救急,另一个测试配置是否生效,防止改完 securetty 把 root 本地登录也禁了,自己把自己锁在机器外面。
/etc/host.conf 是名字解析顺序的配置文件,手册给的思路是:
order hosts,bind nospoof on第一行规定先查 /etc/hosts 再查 DNS,内网机器能少依赖 DNS 就少依赖;第二行的 nospoof on 开启反欺骗检查,防止 DNS 返回的 IP 地址和反向解析不一致时被利用。文件里注意不要出现!和#这类符号,host.conf 里它们不表示注释,写错了会影响解析行为。
4.4 资源限制与启动引导:把进程框进范围
资源限制的配置在 /etc/security/limits.conf,控制单个用户可以占用的资源总量,防止一个被入侵的账号把整台机器拖垮。常用的几行配置:
* hard core 0 * hard nproc 100 @admin soft nofile 65535第一行禁止所有用户产生 core dump 文件,防止核心转储泄露内存数据;第二行限制进程数上限为 100,第三行给 admin 组放开文件描述符限制到 65535,适合跑高并发服务的账号。注意 hard 和 soft 的区别:soft 是警告阈值,用户自己可以提高;hard 是硬顶,超过就拒绝,加固场景用 hard 更有效。
系统引导这一块,老一代机器用 LILO,/etc/lilo.conf 里可以加password="..."和restricted选项,这样进入单用户模式需要密码,防止有人通过改启动参数拿 root。现在主流是 GRUB,做法换成给 GRUB 菜单设置密码,思路是一样的:没有密码的人连内核启动参数都不能改。另外手册提到注释 /etc/inittab 里的 Control-Alt-Delete 关机行,对应现代 systemd 系统就是systemctl mask ctrl-alt-del.target,防止误按组合键把生产服务器直接重启。
4.5 日志与 init 脚本权限:出事之后的取证基础
日志是安全事件发生后唯一的现场。手册这一节的核心是把日志变成可靠的记录源,而不是被攻击者顺手清掉的东西。先确认 syslog 在正常收集,检查 /var/log/messages、/var/log/secure 是不是在持续写入,再看 logrotate 有没有按期切割日志,日志文件权限建议 600,防止普通用户读到敏感信息。有条件的企业我建议把日志实时转发到独立的日志服务器,本地日志被删了还有远程副本。
然后是 /etc/rc.d/init.d 目录下启动脚本的权限:
chmod 600 /etc/rc.d/init.d/*启动脚本被普通用户改掉,等于给了对方开机自动执行恶意代码的通道。但这里要谨慎:个别第三方软件安装后会在 init.d 下放脚本,脚本里如果有非 root 用户的执行需求,600 权限可能导致服务无法启动。执行完这步之后,把机器上所有服务 restart 一遍做回归,比改完就收工稳妥得多。
5. 文件系统加固与常见排查:权限、挂载、备份里的四个翻车点
5.1 文件权限:600、644、755 分别该给谁
文件权限是 linux 系统加固里成本最低、收益最稳定的动作。按这份手册和我的工程习惯,核心配置文件优先收紧:/etc/inetd.conf、/etc/services、/etc/hosts.equiv 给 600 属主 root,/etc/exports 给 644 属主 root,/etc/aliases 给 755 属主 root,FTP 日志 /var/log/xferlog 给 600。权限过宽的典型特征是出现全局可写,用一条命令扫出来:
find / -perm -2 -type f 2>/dev/null-perm -2表示查找包含其他用户可写位的文件,这类文件一旦被攻击者利用就能改写系统内容。另外专门排查 setuid 文件:
find / -perm -4000 -type f 2>/dev/nullsetuid 程序运行时会以文件属主身份执行,属主是 root 的 setuid 文件就等于给了普通用户 root 执行权限,是本地提权最喜欢的目标。扫出来的结果逐项确认,不属于业务必需的全部去掉 setuid 位。
5.2 控制挂载:nodev、nosuid、noexec 组合
可写目录是攻击者的落脚点,尤其是 /tmp、/home、/var 这类目录,通过挂载选项可以显著降低风险。在 /etc/fstab 里给对应的分区加上限制参数:
/dev/sdb1 /data ext4 defaults,noexec,nosuid,nodev 0 2noexec禁止在该分区上直接执行二进制文件,nosuid忽略 suid 位,nodev不识别设备文件。三个一起上之后,攻击者即使拿到了写权限,在这个目录下也跑不了上传的程序,提不了权,也挂不了设备。加完 fstab 之后执行mount -o remount /data让新参数立即生效,再用mount | grep /data确认。这个方案对 /tmp 尤其有效,但加之前先确认系统里没有依赖 /tmp 执行程序的安装包,有些软件安装时会在 /tmp 解压并运行脚本,撞上 noexec 直接安装失败。
5.3 备份与恢复:给加固上最后一层保险
备份的意义在于,加固操作本身也可能把系统改坏,操作前留一份可回退的快照,是所有变更的底线。我用得最多的还是 tar 打包关键目录:
tar czvf /backup/etc-$(date +%F).tar.gz /etcczvf分别表示创建归档、gzip 压缩、显示过程、指定文件名,$(date +%F)自动拼上当天日期,方便保留多个历史版本。恢复的时候不要直接覆盖:
mkdir -p /tmp/etc-restore tar xzvf /backup/etc-2024-01-01.tar.gz -C /tmp/etc-restore先解压到临时目录核对权限和属主,再用 diff 对比关键文件,确认没有异常再拷贝回 /etc。直接从备份覆盖 /etc 的操作我在生产上见过一次翻车:恢复完所有服务起不来,最后发现是解压时属主和权限位丢了。备份盘要和系统盘分开,最好是独立挂载的磁盘或远程存储,别备份放在被加固的同一台机器上。
5.4 常见排查记录:四个真实翻车案例
案例一:chattr 锁死 passwd,用户加不进去。现象是加固完第二天 useradd 报错 "cannot open /etc/passwd",看权限一切正常。原因就是 /etc/passwd 被加了+i不可改变位,root 也没法写。解决方法是先chattr -i /etc/passwd解锁,完成账号操作后重新chattr +i /etc/passwd锁上,批量处理账号时先统一解锁再统一加锁。
案例二:关 ping 重启失效,扫描器又探测到主机。现象是 echo 1 到 icmp_echo_ignore_all 之后当时有效,服务器一重启 ICMP 又恢复响应。原因是参数只写进了 /proc,没有持久化到 /etc/sysctl.conf。解决办法是把参数写成net.ipv4.icmp_echo_ignore_all=1追加到 sysctl.conf 并执行 sysctl -p。
案例三:hosts.deny 全拒之后 SSH 连不上。现象是写好ALL: ALL之后自己也登录不了,网络层面通但 SSH 超时。原因是白名单 hosts.allow 没有先放行管理员来源。tcp_wrapper 的匹配顺序是 allow 优先,必须先在 hosts.allow 写入管理员网段如sshd: 192.168.1.,确认能连上之后再写 hosts.deny 的全拒规则。
案例四:NFS 导出了 ro 但还是被写。现象是 exports 里写了 ro,客户端挂载后依然能创建文件。排查发现 exports 文件里同时存在ro和rw的冲突行,修改后也没有重新加载。解决方法是清理冲突配置,执行exportfs -ra重新加载全部导出,再用showmount -e核对当前实际生效的导出列表,确认无误后再通知客户端重挂。
6. 加固后的日常巡检:把 netstat 和日志检查变成习惯
6.1 每天两分钟的巡检命令
加固不是一次性的动作,服务会被新装软件带起来,账户会被遗忘的脚本创建,内核参数会被其他同事顺手改掉,所以我把巡检做成了每天早上必跑的一组命令:
netstat -an | grep LISTEN | awk '{print $4}' | sort -u lastb | head -20 awk -F: 'length($2)==0 {print $1}' /etc/shadow sysctl net.ipv4.icmp_echo_ignore_all第一条把当前所有 LISTEN 端口打印出来,和初始服务清单比对,多个端口立刻追查是哪个进程开的;第二条 lastb 看最近的失败登录记录,连续大量尝试说明有人在爆破;第三条继续扫空密码账户;第四条确认关 ping 的内核参数还在。这套命令我通常是挂 cron 每天 8 点自动执行,输出追加到 /var/log/security_daily.log,保留 180 天,巡检不只是给自己看,更是给未来的排查留现场。
配合外部视角,每季度用 nmap 从另一台机器扫一遍生产服务器,nmap 看到的结果和 netstat 看到的结果对照,如果有端口 netstat 没显示但外部能连通,大概率是开了防火墙转发或者服务绑定在多网卡上,这种隐蔽端口最适合藏后门。
我刚做运维那会儿,总觉得加固就是把该关的服务全关掉,结果在一台测试机上把 chattr 锁死、又把 sshd 从 hosts.allow 里漏掉,远程连不上,最后跑机房用控制台解锁。从那以后我每次加固完成,都强制自己走一遍巡检命令,确认能进、能查、能退,再宣布收工。希望帮到你,也帮到你手里那台服务器。
本文还有配套的精品资源,点击获取