☰
Linux系统安全加固实战指南:账户、SSH、内核与审计全解析
2026/10/21 3:34:39 网站建设 项目流程

1. 先想清楚:Linux加固到底在防什么

每次有人让我帮忙看一眼服务器安全性,我第一句话都不是问装了什么东西,而是反问一句:你希望这台机器被攻破之后,损失上限是多少?这个问题听起来很虚,但恰恰决定了加固方案的边界。很多教程上来就让你改SSH端口、关root登录、装Fail2ban,照做一遍感觉挺踏实,实际上只挡住了最外围的“随手扫描流量”,真正有目标的攻击者连腰都没弯。

Linux系统安全加固,本质上是做两件事:收缩攻击面,增加攻击成本。攻击面指的是这台机器对外暴露的所有入口——开放端口、运行的服务、可登录的账户、可执行的文件、可被篡改的配置。攻击成本则是攻击者拿到权限之后,还要花多大精力才能稳住脚跟、扩大战果。我见过不少团队把精力全花在第一件事上,结果一台机器被人种了后门,因为文件权限太松散,任何用户都能往启动目录里丢东西,加固做了等于没做。

这篇文章是系统安全加固系列的第一篇,聚焦Linux环境。我会按我自己在生产环境里实际操作的顺序来讲:先收敛账户和登录入口,再压SSH风险面,然后调内核参数和文件系统权限,最后补上审计和监控。每一节都会说清楚这么做的原因,以及哪些环节容易踩坑。内容偏实战,适合刚接手服务器运维的开发者,也适合想系统梳理安全基线的人。

我现在所在的团队长期维护几十台Linux节点,有云主机也有物理机,发行版以 CentOS 和 Ubuntu 为主。下面所有配置都是这两类系统上验证过的,Debian 系和 RHEL 系的主要差异我会单独标注,其他发行版参考思路即可。

2. 账户与登录入口的收敛:删掉不用的门,比把门锁换得更高级更重要

2.1 从账户清单开始

我接手任何一台机器,第一件事永远是跑cat /etc/passwd和cat /etc/shadow,把每一行都过一遍。这一步非常基础,但很多人从来没有认真看过自己机器上到底有多少个账户。默认安装的Linux系统会带出一批系统账户,比如 daemon、bin、lp、mail、nobody 这些,它们多数是历史遗留,没有登录Shell,也没有实际用途,但留着它们没有任何好处——每个账户都是一个潜在的身份载体。

生产环境里更常见的问题是自己创建的账户冗余。比如项目早期测试时建的临时账号,或者某个同事离职之后没人清理的旧账号,甚至还有直接给应用创建了超级用户权限账户的情况。我的建议是,每台机器上可交互登录的账户控制在个位数,最好就是两三个管理员再加一个专用的部署账户。其他一律删除或者锁定。

检查账户的时候重点看三列:是否有可用的Shell(/bin/bash、/bin/sh这类),是否在 shadow 文件里有密码哈希,以及 UID 是否为 0。任何 UID 为 0 的非 root 账户都是极其危险的信号,等于直接给了另一个超级用户权限。我见过某台机器上有个叫 sync 的老账户 UID 是 0,一查是很多年以前有人图方便直接改的,这就是典型的隐藏风险。

2.2 清理和锁定的正确姿势

清理账户不是直接userdel -r就完事。我的操作顺序是先锁定、再观察、最后删除。因为有些账户虽然在 passwd 里存在,但可能被某个启动脚本或者 cron 任务引用,直接删掉会导致服务起不来。

锁定命令有两种,passwd -l username和usermod -L username,效果类似,都是在 shadow 文件的密码字段前加个感叹号,让密码验证永远失败。但注意,这只禁止了密码登录,如果账户配置了SSH密钥,依然可以登录。所以更稳妥的做法是把 Shell 也换掉:

usermod -s /sbin/nologin username

这样即使有人拿着这个账户的密钥来登录,也会直接被拒绝分配Shell。对于已经确定废弃的账户,等观察一两周没有服务报错之后,再执行userdel -r username连同家目录一起清掉。

