服务器安全加固实操在内网的时候服务器安全很少被重视——都在防火墙后面同事也信得过谁会从内部攻击你但一旦这台机器上了公网游戏规则就彻底变了。公网扫描机器人不讲情面。它们 24 小时扫 22 端口发现就标记用密码字典撞。把服务器从内网搬到公网相当于把客厅的东西搬到了马路边——之前不锁门不代表现在也不用。公网服务器为什么不经打公网服务器最容易失守的往往是最不起眼的登录入口。暴露在公网的Linux 机器面对的不是某个黑客而是 24 小时不间断的自动化扫描。脆弱性来自三个层面的叠加攻击面过宽每个开放端口和运行的服务都是潜在入口。认证方式过弱密码本质是在用人类有限的记忆对抗机器的无限算力。权限边界模糊一个入口被突破后攻击者能横向走多远。加固的本质就在这三个维度上逐层收紧。整个过程像加固一座堡垒收攻击面是砌城墙换认证是配虎符管权限是发通行令再加哨塔值守——跳过任何一步防线就多一个缺口。下面按纵深防御五层展开每层先讲为什么再讲怎么做。第一层封死多余的城门 —— 服务最小化不启动就等于不存在吗很多人以为“系统默认装了什么就装了什么用不着的服务不启动就行了。”不对。没启动的服务躺在系统里万一被误启动、依赖唤醒或漏洞激活你就多了个未知通道。每一个监听端口都是攻击者可以伸手试推的门。最好的办法是把不用的门直接砌墙封死。怎么做先看清开了几道门ss -tlnp0.0.0.0:端口对全网开放127.0.0.1:端口只监听本机。常见多余服务rpcbind(111)、cups(631)、avahi-daemon(5353)、postfix(25)。systemctl disable --now rpcbind.socket rpcbind.servicesystemctl disable --now cups avahi-daemon# postfix 根据实际情况决定关完再跑一次ss -tlnp。原则每个监听端口都要能说出为什么需要它说不上就关。第二层把口令换成虎符 —— SSH 密钥登录 禁密码 禁 root密码够复杂就万事大吉很多人以为密码够长够复杂就安全。不对。密码是人脑对抗机器——字典几百万条肉鸡并行跑覆盖内迟早撞开。密钥不一样。ed25519 是 256 位椭圆曲线穷举算力比宇宙年龄长。不是好一点是量级的差别。打个比方口令是喊暗号谁听清谁进。虎符是两块令牌严丝合缝你那半块永不离开口袋。还开着密码堡垒大门就是报暗号级验证。怎么做第一步生成密钥对在你电脑上不是服务器ssh-keygen -t ed25519 -Cmy-server-key生成后~/.ssh/下id_ed25519私钥权限 600和id_ed25519.pub公钥。第二步推送公钥ssh-copy-id -i ~/.ssh/id_ed25519.pub root你的服务器IP推送完不要关当前终端。新开窗口用密钥验证能连上再继续下一步。第三步关密码 禁 root 远程cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date %Y%m%d)vim /etc/ssh/sshd_config改三行参数值含义PasswordAuthenticationno暗号验证关掉PermitRootLoginnoroot 直接进城不给PubkeyAuthenticationyes虎符验证保留sshd -t# 无输出 语法正确systemctl restart sshd验证ssh root你的服务器IP返回Permission denied (publickey)就对了。为什么禁 rootroot 是默认管理员名攻击者不需猜用户名。禁掉后得同时猜对用户名和密码门槛乘两个数量级。第三层城门口设哨塔 —— fail2ban 自动封禁撞不开就可以不管了换了虎符之后很多人以为“攻击者撞密码也无所谓反正撞不开。”但有两个问题失败连接消耗资源、填满日志万一哪天误操作把密码登录又开了——暗号验证重新暴露你已很久没注意到。你需要一个城墙上打更的哨兵——连撞三次关地牢。fail2ban 就是这个哨兵持续读日志任何 IP 短时间失败 N 次自动加黑名单。怎么做# CentOS/RHELyum install epel-release -y; yum install fail2ban -y# Ubuntu/Debianaptinstall fail2ban -ycp /etc/fail2ban/jail.conf /etc/fail2ban/jail.localvim /etc/fail2ban/jail.local核心配置[DEFAULT]ignoreip127.0.0.1/8 ::1bantime86400 # 封 24 小时findtime600 # 10 分钟内maxretry3 # 失败 3 次就封[sshd]enabledtrueportsshlogpath/var/log/secure # Ubuntu 用 /var/log/auth.logbanactionfirewallcmd-ipset # Ubuntu 用 ufw systemctl enable fail2ban --nowfail2ban-client status sshd看到Currently banned有数字哨塔就开始工作了。哨塔局限只能事后封禁。撞门第一下对方已知堡垒存在。最彻底的思路——不认识的人连城门在哪都不知道。这就是第四层。第四层改城门位置 筑外墙 —— 换 SSH 端口 防火墙策略换端口就是自欺欺人很多人以为“改端口号不是真正的安全措施nmap 一扫就暴露了。”只对一半。密码学意义上端口不提供安全保障但现实中扫描机器人只扫默认端口——同时扫几十万台每台只花几百毫秒。换端口的本质从随手一撞就发现变得专门来找。防火墙才是真正的城墙默认拒绝一切入站只放行明确允许的端口和来源。怎么做vim /etc/ssh/sshd_config# 注释掉 Port 22改成 1025–65535 区间高位端口Port 22918 firewall-cmd --permanent --remove-servicesshfirewall-cmd --permanent --add-port22918/tcp# 有固定 IP 可进一步收窄为白名单firewall-cmd --permanent --add-rich-rulerule familyipv4 source address你的IP/32 port port22918 protocoltcp acceptfirewall-cmd --reload systemctl restart sshdssh-p22918-i ~/.ssh/id_ed25519 user你的服务器IP云服务器注意阿里云/腾讯云/AWS 还需在控制台安全组同步放行新端口。别忘了更新 fail2ban 的端口配置。第五层管好城内通行令 —— 用户权限最小化防住了外面就高枕无忧做完前四层很多人觉得“外面的人进不来里面的事就不用管了。”攻击者未必从 SSH 进来——Web 漏洞、依赖后门、供应链污染都可能拿到低权限 shell。进城后能走多远看你给了多大通行范围。前四层解决谁能进城第五层解决进城后能走多远。怎么做第一步创建日常管理员账号useradd-m adminpasswd adminusermod-aG wheel admin # Ubuntu 用 sudo 组第二步SSH 加用户白名单vim /etc/ssh/sshd_configAllowUsers admin这样系统即使有其他账号git、www-data、mysql也永远无法远程 SSH。第三步审计 SUID 文件。SUID 让任何人以文件所有者通常是 root权限运行。多余的 SUID 是典型提权通道。find / -perm-4000-type f 2/dev/null正常的 SUIDpasswd、su、sudo、ping、mount。如果看到vim.basic或/home/user/下的脚本带 SUID 位——立刻chmod u-s去掉。顺手拧几个螺丝五层走完安全基线已远超大多数服务器。再顺手拧几个sshd_config 追加参数——限制认证次数、释放僵死连接MaxAuthTries 3、MaxSessions 5、ClientAliveInterval 300、ClientAliveCountMax 2、X11Forwarding no内核加三道防护——防 SYN Flood、防 Smurf 放大、防 IP 欺骗/etc/sysctl.d/99-security.conf写入tcp_syncookies1、icmp_echo_ignore_broadcasts1、accept_source_route0然后sysctl --system。自动安全更新可选CentOS 装yum-cronUbuntu 装unattended-upgrades。最后说一句服务器安全加固技术门槛不高。不需要懂零信任不需要考安全证书花半小时就行。但真正关键的是养成条件反射每台新服务器上线前先跑安全基准检查。就跟出门带上门一样——不是 100% 管用但已不假思索。攻击者不会因为你技术好就绕道。他们只会在门上试一下看能不能推开。推不开就去下一家。安全不是做到无懈可击只要比别人多一道防线就够了。