Ubuntu安全基线配置的核心就是从系统安装完成那一刻起,把所有不必要的服务关掉、把默认宽松的权限收紧、把内核参数调到防御级别。具体来说,你需要做三件事:第一,裁剪系统服务和用户权限;第二,配置防火墙和SSH hardening;第三,通过sysctl调整内核参数,关闭不安全的网络行为。下面我把每一步拆开讲清楚,给你可以直接执行的方案。
一、系统安装后第一步:最小化安装与用户权限管控
很多人装完Ubuntu Server就直接跑业务,这是最大的安全隐患。正确做法是选择最小化安装(Minimal Installation),只装必要的包。装完之后,立刻执行以下操作。
首先创建一个普通用户,禁止root直接登录SSH:
useradd -m -s /bin/bash secuser passwd secuser usermod -aG sudo secuser
然后编辑SSH配置文件,禁用root远程登录:
sudo vim /etc/ssh/sshd_config
找到并修改以下几项:
PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes MaxAuthTries 3 LoginGraceTime 30 ClientAliveInterval 300 ClientAliveCountMax 2
改完之后重启SSH服务:
sudo systemctl restart sshd
这一步的意义在于:攻击者扫描到你的22端口,无法用root暴力破解,也无法用密码登录,只能走密钥认证,攻击面直接砍掉80%以上。
二、防火墙基线:UFW的正确配置方式
Ubuntu自带UFW(Uncomplicated Firewall),默认是关闭状态。开启之后,默认策略设为拒绝所有入站,只放行必要端口。具体命令如下:
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp sudo ufw allow 443/tcp sudo ufw allow 80/tcp sudo ufw enable
如果你的服务器只需要SSH和HTTPS,那就只开22和443。如果还有其他业务端口,按需添加。千万不要直接ufw allow from any,要精确到端口和协议。另外,建议安装fail2ban配合UFW做SSH暴力破解防护:
sudo apt install fail2ban -y sudo systemctl enable fail2ban sudo systemctl start fail2ban
fail2ban默认会监控SSH日志,检测到多次失败登录就自动封禁IP,一般封禁时间设为1小时比较合理。你可以编辑/etc/fail2ban/jail.local自定义规则。
三、内核参数加固:sysctl配置详解
这是整篇文章最硬核的部分。Linux内核有大量默认参数是为了兼容性和性能优化的,但从安全角度看,很多都需要收紧。所有内核参数通过/etc/sysctl.conf或/etc/sysctl.d/目录下的文件来配置。
先创建一个专门的安全配置文件:
sudo vim /etc/sysctl.d/99-security.conf
然后写入以下内容,我逐条解释:
# 禁用IP转发,除非你做路由器或VPN net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 # 防止SYN洪水攻击 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_synack_retries = 2 # 禁用ICMP重定向,防止中间人攻击 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 # 禁用源路由,防止IP欺骗 net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 # 启用反向路径过滤,防止IP伪造 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 记录可疑包(martians、bogus等) net.ipv4.conf.all.log_martians = 1 # 禁用IPv6(如果不用的话,减少攻击面) net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 # 限制core dump,防止敏感信息泄露 kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E fs.suid_dumpable = 0 # 限制dmesg访问,防止内核信息泄露 kernel.dmesg_restrict = 1 # 限制kernel指针地址暴露(KASLR增强) kernel.kptr_restrict = 2 # 限制perf事件(防止侧信道攻击) kernel.perf_event_paranoid = 3 # 限制BPF系统调用(防止未授权内核操作) kernel.unprivileged_bpf_disabled = 1 # 限制eBPF(同上,双重保险) net.core.bpf_jit_harden = 2 # 防止内存溢出攻击 vm.mmap_rnd_bits = 28 vm.mmap_rnd_compat_bits = 16 # 限制消息队列大小 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296
写完之后执行sudo sysctl -p让配置立即生效。这些参数的核心逻辑是:关闭不必要的网络功能、防止IP欺骗和路由劫持、限制内核信息暴露、加固内存随机化。特别是kernel.kptr_restrict = 2和kernel.unprivileged_bpf_disabled = 1这两项,在近年的内核漏洞利用链中被反复使用,必须加上。
四、文件系统与权限加固要点
内核参数只是网络层面,文件系统权限同样重要。Ubuntu默认的/tmp是用tmpfs挂载的,这很好,但你还需要确保关键目录权限正确。
检查并修正以下权限:
sudo chmod 1777 /tmp
sudo chmod 750 /root
sudo chmod 755 /home
sudo find / -perm /6000 -type f -exec chmod a-s {} \; 2>/dev/null
sudo find / -perm /4000 -type f -exec chmod a-s {} \; 2>/dev/null上面的find命令是清除所有SUID和SGID位,因为这些位意味着普通用户可以以root身份执行特定程序,是提权的常见路径。清除之后,只对确实需要的二进制文件(如passwd、ping)重新设置。
另外,建议开启AppArmor或SELinux。Ubuntu默认启用AppArmor,你可以检查状态:
sudo aa-status
确保关键服务(如nginx、mysqld、sshd)都有对应的AppArmor profile在enforce模式。如果某个服务不需要AppArmor保护,至少也要设为complain模式做监控。
五、软件包管理与自动更新策略
安全基线不是一次性的工作。Ubuntu的apt包管理器支持自动安全更新,强烈建议开启:
sudo apt install unattended-upgrades -y sudo dpkg-reconfigure -plow unattended-upgrades
在配置界面中选择"Yes"启用自动安全更新。这样系统会自动安装安全补丁,不需要你手动操作。但注意,自动更新只覆盖安全仓库(security.ubuntu.com),不会动其他软件包,避免兼容性问题。
同时,定期运行以下命令检查系统状态:
sudo apt update && sudo apt list --upgradable sudo systemctl list-units --type=service --state=running sudo netstat -tulnp
这三条命令分别检查:可更新的包、正在运行的服务、监听的端口。任何你不认识的服务和端口,都要追查清楚。
六、审计与日志:最后一道防线
加固做得再好,没有审计等于白做。Ubuntu使用rsyslog和journald记录日志,你需要确保关键事件被记录。
检查auditd是否安装:
sudo apt install auditd -y sudo systemctl enable auditd sudo systemctl start auditd
添加以下审计规则,监控关键文件和系统调用:
sudo auditctl -w /etc/passwd -p wa -k identity sudo auditctl -w /etc/shadow -p wa -k identity sudo auditctl -w /etc/group -p wa -k identity sudo auditctl -w /etc/sudoers -p wa -k privilege sudo auditctl -w /var/log/auth.log -p wa -k authlog
这些规则会监控身份文件、权限文件和认证日志的任何修改。如果有人篡改了passwd或者提权,auditd会记录下来。把这些规则写入/etc/audit/rules.d/audit.rules确保重启后依然生效。
七、总结:安全基线是持续过程不是一次性任务
把上面所有步骤走一遍,你的Ubuntu服务器安全基线就基本到位了。但我要强调一点:安全基线不是配完就完事。你需要每季度做一次全面复查,包括内核参数是否有新的CVE需要调整、软件包是否有新漏洞、审计日志是否有异常。安全是一个动态对抗的过程,基线只是起点,持续运营才是关键。建议配合CIS Benchmark for Ubuntu作为参考标准,定期做合规检查,把安全做到制度化、流程化。
