很多人第一次接触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访问控制、防火墙、自动更新、服务最小化、文件权限、日志审计、备份。把这七件事做完,你的服务器就已经比互联网上大多数裸奔的机器安全得多。安全不是一次性工作,而是持续的习惯。
