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作为参考标准,定期做合规检查,把安全做到制度化、流程化。