3. 主机边界加固:操作系统安全配置、服务最小化、端口管控策略

主机边界,说白了就是你的服务器面对网络的第一道防线。我见过太多团队,防火墙策略做得花里胡哨,结果主机本身却像个筛子——漏洞一堆、服务乱开、端口全敞着。这就像你家大门装了金库级别的锁,但窗户全开着,你觉得安全吗?

这一章,我们就来聊聊怎么把主机这堵墙砌结实。我会从操作系统安全配置、服务最小化、端口管控三个维度展开,这些都是我这些年摸爬滚打总结出来的实战经验。

3.1 操作系统安全配置:打好地基

操作系统是主机安全的基础。地基没打好,上面再多的安全措施都是空中楼阁。我个人习惯,拿到一台新服务器,第一件事不是装应用,而是做一轮系统安全加固。

3.1.1 账户与认证管理

这是最基础,也是最容易被忽视的一环。我曾经接手过一个项目,服务器上居然还有出厂默认的 admin 账户,密码都没改。你说吓不吓人?

配置项 推荐做法 风险说明
默认账户 禁用或重命名 root、Administrator 等默认账户 默认账户是暴力破解的首要目标
密码策略 长度≥12位,包含大小写、数字、特殊字符,90天强制更换 弱密码是内网横向移动的通行证
登录失败锁定 连续5次失败,锁定账户30分钟 防止暴力破解
SSH密钥认证 禁用密码登录,仅允许密钥认证 密钥认证比密码安全一个数量级
最小权限原则 普通用户使用 sudo 提权,禁止直接使用 root 降低误操作和恶意提权的风险
我的小技巧: 在 Linux 上,我习惯用 pam_tally2 模块来做登录失败锁定。配置起来很简单,效果却立竿见影。你可以试试看。

3.1.2 文件系统与权限

文件权限设置不当,等于把敏感数据拱手送人。我记得有一次排查安全事件,发现攻击者就是通过一个权限为 777 的日志目录写入的恶意脚本。

  • 关键目录权限: /etc、/var/log、/usr/local 等目录,非必要不给写权限。
  • SUID/SGID 文件: 定期扫描并移除不必要的 SUID/SGID 文件。这些文件是提权的常用跳板。
  • 分区挂载选项: 对 /tmp、/var/tmp 等目录,挂载时加上 noexec、nosuid 选项。
# 扫描 SUID 文件
find / -perm -4000 -type f 2>/dev/null

# 挂载 /tmp 时禁用执行权限
mount -o remount,noexec,nosuid /tmp

3.1.3 内核参数与安全模块

内核层面的加固,能有效抵御某些高级攻击。我个人比较关注以下几点:

  • 启用 SELinux 或 AppArmor: 强制访问控制机制,即使进程被攻破,也能限制其行为。
  • 内核参数调整: 比如禁用 IP 转发(除非必要)、启用反向路径过滤(rp_filter)、调整 net.ipv4.tcp_syncookies 防范 SYN Flood。
  • 地址空间布局随机化(ASLR): 确保已启用,增加缓冲区溢出攻击的难度。
注意: 启用 SELinux 可能会影响某些应用的正常运行。建议先在测试环境验证,再推送到生产环境。我曾经因为没做充分测试,导致一个 Web 服务直接 502,教训深刻。

3.2 服务最小化:少即是多

你想想看,一个系统上运行的服务越多,攻击面就越大。服务最小化的核心原则就是:只安装必要的软件,只运行必要的服务,只开放必要的端口。

3.2.1 安装最小化系统

安装操作系统时,别图省事选“全部安装”。我建议只选基础组件,比如 Minimal 或 Server 模式。后续需要什么再装什么,这样系统最干净。

3.2.2 禁用不必要的服务

系统装好后,第一件事就是检查并禁用那些用不上的服务。比如打印服务(cups)、蓝牙服务(bluetooth)、邮件服务(postfix)等,在服务器上基本用不到。

# 查看所有运行中的服务
systemctl list-units --type=service --state=running

# 禁用并停止一个服务
systemctl disable --now cups.service

3.2.3 移除不必要的软件包

有些软件包自带漏洞,留着就是定时炸弹。比如 telnet、rsh、ftp 等老旧协议,数据传输不加密,早就该淘汰了。

避坑指南: 我曾经在一个客户的服务器上发现了 telnetd 服务,一问才知道是运维人员为了方便调试装的。我当场就让他卸载了,并强制改用 SSH。记住,方便和安全往往是对立的。

3.3 端口管控策略:把好大门

端口是主机与外界通信的通道。端口管控,就是决定哪些通道可以开,哪些必须关。说白了,就是给主机装个“门禁系统”。

3.3.1 端口扫描与基线建立

在制定策略之前,你得先知道系统上到底开了哪些端口。我习惯用 netstat 或 ss 命令做一次全面扫描。

# 查看所有监听中的 TCP/UDP 端口
ss -tuln

然后,根据业务需求,建立一份端口基线清单。比如:

端口 协议 服务 是否必需 备注
22 TCP SSH 是 管理用,建议限制来源 IP
80 TCP HTTP 是 Web 服务
443 TCP HTTPS 是 Web 服务
3306 TCP MySQL 否 仅内网访问,不应暴露公网
25 TCP SMTP 否 非邮件服务器,应关闭

3.3.2 本地防火墙策略

端口基线建立后,就要用本地防火墙(如 iptables、firewalld、nftables)来落地策略。核心思路是:默认拒绝,按需放行。

# 使用 firewalld 示例
# 默认拒绝所有入站流量
firewall-cmd --set-default-zone=drop

# 放行 SSH(仅限管理网段)
firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24
firewall-cmd --permanent --zone=trusted --add-service=ssh

# 放行 Web 服务(对所有来源)
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https

# 重新加载配置
firewall-cmd --reload
我的习惯: 我会把管理端口(如 SSH)单独放到一个 trusted 区域,只允许特定 IP 段访问。业务端口放到 public 区域。这样分层管理,清晰又安全。

3.3.3 端口与服务的联动管控

端口管控不能只看端口本身,还要和服务联动。比如,你开放了 3306 端口,但 MySQL 服务本身配置了只允许本地回环地址(127.0.0.1)监听,那这个端口实际上对外是不可达的。这就是“双重保险”。

# MySQL 配置示例(/etc/mysql/my.cnf)
bind-address = 127.0.0.1

这样做的好处是,即使防火墙策略被误改,服务本身也不会暴露到危险网络中。

3.4 知识体系总览

下面这张图,把主机边界加固的核心逻辑串起来了。你可以把它当作一个检查清单,每次加固时对照着来。

主机边界加固知识体系 主机边界加固核心逻辑 主机边界加固 操作系统安全配置 服务最小化 端口管控策略 账户与认证管理 文件系统与权限 内核参数与安全模块 安装最小化系统 禁用不必要的服务 移除不必要的软件包 端口扫描与基线建立 本地防火墙策略 端口与服务联动管控 核心原则:默认拒绝,按需放行;最小权限,纵深防御 三者缺一不可,形成主机边界安全闭环

好了,主机边界加固的核心内容就这些。记住,安全配置不是一次性工作,而是持续的过程。系统版本更新、业务需求变化,都可能引入新的风险。定期检查、持续优化,才能让你的主机边界真正固若金汤。