还有一个细节容易被忽略:检查/etc/sudoers或者/etc/sudoers.d/目录下的文件。很多时候账户是清理了,但 sudo 授权条目还留着,万一 UID 被复用,新账户自动继承管理员权限。我习惯是清理账户的同时把对应的 sudo 条目一并删掉,并且每年做一次授权清单复核。

2.3 root 账户的处理思路

root 该不该直接禁用?这是安全加固里争议最多的话题之一。我的观点是:root 账户不应该被删,但应该让它无法直接被登录,所有管理操作通过 sudo 来执行。原因是 root 一旦被设置为不可登录,攻击者就算拿下了某个普通账户,也还需要再攻破 sudo 的密码验证,多了一层阻力。

具体配置在后面SSH部分会详细讲,这里先说明一个容易踩的坑:不要随手passwd -l root。很多教程这么教,但如果你用的是某些云平台的镜像,系统里根本没有其他可用的 sudo 用户,锁掉 root 之后你可能连机器都进不去。正确顺序是:先创建一个具备 sudo 权限的管理账户,测试能正常登录,再处理 root 的登录限制。

3. SSH 加固:攻击者最常敲的窗口,值得花一半精力去守

3.1 从密钥登录和禁用密码开始

SSH 是几乎所有Linux服务器最常被扫描的入口。默认的 22 端口,配合密码认证,每天都会被互联网上的扫描器尝试成千上万次。我见过最夸张的一台机器,/var/log/secure里一天刷了十几万条失败登录记录,全是来自各种僵尸网络的 SSH 爆破。

加固第一步永远是更换认证方式:禁用密码登录,只允许密钥认证。这一步做完,暴力破解基本就断了路,因为攻击者没有你的私钥,再怎么试密码也无济于事。

操作前必须确认所有管理员已经生成并配置好了自己的公钥。生成密钥推荐用 Ed25519 算法,而不是老旧的 RSA:

ssh-keygen -t ed25519 -a 100 -C "your_identifier"

-a 100指定 KDF 迭代次数,默认值偏小,适当调高可以延缓私钥被暴力猜测的速度。公钥放到服务器的~/.ssh/authorized_keys之后,记得检查文件权限:

chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

权限不对的话,sshd 会直接忽略这个文件,导致密钥登录失败,反而是个隐藏的坑。

确认所有管理员都能用密钥登录之后,再修改 sshd_config:

PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no UsePAM no

这里有个细节:ChallengeResponseAuthentication是老的键盘交互式认证开关,很多时候以为关了密码登录,但 PAM 模块还会允许空密码或简单密码,尤其是 Ubuntu 上常见。我建议直接禁掉UsePAM,不过要注意这个选项会影响到某些依赖 PAM 做二次认证的场景,如果机器上有特殊需求,至少保持ChallengeResponseAuthentication no。

改完配置后:

sshd -t systemctl reload sshd

sshd -t是语法自检,这条命令不通过就绝对不能 reload,不然你可能发现自己被锁在外面。另外,reload 不会断开已建立的连接,所以理论上不会把自己踢掉线,但为了保险,我建议测试新连接之前先开启第二个SSH会话,保持一个兜底通道。

3.2 改端口到底有没有用

把 SSH 端口从 22 改成别的,比如 2222、10022,很多人觉得这是纯粹的心理安慰。我的评价是:它治标不治本,但确实是低成本降低扫描噪音的有效手段。互联网上的自动扫描器主要针对默认端口,改了端口,大量无差别扫描就会绕开你。

但必须清醒认识到:有针对性的攻击者可以快速扫描端口找到 SSH 服务。所以改端口只能作为辅助手段,不能替代密钥认证和后续的访问控制。改的方式很简单:

Port 10022

建议选择一个不常见的端口,范围在 1024 到 65535 之间。改完别忘了更新防火墙放行规则,否则自己先被挡在外面。另外,如果机器上跑了 SELinux,还需要同步调整端口标签:

