拿到一台全新的Ubuntu 22.04 LTS服务器,默认配置离生产环境标准还差得远。先别急着部署应用,SSH服务配置就是第一个需要动刀的地方。默认的22端口在公网上存活不到半小时就会被扫描器盯上,改端口虽然不是根本性的安全措施,但能过滤掉90%的噪音扫描。直接编辑/etc/ssh/sshd_config,把Port 22改成高位端口比如49221,同时把PermitRootLogin设为no,PasswordAuthentication也设为no。这两项改动意味着root账号无法直接登录,密码认证彻底关闭,只允许密钥登录。改完记得执行systemctl restart sshd,别断开当前会话,新开一个终端测试能否正常连接,确认无误再关旧会话。

系统用户和权限基线

生产环境最忌讳的就是所有人共用root账号。每台服务器至少要创建一个普通管理员账号,通过sudo提权执行管理命令。用adduser命令创建用户,然后usermod -aG sudo把用户加入sudo组。关键一步是配置sudo的日志记录,在/etc/sudoers.d/目录下创建配置文件,加入Defaults logfile="/var/log/sudo.log"这行,这样每次sudo操作都有据可查。同时检查/etc/passwd里哪些系统账号有登录shell,像daemon、bin、sys这些账号的shell应该设为/usr/sbin/nologin或/bin/false,用chsh命令批量修改。还有一个容易被忽略的细节:限制用户家目录权限,chmod 750 /home/*,防止不同用户之间互相窥探文件。

防火墙策略从零开始构建

Ubuntu自带的ufw是iptables的前端,足够满足大部分场景。初始策略必须是拒绝所有入站、允许所有出站:ufw default deny incoming && ufw default allow outgoing。然后按需开放端口,Web服务开80和443,刚才改过的SSH端口也要放行,ufw allow 49221/tcp。如果服务器上有多个网络接口,还要指定接口和来源IP做精细控制,比如只允许办公网IP段访问SSH端口:ufw allow from 10.0.1.0/24 to any port 49221 proto tcp。启用ufw之前务必确认SSH端口已经放行,否则直接断连只能去控制台救火。ufw enable执行后,用ufw status numbered查看规则列表,每条规则都有编号,方便后续增删。

自动安全更新不能完全托管

unattended-upgrades包可以自动安装安全更新,这个功能要开,但不能全量自动。编辑/etc/apt/apt.conf.d/50unattended-upgrades,只勾选安全更新源,其他更新保持手动。关键配置项包括Unattended-Upgrade::Automatic-Reboot设为false,避免更新内核后自动重启导致业务中断。还要设置邮件通知,Unattended-Upgrade::Mail填上运维邮箱,这样每次自动更新后都会收到报告。生产环境建议设置一个固定的维护窗口,每周手动跑一次apt update && apt upgrade,内核更新用apt full-upgrade,配合needrestart检查哪些服务需要重启以加载新库文件。

内核参数加固网络层

/etc/sysctl.conf里的网络参数直接决定服务器在网络攻击面前的韧性。以下几项必须调整:net.ipv4.tcp_syncookies=1开启SYN Cookie防护,抵御SYN Flood攻击;net.ipv4.ip_forward=0关闭IP转发,除非服务器充当路由器;net.ipv4.conf.all.accept_redirects=0和net.ipv4.conf.all.send_redirects=0禁止ICMP重定向;net.ipv4.conf.all.accept_source_route=0禁用源路由;net.ipv4.icmp_echo_ignore_broadcasts=1忽略广播ICMP请求。IPv6如果不用,直接net.ipv6.conf.all.disable_ipv6=1关掉,减少攻击面。改完执行sysctl -p生效,这些参数能挡掉大量基于网络协议漏洞的攻击。

审计和日志集中管理

auditd是Linux内核级的审计系统,能记录系统调用、文件访问等细粒度事件。安装后先配置/etc/audit/rules.d/audit.rules,至少监控/etc/passwd、/etc/shadow、/etc/sudoers这些关键文件的修改,以及sudo命令的执行。规则示例:-w /etc/passwd -p wa -k identity和-w /etc/sudoers -p wa -k sudoers_change。同时配置auditd日志轮转,避免磁盘被撑满。系统日志方面,rsyslog默认配置不够用,建议配置远程日志转发,把auth.log、syslog、kern.log集中发送到日志服务器。即使本地日志被攻击者清除,远程服务器上还有完整记录。logrotate配置也要检查,确保日志保留周期至少30天,压缩存储节省空间。

强制访问控制AppArmor

Ubuntu默认启用AppArmor,但很多人装完系统就忽略了它。用aa-status查看当前状态,能看到哪些进程处于enforce模式,哪些处于complain模式。对于Web服务、数据库这些直接暴露的服务,要确保AppArmor配置文件处于enforce状态。比如MySQL的AppArmor配置在/etc/apparmor.d/usr.sbin.mysqld,里面限制了MySQL进程能访问的文件路径。如果数据库数据目录改了位置,必须同步更新这个文件并执行apparmor_parser -r重新加载,否则服务起不来。自己开发的应用如果网络暴露面大,建议编写自定义AppArmor配置,用aa-genprof工具生成初始模板,再根据实际行为精调规则。

文件系统安全挂载选项

/etc/fstab里每个挂载点的选项直接影响文件系统层面的安全控制。/tmp目录是攻击者上传脚本的首选落脚点,必须加noexec、nosuid、nodev三个选项,禁止执行二进制文件、禁止SUID位生效、禁止设备文件。示例:tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0。/var/tmp同理,但某些应用可能需要/var/tmp下执行脚本,视情况调整。/home分区建议加nosuid,/boot分区加nodev和nosuid。如果服务器有独立的数据分区,比如存放用户上传文件的目录,一定要加noexec。这些挂载选项不会影响正常应用运行,但能有效阻断攻击者利用临时目录执行恶意代码的路径。

时间同步和DNS安全

时间不准会导致日志时间戳错乱,出问题时无法准确追溯事件顺序,TLS证书验证也可能失败。systemd-timesyncd是内置的时间同步服务,配置/etc/systemd/timesyncd.conf,NTP服务器至少配三个,优先选NTP Pool项目里离你地理位置近的服务器。timedatectl set-ntp true开启同步,timedatectl timesync-status检查同步状态。DNS方面,/etc/systemd/resolved.conf里配置DNS服务器,建议用Cloudflare的1.1.1.1和Quad9的9.9.9.9,两者都有恶意域名过滤能力。DNSSEC验证要开启,dnssec=yes,防止DNS劫持和缓存投毒。如果服务器需要对外提供DNS解析服务,那又是另一套安全配置体系了,这里不展开。

SSH进一步加固和Fail2Ban部署

前面改了SSH端口和认证方式,还有几个参数值得调整。ClientAliveInterval设为300,ClientAliveCountMax设为0,这样空闲5分钟的SSH连接自动断开。MaxAuthTries设为3,限制认证尝试次数。AllowUsers白名单指定哪些用户可以SSH登录,这是最有效的访问控制手段。Fail2Ban是防御暴力破解的利器,apt install fail2ban后,创建/etc/fail2ban/jail.local配置文件,针对SSH服务设置ban规则:bantime设为3600秒,findtime设为600秒,maxretry设为3次。Fail2Ban的原理是监控日志文件,匹配失败尝试后调用iptables封禁IP。除了SSH,还可以为Nginx、Apache等服务配置Fail2Ban规则,防止Web应用层面的暴力攻击。

服务最小化和端口审计

装完系统后用ss -tlnp查看所有监听端口,每看到一个端口就问自己:这个服务必须运行吗?能绑定在127.0.0.1吗?像Redis、MongoDB这类数据库,如果只被本地应用调用,就在配置里bind 127.0.0.1,不要监听0.0.0.0。systemctl list-unit-files --state=enabled列出所有开机自启服务,关掉不需要的:systemctl disable --now 服务名。云厂商的镜像经常预装一些监控agent,如果不用就卸载干净。cron任务也要审计,crontab -l看root的定时任务,/etc/cron.*目录下的脚本逐个检查,攻击者经常把持久化脚本藏在这里。

内核模块和系统调用限制

某些内核模块很少用到但存在潜在漏洞,比如usb-storage、firewire-core、bluetooth相关模块。在/etc/modprobe.d/blacklist.conf里禁用它们,格式是blacklist 模块名,改完执行update-initramfs -u更新initramfs。Docker等容器运行时会依赖部分内核特性,禁用前确认不影响业务。系统调用层面,如果应用不需要调试能力,可以在/etc/sysctl.conf里设置kernel.kptr_restrict=2和kernel.dmesg_restrict=1,限制非特权用户读取内核指针和dmesg信息,增加漏洞利用难度。kernel.yama.ptrace_scope设为1或2,限制ptrace系统调用的使用范围,防止进程注入。

备份策略和完整性校验

安全配置做得再好,没有备份也是白搭。至少要实现3-2-1备份原则:3份数据、2种介质、1份异地。用rsync配合cron做增量备份是最简单的方案,关键目录包括/etc、/var/log、/home以及应用数据目录。备份脚本里加上校验步骤,用sha256sum生成文件哈希列表,定期比对检查文件是否被篡改。AIDE是文件完整性检查工具,安装后执行aideinit初始化数据库,之后定期运行aide.wrapper --check,任何文件属性变化都会在报告中体现。把AIDE数据库存在只读介质或远程服务器上,防止攻击者同时篡改文件和数据库。

合规检查自动化

手动检查几十台服务器的安全配置不现实,CIS Benchmark是业界公认的Linux安全基线标准,Ubuntu对应的CIS基准有200多项检查点。Lynis是开源的安全审计工具,安装后运行lynis audit system,它会逐项检查并给出评分和改进建议。把Lynis集成到CI/CD流程或定期cron任务里,输出HTML报告存档。对于等保、PCI-DSS等合规场景,还需要额外配置审计规则和日志保留策略。OpenSCAP可以扫描合规状态并生成标准化报告,但学习曲线较陡,中小团队用Lynis配合人工检查足够覆盖大部分风险点。