操作系统安全加固:打好边缘网关的第一道防线
边缘网关这东西,说白了就是跑在“前线”的Linux小盒子。我见过太多项目,业务代码写得漂漂亮亮,结果操作系统层面全是窟窿。嗯,今天我们就来聊聊怎么把这层地基打牢。
核心原则:边缘网关的操作系统加固,不是做加法,而是做减法。装最少的东西,开最少的端口,给最少的权限。
最小化安装原则:从源头瘦身
我个人习惯,装系统时只选“最小化安装”或“无图形化”选项。你想想看,一个跑在野外的网关,要什么桌面环境?要什么办公软件?
具体做法:
- 安装时只选
@core或minimal包组 - 装完后用
rpm -qa | wc -l检查包数量,一般控制在 300-400 个以内 - 用
yum history或dnf history记录每次安装,方便回溯
我的经验:有一次客户网关被入侵,查了半天,发现是系统自带的 cups 打印服务有漏洞。可那台网关压根没接打印机!从那以后,我坚持“不用的东西,一个包都不留”。
内核参数安全调优:让系统更“扛揍”
内核参数调优,很多人觉得是性能优化的事。其实不然,很多参数直接关系到安全。我一般会在 /etc/sysctl.d/ 下放一个 99-security.conf 文件,把调优规则集中管理。
几个必调参数:
| 参数 | 推荐值 | 作用 |
|---|---|---|
net.ipv4.tcp_syncookies |
1 | 开启 SYN Cookie,防 SYN Flood 攻击 |
net.ipv4.conf.all.rp_filter |
1 | 开启反向路径过滤,防 IP 欺骗 |
net.ipv4.conf.all.accept_source_route |
0 | 禁用源路由,防路由劫持 |
kernel.exec-shield |
1 | 启用执行保护,防缓冲区溢出 |
net.ipv4.tcp_timestamps |
0 | 关闭时间戳,防系统指纹探测 |
# /etc/sysctl.d/99-security.conf 示例
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
kernel.exec-shield = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.conf.all.log_martians = 1
# 应用配置
sysctl -p /etc/sysctl.d/99-security.conf
注意:调完参数一定要在测试环境验证。我曾经在线上网关直接改 net.core.somaxconn,结果业务连接全断了。嗯,血的教训。
禁用不必要的服务与端口:关掉每一扇“后门”
边缘网关通常只跑几个核心服务:数据采集、协议转换、上云通信。其他服务,一律禁用。
我的检查清单:
- 用
systemctl list-unit-files --type=service | grep enabled列出所有开机自启服务 - 逐个确认:这个服务真的需要吗?
- 不需要的,执行
systemctl disable --now <服务名> - 用
ss -tlnp查看当前监听端口,只保留业务端口和 SSH(且 SSH 要改端口)
常见“多余”服务:
cups.service— 打印服务,边缘网关用不到avahi-daemon.service— 零配置网络,容易泄露信息postfix.service— 邮件服务,网关一般不收发邮件rpcbind.service— RPC 服务,除非你用 NFS
避坑指南:我曾经遇到过禁用 systemd-journald 导致日志全丢的情况。所以,禁用前先搞清楚依赖关系,用 systemctl list-dependencies 查一下。
用户与权限管理:sudo 和 PAM 的“黄金搭档”
边缘网关通常只有 2-3 个运维人员管理。我建议:
- 禁用 root 直接登录,用普通用户 + sudo 提权
- sudo 权限要细化到命令级别
- PAM 配置要限制登录来源和失败次数
sudo 配置示例:
# /etc/sudoers.d/edge-admin
# 允许 admin 用户执行特定命令
admin ALL=(ALL) /usr/bin/systemctl restart edge-gateway
admin ALL=(ALL) /usr/bin/journalctl
admin ALL=(ALL) /usr/bin/tail /var/log/edge/*.log
# 禁止执行危险命令
admin ALL=(ALL) !/usr/bin/passwd
admin ALL=(ALL) !/usr/bin/su
admin ALL=(ALL) !/usr/bin/visudo
PAM 配置要点:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
pam_tally2.so |
deny=5 unlock_time=300 |
5次失败锁定5分钟 |
pam_limits.so |
限制最大登录数 | 防止暴力破解 |
pam_access.so |
限制登录IP段 | 只允许管理网段登录 |
# /etc/pam.d/sshd 关键配置
auth required pam_tally2.so deny=5 unlock_time=300
auth required pam_access.so
account required pam_limits.so
警告:PAM 配置一旦写错,可能导致所有人都无法登录。我建议先开一个备用 SSH 会话,再修改 PAM 文件。万一锁了,还能从备用会话救回来。
文件系统安全:挂载选项与权限设置
文件系统这块,很多人只关注权限(chmod 777 这种),却忽略了挂载选项。其实挂载选项能提供更底层的保护。
关键挂载选项:
noexec— 禁止在分区上执行二进制文件,适合/tmp、/var/tmpnosuid— 忽略 suid 位,防止提权nodev— 禁止创建设备文件,防止挂载恶意设备ro— 只读挂载,适合/boot、/usr
# /etc/fstab 安全配置示例
/dev/sda1 /boot ext4 defaults,ro 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 /var ext4 defaults 0 0
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=512M 0 0
tmpfs /var/tmp tmpfs defaults,noexec,nosuid,nodev,size=256M 0 0
权限设置原则:
- 系统文件:755(目录) / 644(文件)
- 日志文件:640,属主 root,属组 adm
- 配置文件:600,只允许 root 读写
- 可执行文件:750,只允许属主和属组执行
我的习惯:我会用 find / -perm -4000 -o -perm -2000 定期扫描 suid/sgid 文件。这些文件是提权的“捷径”,能少就少。
知识体系总览
下面这张图,把操作系统安全加固的五个维度串起来了。你可以把它贴在工位上,每次加固时对照检查。
操作系统安全加固,说白了就是“少即是多”。装得少,攻击面就小;权限控得严,提权就难;日志留得全,溯源就有据。嗯,这套方法论我在十几个边缘网关项目里验证过,效果不错。你照着做,至少能挡住 80% 的常见攻击。