semanage port -a -t ssh_port_t -p tcp 10022

这个细节很容易漏掉,很多 CentOS 用户改了端口死活连不上,查半天才发现是 SELinux 拦截。

3.3 用 AllowUsers 和 MaxAuthTries 压缩入口

SSH 还有一个很重要的配置是限制允许登录的用户名单和认证尝试次数。AllowUsers的效果是白名单机制,只有名单里的账户才能尝试登录,名单之外的直接拒绝,连密码验证环节都不会进入。我用一个专门的部署账户为例:

AllowUsers deploy admin1 admin2

这样配置之后,即使系统里还有残余的弱密码账户,攻击者也没办法从SSH这个入口去试。

MaxAuthTries控制的是每次连接允许的认证尝试次数,默认值是 6,有点偏大。我一般压到 3:

MaxAuthTries 3 LoginGraceTime 30

LoginGraceTime是登录超时时间,超过30秒没完成认证就断开连接。这两个参数组合起来,配合密钥认证,基本把SSH爆破的空间压缩到了很小。

注意:AllowUsers配置只能匹配用户名或者用户@来源IP的格式。如果管理员经常从动态 IP 登录,不要在这里绑得太死,否则容易把自己锁在门外。我建议在 AllowUsers 里只控制用户名,把来源 IP 的限制交给防火墙去做。

3.4 关于 sshd_config 的权限和归属

有一件事很多人都没注意到:/etc/ssh/sshd_config这个文件本身如果权限过于宽松,任何能写入的用户都可以给 sshd 偷偷加配置,比如插一个危险的端口转发或者放行某个恶意账户。所以安装完系统之后,我建议检查一下:

ls -l /etc/ssh/sshd_config

确认归属是 root:root,权限为 644 或更严格。/etc/ssh/目录下的主机密钥文件更敏感,ssh_host_ed25519_key这种私钥文件权限应该是 600,一旦泄露,攻击者可以用它来伪装你的服务器发起中间人攻击。

算法层面的调整也值得做。一些老版本系统还允许ssh-dss和ssh-rsa签名算法,这两种都已经不安全了,建议显式禁用:

KexAlgorithms curve25519-sha256,diffie-hellman-group16-sha512 HostKeyAlgorithms sk-ssh-ed25519@openssh.com,ssh-ed25519 PubkeyAcceptedAlgorithms ssh-ed25519 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com

配置完之后同样要sshd -t检查。这里提醒一句,老版本的 OpenSSH(7.0 以下)可能不认识这些新算法名,升级 OpenSSH 之前不要贸然套用,否则会出现所有客户端都连不上的局面。

4. 内核参数与网络栈:让恶意数据包连敲门的机会都少了

4.1 通过 sysctl 收紧网络行为

Linux 内核的网络协议栈提供了很多可调参数,其中一部分和系统安全息息相关。我平时会专门整理一批 sysctl 参数作为基线,统一分发到所有服务器上。比较核心的有这么几个:

net.ipv4.ip_forward = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.tcp_syncookies = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.all.log_martians = 1

逐个解释一下。accept_redirects说的是是否接受ICMP重定向报文。重定向是路由器用来告诉主机“你走这条路更近”的机制,但对于服务器来说基本用不上,反而可能被攻击者用来篡改路由表,把流量引到恶意设备上。关掉没毛病。

accept_source_route是 IPv4 源路由选项,攻击者可以用它指定数据包的传输路径,从而绕过防火墙检测。现在的网络环境里源路由几乎没有合法用途,直接关闭。

tcp_syncookies是 SYN Cookie 机制,当 SYN 队列被占满时,通过构造特殊序列号的响应包来验证连接合法性,这是抵御 SYN Flood 攻击的有效武器。默认值可能是 0,务必改成 1。

rp_filter是反向路径过滤,启用后内核会检查数据包进来的接口是否与路由表一致,不一致就丢弃。这是防 IP 地址伪造的重要手段。注意不要和net.ipv4.conf.all.rp_filter混淆,all的值是逻辑或关系,必须确保所有网卡的rp_filter都为 1。

