很多人第一次接触Ubuntu服务器,装完系统、开了SSH、把网站跑起来之后,就以为事情结束了。实际上,一台完全默认配置的Ubuntu服务器暴露在公网上,短则几小时,长则一两天,就会被自动化扫描工具盯上。攻击者并不需要认识你,他们只是在全网段扫22端口、扫弱密码、扫已知漏洞。所以安全配置不是可选项,而是上线前的第一步。

先明确一个基本思路:Ubuntu服务器安全配置的核心不是装某个“一键加固脚本”,而是把攻击面收窄、把访问权限收紧、把审计和更新机制建立起来。下面按从外到内的顺序,把最关键的几个环节讲清楚。

第一件事:不要用root直接登录SSH

默认情况下,很多云厂商创建的Ubuntu实例允许root账号通过密码或密钥登录。root账号权限最大,一旦被爆破成功,整台机器就完全沦陷。所以第一件事是创建一个普通用户,给它sudo权限,然后禁止root远程登录。

创建用户并加入sudo组:

adduser myadmin
usermod -aG sudo myadmin

然后编辑SSH配置文件:

nano /etc/ssh/sshd_config

找到或添加以下配置:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

保存后重启SSH服务:

systemctl restart ssh

这里要特别注意顺序:先确认你的普通用户能通过密钥登录,再关闭root登录和密码登录。否则一旦操作失误,你自己就会被锁在服务器外面。

用密钥登录代替密码登录

密码登录最大的问题是容易被暴力破解。哪怕你用了复杂密码,每天几万次尝试也让人不安。密钥登录则完全不同,私钥在你本地,公钥放在服务器上,没有私钥就无法登录。

在本地电脑生成密钥对(如果还没有):

ssh-keygen -t ed25519 -C "my-server-key"

把公钥复制到服务器:

ssh-copy-id myadmin@服务器IP

完成后,用myadmin账号测试登录。确认没问题后,再按上一节的方法关闭密码登录。这样SSH入口就基本固若金汤了。

更改SSH默认端口(可选但有效)

22端口是全网扫描的重灾区。把SSH端口改成一个不常用的高位端口,能过滤掉大量无差别攻击。虽然这不算真正的安全措施,但能显著减少日志噪音和暴力尝试。

编辑SSH配置:

Port 2222

同时确保防火墙放行新端口,然后重启SSH。之后登录时需要指定端口:

ssh -p 2222 myadmin@服务器IP

注意:改端口不能替代密钥登录和禁用root,它只是额外的一层干扰。

启用防火墙:UFW是Ubuntu自带的最简单方案

Ubuntu默认安装了UFW(Uncomplicated Firewall),但通常没有启用。UFW的本质是iptables的前端,用起来非常简单。

先设置默认策略:拒绝所有入站,允许所有出站。

ufw default deny incoming
ufw default allow outgoing

然后放行你需要的服务端口。比如SSH(如果改了端口就放行新端口)、HTTP、HTTPS:

ufw allow 2222/tcp
ufw allow 80/tcp
ufw allow 443/tcp

最后启用防火墙:

ufw enable

查看状态:

ufw status verbose

启用前一定要确认放行了SSH端口,否则远程连接会直接断开。

自动更新安全补丁

Ubuntu的软件源会持续发布安全更新。很多服务器被入侵,并不是因为配置多复杂,而是因为某个已知漏洞没有及时修补。手动更新容易忘记,所以应该开启自动安全更新。

安装unattended-upgrades:

apt install unattended-upgrades

启用它:

dpkg-reconfigure --priority=low unattended-upgrades

选择“是”即可。之后系统会自动下载并安装安全更新,一般不需要重启服务,但内核更新可能需要重启。你可以配置自动重启时间,或者定期手动重启。

限制登录尝试次数:fail2ban

即使你用了密钥登录,仍然会有大量机器人尝试连接。fail2ban会监控日志,发现某个IP反复失败后,自动在防火墙层面封禁它一段时间。

安装:

apt install fail2ban

默认配置对SSH有效,但建议创建一个本地配置文件来覆盖默认值:

nano /etc/fail2ban/jail.local

写入:

[sshd]
enabled = true
port = 2222
maxretry = 3
bantime = 3600

这里port要改成你实际的SSH端口。maxretry表示最多尝试3次,bantime是封禁时间(秒)。重启fail2ban后生效。

关闭不必要的服务

Ubuntu服务器默认安装的服务很少,但如果你后续装了数据库、缓存、面板等,要定期检查哪些服务在监听外部端口。

查看所有监听端口:

ss -tulpn

如果发现某个服务不需要对外提供服务,就让它只监听本地地址。比如MySQL或Redis,通常只需要本机应用访问,可以修改配置文件,把绑定地址改成127.0.0.1。

对于Redis这类默认无密码的服务,如果暴露在公网,几分钟内就会被当作跳板或植入挖矿程序。所以务必检查:

redis-cli CONFIG GET bind

如果返回的不是127.0.0.1,就要修改配置文件并重启。

设置合理的文件权限

网站目录、配置文件、密钥文件的权限如果设置不当,也会造成安全隐患。一个常见错误是把网站根目录设为777,或者把私钥文件放在可被Web读取的位置。

基本原则:

网站文件一般属于运行Web服务的用户(如www-data),权限设为755或750即可,不需要777。

SSH私钥文件权限必须是600:

chmod 600 ~/.ssh/id_ed25519

配置文件(如.env)包含数据库密码等敏感信息,权限应设为600,并且不要放在网站可访问的目录下。

定期查看日志和登录记录

安全配置做完之后,还需要保持观察。至少每周看一次登录日志和认证日志。

查看最近登录记录:

last -20

查看SSH认证失败记录:

grep "Failed password" /var/log/auth.log | tail -20

如果发现异常IP或异常时间段的登录成功记录,要立即排查是否被入侵。

用AppArmor限制程序行为

Ubuntu默认启用了AppArmor,这是一种强制访问控制机制,可以限制程序能访问哪些文件、网络和资源。很多服务(如MySQL、CUPS)自带AppArmor配置文件。

查看AppArmor状态:

aa-status

对于自己编译或安装的服务,可以编写自定义AppArmor配置,但入门阶段先确保默认配置生效即可。不要随意禁用AppArmor,它能在服务被攻破后限制攻击者的横向移动。

备份与恢复计划

安全配置做得再好,也无法保证100%不被入侵。所以备份是最后一道防线。至少要做到:

数据库每天自动备份,网站文件每周备份,配置文件变更后立即备份。备份文件不要只放在同一台服务器上,应该同步到对象存储或另一台机器。

一个简单的数据库备份脚本示例:

mysqldump -u root -p数据库名 > /backup/db_$(date +%F).sql

配合cron定时执行:

0 3 * * * /usr/local/bin/backup.sh

这样即使服务器被删库、被勒索,也能快速恢复。

总结一下,Ubuntu服务器安全配置的优先级从高到低是:SSH访问控制、防火墙、自动更新、服务最小化、文件权限、日志审计、备份。把这七件事做完,你的服务器就已经比互联网上大多数裸奔的机器安全得多。安全不是一次性工作,而是持续的习惯。