3、操作系统安全加固:Linux内核参数调优、最小化安装原则、账户与权限管理
各位同学,咱们今天聊点实在的。操作系统安全加固,说白了就是给你的风电Agent系统穿上一件“防弹衣”。我见过太多项目,业务逻辑写得飞起,结果操作系统裸奔,最后被攻击者从系统层面直接捅穿。嗯,这可不是危言耸听。
咱们分三块来讲:内核参数调优、最小化安装、账户与权限管理。这三板斧砍下去,你的系统至少能挡住80%的初级攻击。
3.1 内核参数调优:别让系统“裸奔”
Linux内核默认配置,说白了是为了通用性设计的。但咱们风电系统,对实时性、安全性要求极高。默认配置往往太“宽容”了。
我个人习惯,拿到一台新机器,第一件事就是改/etc/sysctl.conf。你想想看,如果内核允许任意IP伪造、允许未授权的网络连接,那你的Agent系统就是个大筛子。
3.1.1 网络层加固
先看几个关键参数:
# 禁止IP源路由欺骗
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 开启反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 忽略ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# 禁止发送重定向
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
我在项目中遇到过,某风场的内网被人植入了恶意程序,利用IP源路由欺骗绕过了防火墙。当时排查了三天,最后发现就是accept_source_route没关。你说冤不冤?
sysctl -p 使其生效。别问我为什么强调这个——我曾经在客户现场改完参数忘了重载,结果被安全审计打了个0分。
3.1.2 资源限制与防DoS
风电Agent系统经常要处理大量传感器数据。如果内核不限制资源,一个异常进程就能把整个系统拖垮。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| net.ipv4.tcp_syncookies | 1 | 开启SYN Cookie,防SYN Flood攻击 |
| net.ipv4.tcp_max_syn_backlog | 2048 | 限制半连接队列大小 |
| net.core.somaxconn | 1024 | 限制监听队列长度 |
| vm.swappiness | 10 | 减少swap使用,提升响应速度 |
这里有个小技巧:tcp_syncookies一定要开。我曾经在测试环境模拟过SYN Flood攻击,没开这个参数时,系统CPU直接飙到100%,Agent完全失联。开了之后,系统稳如老狗。
3.2 最小化安装原则:少即是多
这个原则,说白了就是“能不安的包,坚决不装”。你想想看,每多装一个软件包,就多了一个被攻击的入口。
我建议,安装操作系统时,只选最小化安装选项。比如CentOS/RHEL选“Minimal Install”,Ubuntu Server选“Minimal”。装完之后,再按需添加必要的包。
3.2.1 卸载不必要的服务
装完系统后,第一件事就是检查并禁用不必要的服务:
# 查看所有运行的服务
systemctl list-units --type=service --state=running
# 禁用常见的不安全服务
systemctl disable cups.service # 打印服务,风电系统用不到
systemctl disable avahi-daemon.service # 零配置网络,有安全风险
systemctl disable postfix.service # 邮件服务,除非你需要发告警邮件
我记得有一次,一个风场的服务器被人挖矿了。排查下来,居然是avahi-daemon的漏洞被利用。你说一个风电系统,要什么零配置网络?
3.2.2 包管理器的安全配置
包管理器本身也要加固。以yum/dnf为例:
# 在 /etc/yum.conf 中添加
gpgcheck=1
localpkg_gpgcheck=1
repo_gpgcheck=1
为什么要开gpgcheck?说白了就是防止你从非官方源下载到被篡改的包。我见过有人图省事,直接关了gpgcheck,结果装了个带后门的openssh。嗯,那画面太美我不敢看。
3.3 账户与权限管理:谁该做什么,清清楚楚
账户管理,核心就一句话:最小权限原则。每个账户只给够用的权限,不多给一分。
3.3.1 账户分类与清理
我建议把系统账户分为三类:
- 管理员账户:仅限运维人员使用,必须使用SSH密钥登录
- 服务账户:运行Agent、数据库等服务的专用账户,不能登录shell
- 系统账户:系统内置账户,如root、daemon等,非必要不启用
清理无用的账户:
# 查看所有可登录账户
awk -F: '($7 != "/sbin/nologin" && $7 != "/bin/false") {print $1}' /etc/passwd
# 锁定不用的账户
usermod -L 用户名
# 或者直接删除
userdel -r 用户名
agent 账户,运行数据库就用 db 账户。这样即使某个服务被攻破,攻击者也拿不到其他服务的权限。
3.3.2 SSH安全配置
SSH是远程管理的命门,必须重点加固。我的/etc/ssh/sshd_config配置如下:
# 禁止root直接登录
PermitRootLogin no
# 仅允许密钥登录
PasswordAuthentication no
PubkeyAuthentication yes
# 限制登录用户
AllowUsers admin1 admin2
# 修改默认端口(可选)
Port 2222
# 登录超时设置
ClientAliveInterval 300
ClientAliveCountMax 2
我曾经在项目上遇到过,有人用弱口令爆破SSH,几分钟就进去了。从那以后,我所有项目都强制要求密钥登录,密码登录直接关掉。你想想看,一个8位纯数字密码,暴力破解需要多久?不到1分钟。
3.3.3 sudo权限控制
sudo权限要精细化管理,别给所有人root权限。我推荐的做法:
# 在 /etc/sudoers.d/ 下创建专用文件
# 例如:给运维人员只允许执行特定命令
Cmnd_Alias AGENT_CMDS = /usr/bin/systemctl start agent, /usr/bin/systemctl stop agent, /usr/bin/systemctl restart agent
%ops ALL=(ALL) NOPASSWD: AGENT_CMDS
这里要注意,NOPASSWD虽然方便,但降低了安全性。我个人建议,除非是自动化脚本需要,否则都要求输入密码。
3.4 知识体系总览
为了让你更直观地理解这三块内容的关系,我画了一张图:
你看,这三个模块是环环相扣的。内核参数调优解决的是“系统层面”的安全漏洞;最小化安装解决的是“攻击面”的问题;账户与权限管理解决的是“人为因素”的风险。缺一个,你的系统就不完整。
好了,这一章的内容就到这里。下一章咱们聊聊网络层面的安全防护,那又是另一番天地了。