写入配置的方式是放在/etc/sysctl.d/99-security.conf里,然后执行sysctl --system或sysctl -p生效。建议用独立文件而不是直接改/etc/sysctl.conf,后续哪个参数出了问题方便单独排查和回滚。

验证方式:

sysctl net.ipv4.tcp_syncookies

4.2 关键:网络层限制配合防火墙

我见过一些团队调了很多内核参数,却忘记检查防火墙规则,结果服务器对外开放了十几个端口,攻击面比预想的大得多。内核参数只能加固协议栈的行为,但端口是否对外可访问,是防火墙决定的事。

我这里说一个“最小开放端口”的原则:一台普通的Web服务器,对外只需要开放 80(HTTP)和 443(HTTPS),SSH 端口只对管理网段开放。其余端口一律拒绝。

用 nftables 或者 iptables 实现。下面是 nftables 的一个最小示例:

nft add table inet filter nft add chain inet filter input { type filter hook input priority 0; policy drop; } nft add rule inet filter input ct state established,related accept nft add rule inet filter input iif lo accept nft add rule inet filter input tcp dport 80 accept nft add rule inet filter input tcp dport 443 accept nft add rule inet filter input tcp dport 10022 ip saddr 192.168.10.0/24 accept

注意策略是默认丢弃,然后逐条放行。这个顺序千万不要写反,先放行再丢弃会导致规则混乱。ct state established,related accept这一条很重要,它保证已经建立的连接不会被误伤,否则你的出站响应对应包会被自己防火墙拦掉,表现为“能出去不能回来”。

删除端口前先确认服务确实没在监听。判断监听状态:

ss -tlnp

这个命令列出所有正在监听的TCP端口和对应进程,比老的netstat -anp更简洁,也是排查端口遗漏的首选工具。

4.3 AIDE与文件完整性基线:从网络层转向文件层

网络和登录入口收紧了,攻击者的直接入口变少,但我们还要防“已经被突破之后”的情况。Linux 文件繁多,攻击者留下的后门往往藏在某些关键系统文件里,比如把/usr/bin/systemctl替换成带后门的版本,或者往/etc/ld.so.preload里塞恶意动态库。这类篡改用肉眼看很难发现,必须依赖文件完整性校验工具。

AIDE(Advanced Intrusion Detection Environment)是我常用的工具。它会在系统干净状态时采集文件哈希、权限、属主、文件大小等信息,生成基线数据库。之后定期扫描对比,一旦发现文件发生变化就告警。

初始化过程:

aideinit

默认数据库路径是/var/lib/aide/aide.db.gz。生产环境建议把数据库存放路径改到独立磁盘分区甚至远程存储,否则攻击者同时篡改了文件又更新了数据库,校验就形同虚设。我见过一台机器被人改了/bin/ls,顺手也把 AIDE 数据库更新了,等发现时已经过去了几个月。

AIDE 的配置文件中有一个重要选项是排除目录,比如/proc、/sys、/dev这些动态目录不能纳入校验,否则每次扫描都会有大量噪音。另外,/var/log/和/tmp/这类内容频繁变化的目录也建议排除,聚焦于静态文件更有效。

校验频率方面,我是在 cron 里配置每天凌晨执行一次:

0 3 * * * /usr/bin/aide --check >> /var/log/aide/aide.log 2>&1

增量模式-C可以在每日全量检查之间快速对比小范围变化,有异常就立即查。这个工具本身不防篡改,但它提供的告警能力,让排查时间从几个月缩短到几小时。

5. 文件系统与关键目录:权限松一分,风险大十分

5.1 挂载参数中的安全取舍

文件系统层面的加固容易被忽略,因为平时很少有人仔细看/etc/fstab。但攻击者一旦拿到受限权限,能做的破坏很大程度上取决于文件系统挂载时给了多少自由度。不少发行版默认把某些目录挂载得过于宽松。

