刚装好的Ubuntu系统默认配置偏向易用性,很多安全选项并没有打开。如果这台机器要对外提供服务,或者哪怕只是放在内网长期运行,都应该先做一轮基础的安全加固。安全加固听起来像是很专业的工作,其实对新手来说,掌握几个核心方向就能挡住绝大多数自动化扫描和脚本小子的攻击。本文以Ubuntu Server为例,从账号、SSH、防火墙、自动更新四个方面,手把手演示一遍加固流程。

一、先把账号和权限的基础打好
安全的第一道防线永远是账号体系。Ubuntu默认禁用了root账号的密码登录,这是好事,但仍有一些细节需要检查。首先要确认系统里有没有密码为空或者长期不用的账号,可以用下面的命令快速排查:
# 查看所有可登录用户
cat /etc/passwd | grep -v nologin | grep -v false
# 检查是否有空密码账号(正常应该没有输出)
sudo awk -F: '($2==""){print $1}' /etc/shadow
如果发现有空密码账号,必须立刻设置密码或者锁定它:sudo passwd -l 用户名可以锁定账号,锁定后的账号无法再通过密码登录。对于日常操作,建议坚持使用普通用户加sudo的方式,而不是长时间挂着root会话,这样即使误操作或者账号被盗,破坏范围也有限。
其次要注意sudo权限的分配。检查/etc/sudoers时不要直接编辑这个文件,正确做法是用sudo visudo,它会做语法校验,避免你写错一个字符把整个sudo搞挂。原则上是需要什么授权什么,比如只允许某个用户重启服务,就只给那一条命令的权限,而不是简单粗暴地给ALL。
密码策略也值得顺手配一下。安装libpam-pwquality后可以强制要求密码长度和复杂度,编辑/etc/security/pwquality.conf,设置minlen = 12和minclass = 3,要求至少十二位且包含三类字符。同时可以用chage -M 90 用户名设置密码九十天过期,不过对于使用密钥登录的场景,这个策略的优先级可以放低。
二、SSH是攻击者最爱的入口,重点加固
公网服务器的日志里,/var/log/auth.log几乎每天都会堆积大量失败登录记录,全都是针对SSH的暴力破解。加固SSH主要从三件事入手:改端口、禁root、上密钥。
第一步先在本地生成密钥对,然后把公钥传到服务器:
# 本地机器执行,生成ed25519密钥(比RSA更短更安全) ssh-keygen -t ed25519 -C "my-server-key" # 把公钥上传到服务器 ssh-copy-id -i ~/.ssh/id_ed25519.pub user@服务器IP
确认密钥登录成功之后,再修改SSH配置文件/etc/ssh/sshd_config,关键几项如下:
Port 2222 # 改掉默认22端口,减少大部分扫描噪音 PermitRootLogin no # 彻底禁止root远程登录 PasswordAuthentication no # 禁止密码登录,只允许密钥 PubkeyAuthentication yes MaxAuthTries 3 # 限制认证尝试次数 ClientAliveInterval 300 # 空闲会话超时 ClientAliveCountMax 2
改完之后一定要先执行sudo sshd -t做语法检查,确认无误再重启服务。这里有个新手常踩的坑:改配置前务必保留一个已经登录的SSH会话不要断开,新开一个终端去测试新配置能否登录。一旦配置写错把自己锁在门外,就只能靠控制台 rescue 模式救回来了。另外,如果你的Ubuntu版本较新,配置可能拆分在/etc/ssh/sshd_config.d/目录下的文件里,后写的配置会覆盖主文件,检查时要留意。
光靠改端口只能减少噪音,真正防暴力破解建议装fail2ban。它的工作原理是监控日志,发现同一IP在短时间内认证失败次数过多,就自动调用防火墙把它封禁一段时间:
sudo apt install fail2ban sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 编辑jail.local,加入: # [sshd] # enabled = true # maxretry = 5 # bantime = 3600 sudo systemctl enable --now fail2ban # 查看封禁情况 sudo fail2ban-client status sshd
三、用UFW配置防火墙,最小化开放端口
Ubuntu自带的防火墙管理工具UFW(Uncomplicated Firewall)是iptables的前端,命令简单直观。加固的核心原则是最小权限:只放行确实需要的端口,其他一律拒绝。
sudo ufw default deny incoming # 默认拒绝所有入站 sudo ufw default allow outgoing # 默认允许所有出站 # 放行SSH(注意如果你改了端口,这里要写新端口) sudo ufw allow 2222/tcp # 放行Web服务 sudo ufw allow 80/tcp sudo ufw allow 443/tcp # 限定某些管理端口只允许内网访问 sudo ufw allow from 192.168.1.0/24 to any port 5432 # 最后启用 sudo ufw enable sudo ufw status verbose
操作顺序很重要:一定要先放行SSH端口再执行ufw enable,否则启用防火墙的瞬间你的远程连接就会被掐断。UFW默认规则已经处理好IPv6,不需要额外配置。如果服务器前面有云厂商的安全组,建议两层都配,安全组做粗粒度的网络隔离,UFW做主机层面的精细控制,比如限制某个端口只对特定IP开放。
对于更复杂的场景,UFW还支持应用配置文件,安装Nginx后执行sudo ufw app list能看到Nginx Full之类的预置规则,直接sudo ufw allow 'Nginx Full'即可,比手动记端口方便得多。
四、让安全补丁自动安装,别裸奔等更新
很多入侵事件利用的都是早已公开漏洞的旧版本软件,受害者只要及时打补丁本可以完全避免。但人总是懒的,服务器一多就更顾不过来,所以让安全更新自动化是性价比最高的加固措施之一。
Ubuntu提供了unattended-upgrades组件,配置好后它会每天自动检查并安装安全仓库的补丁:
sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades
配置文件在/etc/apt/apt.conf.d/50unattended-upgrades里,默认只启用安全更新,这个默认值是合理的。可以按需调整邮件通知、是否自动移除无用依赖等选项。日志位于/var/log/unattended-upgrades/,定期瞄一眼确认它在正常工作。
需要提醒的是,自动更新只装安全补丁,不会大版本升级软件,这对生产环境是相对安全的策略。但涉及内核更新时仍需重启才生效,可以用checkrestart或者needs-restarting类工具检查哪些进程还在用旧库文件,安排维护窗口统一重启。
最后,加固不是一次性动作。建议每隔一段时间用lynis这类审计工具跑一遍系统体检,它会输出一份安全评分和改进建议清单,非常适合作为复盘清单。把账号、SSH、防火墙、补丁这几件事做扎实,你的Ubuntu服务器就已经超过互联网上一大半的机器了,剩下的就是保持关注、持续迭代。
Ubuntu安全加固防火墙配置SSH安全修改时间:2026-09-15 12:58:40