3. 主机边界加固:操作系统安全配置、服务最小化、端口管控策略
主机边界,说白了就是你的服务器面对网络的第一道防线。我见过太多团队,防火墙策略做得花里胡哨,结果主机本身却像个筛子——漏洞一堆、服务乱开、端口全敞着。这就像你家大门装了金库级别的锁,但窗户全开着,你觉得安全吗?
这一章,我们就来聊聊怎么把主机这堵墙砌结实。我会从操作系统安全配置、服务最小化、端口管控三个维度展开,这些都是我这些年摸爬滚打总结出来的实战经验。
3.1 操作系统安全配置:打好地基
操作系统是主机安全的基础。地基没打好,上面再多的安全措施都是空中楼阁。我个人习惯,拿到一台新服务器,第一件事不是装应用,而是做一轮系统安全加固。
3.1.1 账户与认证管理
这是最基础,也是最容易被忽视的一环。我曾经接手过一个项目,服务器上居然还有出厂默认的 admin 账户,密码都没改。你说吓不吓人?
| 配置项 | 推荐做法 | 风险说明 |
|---|---|---|
| 默认账户 | 禁用或重命名 root、Administrator 等默认账户 |
默认账户是暴力破解的首要目标 |
| 密码策略 | 长度≥12位,包含大小写、数字、特殊字符,90天强制更换 | 弱密码是内网横向移动的通行证 |
| 登录失败锁定 | 连续5次失败,锁定账户30分钟 | 防止暴力破解 |
| SSH密钥认证 | 禁用密码登录,仅允许密钥认证 | 密钥认证比密码安全一个数量级 |
| 最小权限原则 | 普通用户使用 sudo 提权,禁止直接使用 root |
降低误操作和恶意提权的风险 |
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): 确保已启用,增加缓冲区溢出攻击的难度。
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
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 知识体系总览
下面这张图,把主机边界加固的核心逻辑串起来了。你可以把它当作一个检查清单,每次加固时对照着来。
好了,主机边界加固的核心内容就这些。记住,安全配置不是一次性工作,而是持续的过程。系统版本更新、业务需求变化,都可能引入新的风险。定期检查、持续优化,才能让你的主机边界真正固若金汤。