拿 Linux 最常用的 ext4 和 XFS 来说,挂载时可以指定一些安全相关的选项。比如/tmp目录,很多服务都会往这里写临时文件,但/tmp本身不应该是可执行程序的存放地。攻击者可以往/tmp丢一个 payload,然后诱导某个高权限进程去执行,这是很经典的提权路径。我建议在 fstab 里这样挂载/tmp:

/tmp ext4 defaults,noexec,nosuid,nodev 0 0

noexec禁止执行二进制文件,nosuid禁止SUID位生效,nodev禁止设备文件。这三个选项叠加起来,能在很大程度上削弱临时目录的攻击价值。这里有个坑:有些程序的安装包需要从/tmp跑安装脚本,挂上noexec之后会报权限错误。遇到这种情况,要么临时mount -o remount,exec /tmp再装,要么把安装包换个路径。

/home或者专门的数据目录也建议加上nodev,nosuid。这几个选项不会影响正常读写,只限制特殊文件类型的创建和访问,性价比极高。

查看当前挂载参数:

mount | grep /tmp

如果之前没有指定,可以用mount -o remount,noexec,nosuid,nodev /tmp临时改,但要想永久生效必须改 fstab。

5.2 关键文件与SUID的基线管理

Linux 系统里 SUID 是个很有意思的机制。它允许普通用户以文件属主的身份执行某个程序,典型例子是/usr/bin/passwd。这个机制本身不是坏事,但攻击者可以用它来做文章。一个自定义的 SUID 二进制文件,可以让普通用户直接获得 root 的权限执行某个操作,甚至直接派生一个 root Shell。

所以每隔一段时间,我会扫描一遍全盘的 SUID 文件:

find / -perm -4000 -type f 2>/dev/null

正常情况下输出的文件应该是一个可预期的清单,比如/bin/mount、/usr/bin/su、/usr/bin/passwd这些。如果清单里出现了奇怪的文件路径,或者新增了不明来历的 SUID 文件,就要高度警惕了。删除 SUID 位用:

chmod u-s /path/to/file

另一个需要关注的是关键文件的可写权限。我建议检查一下系统里有哪些重要目录被赋予了other用户的写权限:

find / -xdev -type d -perm -0002 -print

正常系统里输出应该很少,最多是/tmp和/var/tmp这类明确需要共享写入的目录。如果发现/etc、/usr、/var下的目录有全局写权限,那基本属于配置事故,攻击者可以往这些目录里植入恶意脚本,静默等待触发。

/etc/shadow的权限也值得单独检查,正常应该是 000 或 600。有些老系统为了兼容某些工具,把 shadow 设成 644,等于把密码哈希撒得满地都是。密码哈希一旦被拿走去跑字典攻击,就是时间问题了。

5.3 锁定关键的“隐藏”开关

最后一个容易被忽视的是cron目录和启动脚本。攻击者特别喜欢把反弹 Shell 脚本挂在/etc/cron.d/或者写入/etc/crontab,因为这种方式即使系统重启也能保持持久化。我建议定期检查这几个位置:

ls -la /etc/cron.d/ cat /etc/crontab

同时留意/etc/systemd/system/下有没有新增的.service文件,尤其是名字故意伪装成系统服务的那种。检测方法就是不定期对比目录内容的快照,或者用前面提到的 AIDE 对这些路径做重点监控。

补充一个实用习惯:所有新部署的服务都应该用独立的低权限账户运行,不要用 root 直接跑。比如 Nginx、MySQL、Redis,它们在各自的发行版包里都有对应的专用账户,检查一下确认没有被改成 root 就行。

6. 审计与监控:加固不是一锤子买卖

6.1 auditd:让每个敏感操作都留下记录

安全加固做到这里,攻击面已经被大幅收缩。但没有任何一套配置是永久有效的,攻击者在想尽办法绕过规则。这时候最需要的是审计能力——系统里有没有发生不该发生的动作,如果有,能不能回溯到具体的人和命令。

Linux 自带的 auditd 是目前最可靠的内核级审计方案。它基于内核的审计框架,能记录文件访问、系统调用、登录事件、账户变更等关键操作。安装和启动非常简单:

