Ubuntu服务器上线的第一步不是配置业务,而是立刻接管更新策略。默认情况下系统不会自动安装安全补丁,管理员容易遗忘,造成高危漏洞窗口期。直接用一条命令安装无人值守升级包:
sudo apt install unattended-upgrades -y
然后编辑配置文件 /etc/apt/apt.conf.d/50unattended-upgrades,确保至少打开安全更新源,再把自动清理和邮件通知配上。最后通过 dpkg-reconfigure 选择“Yes”激活定时任务。这样一来,系统每天自动拉取并安装安全补丁,内核热补丁也会在需要重启时通过 /var/run/reboot-required 提示你,既不会漏补丁,也不干扰业务。
第二招:最小化攻击面,关闭一切非必要服务
很多 Ubuntu 镜像默认带了云 init、snapd、cups、avahi-daemon 等服务,生产环境根本用不上,开着就是隐患。用 ss -tulpn 排查所有监听端口,对照业务需求逐一关闭。比如禁用 avahi-daemon 和 cups:
sudo systemctl disable --now avahi-daemon cups
对于没有明确用途的 systemd 服务,先用 systemctl list-unit-files --state=enabled 查看,再用 mask 彻底禁止启动。网络层面,如果服务器只有内网通信需求,直接卸载 network-manager,只保留 netplan 进行静态 IP 管理。原则很简单:任何不产生价值的端口都是送给攻击者的入口。
第三招:SSH 防护六层锁死
第一层是禁用密码登录,只允许密钥认证。编辑 /etc/ssh/sshd_config,设置 PasswordAuthentication no 和 ChallengeResponseAuthentication no。第二层是修改默认 22 端口,减少扫描器命中率,但不要依赖隐藏,配合 fail2ban 实时封禁才是正道。第三层限制登录用户,用 AllowUsers 或 AllowGroups 只放行特定账户。第四层关闭 root 直接登录:PermitRootLogin no。第五层调低登录超时与 TCP keepalive,ClientAliveInterval 300,ClientAliveCountMax 2,防止会话被劫持。第六层用 ssh-audit 工具检查加密套件强度,剔除弱算法,仅保留 curve25519 等高安全级密钥交换,并显式指定 KexAlgorithms、Ciphers、MACs。每改完一次 sshd_config 就 sshd -t 测试语法,再 systemctl reload sshd,确保不会把自己关在外面。
第四招:防火墙与流量整形,用 ufw 筑起白名单
Ubuntu 的 ufw 后端就是 iptables,但规则管理更清晰。先设置默认拒绝所有传入、允许所有传出:ufw default deny incoming,ufw default allow outgoing。然后按需开放监听端口,如 ssh、web 服务。关键点是限定源 IP:
sudo ufw allow from 192.168.10.0/24 to any port 22 proto tcp
这样只有内部网段能连 SSH。对于暴露在公网的端口,进一步配置速率限制:ufw limit 80/tcp,防止洪水攻击。不要忘了开启 ufw logging on 记录异常,日志会进入 /var/log/ufw.log,便于事后溯源。最后别忘了在服务器上真正启用 ufw enable,并在变更前确保管理口规则已添加,避免自锁。
第五招:强制访问控制,把 AppArmor 用到位
Ubuntu 默认启用 AppArmor,但很多管理员只停留在“不关闭”的状态,很少主动为关键进程编写自定义策略。先用 aa-status 确认 enforce 模式下有多少配置文件。对于 MySQL、Nginx、Tomcat 等高频组件,Ubuntu 仓库一般会携带默认 profile,但它们通常处于 complain 模式,仅记日志不阻断。应当用 aa-enforce 将其切换到强制模式:
sudo aa-enforce /etc/apparmor.d/usr.sbin.mysqld
自行开发的应用程序则需要生成专属 profile。aa-genprof 跟着应用的正常操作路径录制行为,然后手动精简权限集,杜绝 exec、网络访问、文件写越权。即便出问题,切换到 complain 模式看审计日志也能快速定位,远比出事后修补来得划算。
第六招:内核参数调优,阻断协议层攻击
sysctl 是看不见的装甲。新建 /etc/sysctl.d/99-security.conf,写入关键参数。启用 IP 包反欺骗:net.ipv4.conf.all.rp_filter=1,net.ipv4.conf.default.rp_filter=1。忽略 ICMP 重定向和所有源路由包:net.ipv4.conf.all.accept_redirects=0,net.ipv4.conf.all.send_redirects=0,net.ipv4.conf.all.accept_source_route=0。防范 SYN 洪水:net.ipv4.tcp_syncookies=1,net.ipv4.tcp_max_syn_backlog=2048。减少 TIME_WAIT 并开启 TCP 时间戳保护。内核日志也做限制,避免 kernel pointer 泄漏:kernel.kptr_restrict=2,kernel.dmesg_restrict=1。完成后 sysctl -p 生效,这些参数不给用户态攻击者可乘之机。
第七招:审计系统调用,建立不可篡改的行为日志
审计守护进程 auditd 可以记录所有系统调用的细节,是事后追查“谁、什么时候、做了什么”的根本手段。安装 auditd 后,先规划规则:监控 /etc/passwd、/etc/shadow 的写操作,监控 sudo 和 su 执行,监控特定敏感目录如 /var/www 的文件修改。示例规则写到 /etc/audit/rules.d/custom.rules:
-w /etc/shadow -p wa -k shadow_changes -w /etc/sudoers -p wa -k sudoers_changes -a always,exit -F arch=b64 -S execve -F euid=0 -k root_exec
然后 augenrules --load 加载。确保 auditd 服务设为 enabled 且日志轮转合理,/var/log/audit/ 下文件大小控制好。配合 aureport 和 ausearch 快速查询异常事件,比如列出所有被修改过的文件或提权动作。把审计日志远程转发到日志服务器,避免攻击者清除本地痕迹。
第八招:文件完整性监控,第一时间发现篡改
AIDE 是可靠的 HIDS 基座。安装 aide 后初始化数据库:aideinit,生成的 /var/lib/aide/aide.db.new 重命名为 aide.db。接着配置 /etc/aide/aide.conf,至少监控 /bin、/sbin、/usr/bin、/usr/sbin、/etc、/lib 等核心路径,加上 permission、owner、inode、md5 指纹等检查项。设定每日定时任务执行 aide.wrapper --check,并让结果邮件通知。任何新增的 setuid 可执行文件、被植入的脚本、库文件替换都会被抓出来。如果要更实时,可以在此基础上叠加 inotify,但 aide 的基础基线比对足够应对大多数非 APT 级别的篡改。
第九招:权限梳理与 sudo 精细化
普通用户的权限膨胀是生产环境最大的隐患之一。首先清查 /etc/sudoers 和 /etc/sudoers.d/ 里是否有 ALL=(ALL) NOPASSWD:ALL 这样的宽泛授权,统统收回,替换为最小必要命令集。比如只允许运维执行服务重启:
operator ALL=(root) /usr/bin/systemctl restart apache2, /usr/bin/systemctl status apache2
对程序运行账户,统一使用 systemd 的 DynamicUser 或 NoNewPrivileges,限制 SUID 位。周期性检查 /etc/passwd 中 UID 0 的可疑账户,禁止弱口令和空口令。结合 Polkit 进一步细化桌面无关的权限策略,让任何非预期提权都必须留下审计痕迹。
第十招:传输加密与证书自动化
任何对外暴露的 Web 或者 API 服务必须强制 TLS。用 Let's Encrypt 申请证书,并通过 certbot 自动续期。配置 Nginx 或 Apache 时,使用 Mozilla SSL Configuration Generator 生成的强安全 profile,关闭 TLSv1.1 及以下,只留 TLSv1.2、TLSv1.3,加密套件优先 ECDHE 前向安全。对于内部服务,也建议使用自签 CA 实现 mTLS,避免内网流量明文传输。数据库连接如 MySQL、PostgreSQL 强制启用 SSL 选项,并验证客户端证书,即使是内网也不应假设链路安全。
第十一招:入侵检测与 Rootkit 扫描
rkhunter 和 chkrootkit 是轻量级 rootkit 扫描器,每周 cron 跑一遍,比出了事再找有效得多。安装后先更新 rkhunter 的数据文件,然后运行 rkhunter --check --sk,将异常报警接入日志系统。对于更高级的威胁,可部署 OSSEC 或 Wazuh 进行主机入侵检测,监控日志异常、文件变化、注册表(无 Windows 则忽略)变动,并通过主动响应阻断可疑 IP。在生产环境中,把告警转发到集中平台,结合自定义解码规则,能大幅提高响应速度。
第十二招:备份与灾难恢复闭环
安全终究要落到业务连续性上。严格执行 3-2-1 备份策略:至少三份副本,两种不同介质,一份异地。Ubuntu 下用 borgbackup 或 restic 增量备份关键数据,加密后推送至远程存储。数据库采用 wal-g 或原生逻辑备份工具,保证可时间点恢复。更重要的是定期演练恢复流程,不是备份通过了就万事大吉。配合 systemd timer 或 cron 自动化,把备份状态纳入监控,一旦连续失败立即报警。最后别忘记保护备份凭证,一个泄露的备份桶账号足以让前面所有安全措施化为乌有。
