说出来你可能不信,前段时间我帮一个创业的朋友排查服务器,机器 CPU 跑满好几天了,业务卡得连 SSH 都快登不进去了。
我好不容易挤进去一看,好家伙,top 里一个不知名的随机字符串进程正狂吃 CPU。再翻翻 /var/log/secure,血压直接上来了:从第一次被 SSH 爆破,到最终木马植入,中间整整隔了 11 天!

这 11 天里,成千上万个国外的肉鸡 IP 在轮番试他们的 root 密码。朋友公司的运维甚至都没改默认端口,密码还是经典的 Admin@2023。这等于大门敞开着,门口还挂了个牌子:“欢迎光临,随便试”。
我见过太多服务器被黑,90% 都是从 SSH 弱口令开始的。很多人觉得配置安全策略太麻烦,每次都要配大半天。所以这次,我把压箱底的 8 个 SSH 与系统防线的加固脚本拿出来了。
别废话,直接抄走。建议先收藏,找个测试机跑通了,再上生产环境一把梭。
还在用密码登录 Linux 的,真的是心大。黑客的字典厚度绝对超乎你的想象。第一步,把门锁换成指纹锁(密钥登录)。

#!/bin/bash# 脚本1:强制启用密钥登录,干掉密码认证sed -i 's/^#\?PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_configsed -i 's/^#\?PubkeyAuthentication no/PubkeyAuthentication yes/g' /etc/ssh/sshd_configsed -i 's/^#\?PermitEmptyPasswords yes/PermitEmptyPasswords no/g' /etc/ssh/sshd_configsystemctl restart sshdecho"密码登录已废掉,以后只能用密钥进来了!"⚠️ 警告:跑这个之前,必须确保你已经把公钥传到 ~/.ssh/authorized_keys 里了,不然你自己也进不去!
全网的扫描器每天都在扫 22 端口,你把它改成一个五位数的冷门端口,能躲过 80% 的盲扫。

#!/bin/bash# 脚本2:修改 SSH 端口为 22333NEW_PORT=22333sed -i "s/^#\?Port .*/Port $NEW_PORT/g" /etc/ssh/sshd_config# 防火墙放行新端口(以 firewalld 为例)firewall-cmd --permanent --zone=public --add-port=$NEW_PORT/tcpfirewall-cmd --reloadsystemctl restart sshdecho"大门已挪到 $NEW_PORT,下次记得用 -p $NEW_PORT 登录。"如果你非要留着密码登录,那至少得养条狗。只要连续试错 3 次,直接把这个 IP 关进小黑屋 24 小时。

#!/bin/bash# 脚本3:一键部署 Fail2banyum install -y epel-release && yum install -y fail2bancat > /etc/fail2ban/jail.local <<EOF[DEFAULT]bantime = 86400findtime = 600maxretry = 3ignoreip = 127.0.0.1/8 10.0.0.0/8 192.168.0.0/16[sshd]enabled = trueport = 22333logpath = /var/log/secureEOFsystemctl enable --now fail2banecho"放门狗已就位,谁再敢爆破直接封 IP!"生产环境最稳妥的做法,是所有服务器只允许堡垒机或公司 VPN 的出口 IP 登录,其他 IP 直接在 TCP 层丢弃。

#!/bin/bash# 脚本4:TCP Wrappers 设卡 (假设跳板机 IP 为 10.0.0.100)TRUSTED_IP="10.0.0.100"# 拒绝所有 SSH 连接echo"sshd:ALL" > /etc/hosts.deny# 只放行白名单 IPecho"sshd:$TRUSTED_IP" > /etc/hosts.allowecho"TCP 设卡完毕,除了 $TRUSTED_IP 谁也别想连!"我前面提到那个被挖矿的机器,黑客进去后第一件事就是篡改了 wget 和 curl。我们直接用 chattr 给核心文件上不可变属性。

#!/bin/bash# 脚本5:核心文件锁定防篡改chattr +i /etc/passwdchattr +i /etc/shadowchattr +i /etc/groupchattr +i /etc/gshadowchattr +i /etc/ssh/sshd_config# 锁定关键下载工具chattr +i /usr/bin/wgetchattr +i /usr/bin/curlecho"核心文件已锁定!(以后要修改记得先执行 chattr -i 解锁)"被黑不怕,怕的是被黑了你一个月后才知道。只要有人登录成功,立马给你手机弹消息。

#!/bin/bash# 脚本6:登录成功飞书/钉钉 webhook 告警# 这里以一个通用的 Webhook 地址为例,你需要换成你自己的WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-key"cat > /etc/profile.d/ssh_alert.sh <<EOF#!/bin/bashif [ -n "\$SSH_CLIENT" ]; then IP=\$(echo \$SSH_CLIENT | awk '{print \$1}') USER=\$(whoami) TIME=\$(date "+%Y-%m-%d %H:%M:%S") HOST=\$(hostname) MSG="【安全告警】\n主机: \$HOST\n用户: \$USER\n来源 IP: \$IP\n时间: \$TIME\n说明: 发生了一次成功的 SSH 登录,请确认是否为本人操作!" curl -s -H "Content-Type: application/json" -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"\$MSG\"}}"$WEBHOOK_URL &>/dev/null &fiEOFchmod +x /etc/profile.d/ssh_alert.shecho"眼线已安插,下次登录你的手机就会震动了。"很多人连上 SSH,去抽根烟、吃个饭,终端就一直挂着。一旦电脑离开视线,极其危险。强制设置空闲超时,发呆 10 分钟自动踢下线。

#!/bin/bash# 脚本7:SSH 空闲自动踢出echo"TMOUT=600" >> /etc/profileecho"readonly TMOUT" >> /etc/profileecho"export TMOUT" >> /etc/profilesed -i 's/^#\?ClientAliveInterval.*/ClientAliveInterval 600/g' /etc/ssh/sshd_configsed -i 's/^#\?ClientAliveCountMax.*/ClientAliveCountMax 0/g' /etc/ssh/sshd_configsystemctl restart sshdecho"摸鱼防范机制已开启,发呆 10 分钟自动断开。"大招放最后。既然 opsadmin 这种普通账号能通过 sudo 干活,为什么还要让 root 暴露在枪口下?直接把 root 的远程登录权限彻底封杀。

#!/bin/bash# 脚本8:禁止 Root 远程登录# 前提:确保你已经建好了普通管理账号,并且配置了 sudo 权限!sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/g' /etc/ssh/sshd_configsystemctl restart sshdecho"Root 已被关禁闭,以后只能用普通账号登录再 su - 提权了!"安全防范本来就是和黑客抢时间。那 11 天的空窗期,如果上面这 8 招里随便哪一招拦在前面,那个挖矿木马都进不来。
把这几个脚本根据你公司的实际情况揉在一起,写个初始化的 Shell,新开机器的时候顺手跑一下。别嫌麻烦,等你半夜被电话叫醒,满头大汗地去排查被勒索病毒加密的文件时,你就会知道,现在敲这几行命令有多香。
1、告别单点故障!Linux双网卡绑定实战,让故障自动“绕行”
看完本文有收获?请分享给更多人
推荐关注「Linux 运维进阶之路」,提升Linux技能