yum install audit systemctl enable auditd systemctl start auditd

重点在规则配置。以监控/etc/passwd、/etc/shadow、/etc/sshd_config这几个核心文件为例:

auditctl -w /etc/passwd -p wa -k passwd_watch auditctl -w /etc/shadow -p wa -k shadow_watch auditctl -w /etc/ssh/sshd_config -p wa -k sshd_config_watch

-w指定被监控文件,-p wa表示记录写入和修改属性操作,-k是为规则打的标签,方便后期筛选日志。这些规则只是临时生效,要把它们持久化,应该写进/etc/audit/rules.d/audit.rules或者使用auditctl -R导入。

查看审计日志有三种方式:ausearch按条件查询,aureport生成统计报告,/var/log/audit/audit.log直接翻原始日志。排查时我常用:

ausearch -k passwd_watch -ts today

这条命令列出今天所有针对 passwd 文件的写操作,包括发起进程、用户ID、命令路径,定位问题非常高效。

审计规则别上来就一把梭全监控,那是给自己制造噪音。我建议分阶段:先覆盖登录和关键账户文件,跑一段时间观察量级,再逐步扩大到二进制目录和配置目录。

6.2 登录安全:从 PAM 配置到账户锁定策略

PAM(Pluggable Authentication Modules)是 Linux 系统认证框架的核心,几乎所有的认证入口——SSH、su、sudo、图形登录——最终都会经过它。PAM 配置里有两个常用的安全模块值得加强:pam_tally2和pam_faillock。

它们的作用是账户锁定,连续多次认证失败后暂时锁定账户,防止暴力破解。Ubuntu 上我用pam_faillock比较多,配置在/etc/pam.d/common-auth和/etc/pam.d/common-account里:

auth required pam_faillock.so preauth silent audit deny=4 unlock_time=900 auth required pam_faillock.so authfail audit deny=4 unlock_time=900 account required pam_faillock.so

含义是连续失败4次锁定15分钟。不建议把阈值降得太低,比如 2 次,否则管理员自己输错几次密码就被锁了,运维事故比安全风险更让人头疼。

CentOS/RHEL 上的配置路径稍有不同,用的是/etc/pam.d/password-auth和/etc/pam.d/system-auth,模块名是pam_faillock也更常见。改 PAM 配置前一定要备份原始文件,并且用pam-auth-update检查语法一致性,配置错误可能导致所有人都无法登录。

还有一个秘密被很多人忽略:/etc/securetty。这个文件控制 root 允许从哪些终端登录,如果里面有不该出现的伪终端名称,等于给 root 登录开了小门。建议只保留基本的控制台条目,其余删掉。

6.3 日志侵入检测的简单套路

日志排查是所有安全监控的基础。但日志文件本身也可能被篡改,所以有一件事必须在加固阶段就做好:让日志及时转走。最简单的方式是配置 rsyslog 把关键日志转发到集中的日志服务器,或者至少同步到独立的存储位置。

在/etc/rsyslog.conf里加一行:

*.* @192.168.10.10:514

让所有日志实时外送到日志收集节点。即使攻击者清了本机日志,集中平台上的记录依然存在。这是事后溯源的救命稻草,强烈建议在生产环境落地。

日常巡检我一般看这几类日志:

日志路径关注内容
/var/log/secure 或 auth.log登录成功/失败、sudo 使用记录
/var/log/croncron 任务执行是否有异常新条目
/var/log/messages 或 syslog网络、内核、系统级报错
/var/log/audit/audit.log审计事件,特别是有失败和拒绝的事件

圈出重点之后,我习惯用一条命令快速过滤暴力破解尝试:

grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20

列出尝试次数最多的来源IP。这个数据不仅用于应急,也用来做防火墙的黑名单配置或者买云厂商的安全组策略参考。

7. 工具推荐:加固之后还要能持续看见风险

配置做完了,但如果只是手动检查一遍,过了两个月又回到原样。我习惯在每台机器上部署一套轻量级安全监控工具,把“事后发现”变成“实时预警”。

第一梯队的工具是 RKHunter 和 Chkrootkit,专门用来检测rootkit和后门。RKHunter 扫描已知恶意程序的特征码,对比系统二进制文件的哈希值,检查网络端口异常绑定。我把它配置成每天执行一次,并输出报告:

rkhunter --check --sk

第一次运行时会因为系统文件属主权限和其他因素产生告警,需要根据实际情况生成白名单。这一步挺重要,否则每天收到一堆误报,最后连告警都不看了。

第二梯队是 Osquery。它是 Facebook 开源的系统插桩工具,把操作系统抽象成一张可以 SQL 查询的表。比如我想查所有监听的端口:

SELECT * FROM listening_ports;

或者查所有 UID 为 0 的用户:

SELECT * FROM users WHERE uid = 0;

Osquery 的价值在于可以集中管理,同时它可以把采集结果发送到集中平台做规则检测。对有一定基础设施规模、又不想上重型的商业化安全工作台的情况,这个方案是性价比很高的中间选择。

另外还有一个方向是配置基线检查工具,像 OpenSCAP、Lynis。Lynis 是傻瓜式的好东西,一条命令输出系统安全状况报告:

lynis audit system

它会检查系统更新状态、文件权限、用户配置、网络设置、软件漏洞等数百个项目,然后给出一个 hardening index 和一个建议清单。虽然没有实现自动化修复,但作为持续巡检的补充维度很有用。

把这些工具全部配上之后,加固体系才算完整:登录入口有强认证,网络层有最小开放,文件系统有权限约束,文件变化有完整性校验,操作行为有审计日志,风险状态有定期扫描。这条链路闭合了,才能真正降低运营一台Linux系统的安全焦虑。

8. 我自己踩过的三个“加固陷阱”

技术清单讲完了,我想单独说说实际运维里最容易翻车的三个点,因为每一步我都吃过亏。

第一个坑是改 SSH 配置时没有留兜底通道。有一年我在一台离线的物理机上调整 sshd_config,把PasswordAuthentication设成 no,然后执行了 reload,随后发现自己当前的连接因为配置改变被踢了,密钥认证又因为 localhost 主机的密钥权限问题失败。结果是我人就在机房,但机器的SSH理论上已经把我放逐了,最后只能通过带外管理口登录修复。现在我的习惯是:改任何 SSH 配置之前,先screen开一个会话,然后在里面sudo su到另一个用户,或者干脆同时在机器上开两个连接测试。对待改动大型服务配置,永远默认会有问题,都需要先给自己留一条后路。

第二个坑是防火墙规则顺序写反。当时在给一台生产数据库服务器做加固,我要求默认策略 drop,但我在规则里先写了一堆 drop,最后才写 accept 放行,导致业务连接被自己防火墙拦截。排查了半天发现是对外端口没有放行,而连接本地时因为回环接口放行了,所以本地测试一切正常,只有外部访问异常。这个教训让我养成了“写完防火墙规则,第一件事用另一台机器验证外部访问”的习惯。

第三个坑和 AIDE 有关。我很早就部署了 AIDE,但数据库存在了本机,结果在一次真实的入侵事件里,攻击者不仅伪造了几个二进制,还顺手更新了 AIDE 数据库。等我们发现文件不对劲时,重新比对已经无从谈起。从那以后我把 AIDE 数据库定期同步到独立的备份存储,且每次检查之后马上把新基线外传,避免“既当运动员又当裁判”的局面。

这三件事的共性其实都是同一个:安全加固不是配置下发了就万事大吉,它需要持续的维护、冗余的安全通道和对策失败时的预案。这也是我写系统安全加固系列的一个初衷——不是给一份抄完就忘的配置单,而是希望每个接过服务器运维的人,都建立起一套自己的安全检查节奏和危机应对意识。这一篇是 Linux 环境的做法,之后的系列里我会继续顺着应用层、容器层和云上架构的加固思路往下走。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询