Linux系统固化不是一次性操作,而是基于最小权限、纵深防御和持续监控的动态过程,其核心目标是消除已知漏洞、减少攻击面并确保系统符合安全基线。
Linux系统固化步骤详解
我们先把固化这件事拆成可执行的流程,业内专家普遍认为,一套完整的固化方案应该包含信息收集、账户精简、服务关闭、内核加固、应用层防护以及日志审计这六个环节,每个环节都有对应的检验标准,而不是凭感觉乱改配置。
系统初始化与信息收集
- 记录当前开放端口:
ss -tlnp - 检查当前运行服务:
systemctl list-units --type=service --state=running - 查看系统版本和内核参数:
uname -a ; cat /etc/os-release
这些信息是后续固化的基线,建议保存到文本文件中,方便对比变更。
账户与权限最小化
- 删除或锁定非必要系统账户:
userdel -r 用户名或passwd -l 用户名 - 确保普通用户无法执行
su -,仅允许wheel组用户切换:编辑/etc/pam.d/su,取消注释auth required pam_wheel.so use_uid - 设置密码策略:
/etc/login.defs中调整PASS_MAX_DAYS 90,PASS_MIN_DAYS 1,结合chage -M 90 用户名 - 限制root直接登录,只允许通过sudo方式提权:编辑
/etc/ssh/sshd_config,设置PermitRootLogin no,AllowUsers 你的用户
国际安全标准CIS Benchmark中,这部分被列为最高优先级的控制项,因为超过60%的Linux入侵事件与弱口令和闲置账户直接相关。
服务与端口精简
- 关闭不必要的自启动服务:
systemctl disable --now 服务名 - 用
firewall-cmd或iptables限制访问来源,只开放业务必需的端口 - 检查并移除危险软件包,如telnet、rsh、ftp等:
yum remove telnet或apt purge telnetd - 使用
lsof -i确认所有监听端口都对应明确业务,对未知端口要追查源头。
Linux安全加固命令实战
这里我们直接上手常用命令,很多人在问“linux安全加固命令有哪些”,其实核心就几条链:账户链、网络链、文件链和审计链,把这些命令写成脚本,就能实现自动化固化。
SSH深度加固
- 编辑
/etc/ssh/sshd_config,设置Protocol 2,PermitRootLogin no,PasswordAuthentication no(禁用密码登录,仅用密钥) - 限制可登录用户:
AllowUsers appadmin opsadmin - 修改默认端口:
Port 2222,避免端口扫描批量攻击 - 重启sshd后,用
ssh -p 2222 用户@IP测试连接,确保不中断现有会话。
防火墙与网络隔离
- 使用
firewall-cmd配置默认区域:firewall-cmd --set-default-zone=drop - 仅白名单放行业务端口:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="80" protocol="tcp" accept' - 启用
firewalld的日志拒绝:firewall-cmd --set-log-denied=all - 对于iptables用户,使用
iptables -P INPUT DROP && iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT作为基础策略。
文件权限与系统参数
- 设置重要文件不可变属性:
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/sudoers - 限制
/home和/tmp分区以nosuid、noexec挂载,编辑/etc/fstab,增加defaults,nosuid,noexec 0 0 - 调整内核参数防御网络攻击:编辑
/etc/sysctl.conf,添加
net.ipv4.tcp_syncookies=1(防SYN洪水)
net.ipv4.conf.all.rp_filter=1(防IP欺骗)
net.ipv4.conf.all.accept_redirects=0(防ICMP重定向)
执行sysctl -p生效。
审计与SELinux
- 启用auditd:
systemctl enable --now auditd,配置/etc/audit/audit.rules监控关键系统调用 - 设置SELinux为强制模式:
setenforce 1,并确保/etc/selinux/config中SELINUX=enforcing - 使用
ausearch -m avc -ts recent检查SELinux拒绝日志,按需调整策略。
不同场景下的固化策略
固化不是一刀切,我们需要根据业务场景选择侧重点。
Web服务器场景
- 针对Nginx/Apache,限制目录权限,禁止目录浏览,关闭服务器版本标识
- 使用
mod_security或Nginx的ngx_http_limit_req_module限制请求频率 - 在
/etc/nginx/nginx.conf中添加server_tokens off;隐藏版本号 - 对于PHP环境,禁用危险函数如
exec、shell_exec、system,在php.ini中配置disable_functions = exec,system,passthru,shell_exec,proc_open。
数据库服务器场景
- 绑定数据库监听地址到内网:
bind-address = 127.0.0.1 - 使用独立账号运行数据库服务,文件权限设为
700 - 启用审计日志,记录所有DDL操作
- 定期备份并加密存储,备份文件权限最小化。
云服务器vs物理机
- 云服务器可利用安全组作为第一道防线,在云平台控制台设置入站规则,仅放行特定IP的业务端口
- 物理机则需要依赖主机防火墙和交换机ACL,同时注意物理接口的访问控制,禁用USB存储设备:
blacklist usb-storage in /etc/modprobe.d/ - 云服务器建议使用镜像基线,每次扩容时自动固化,避免人工配置遗漏。
固化后的持续监控与审计
固化不是一次性的终点,而是一个持续的过程,行业共识认为,配置漂移和新漏洞的发现是固化失效的主要原因,我们需要建立自动化检测机制。
定期审计脚本
- 使用
CIS-CAT或Lynis扫描系统,输出合规报告 - 编写shell脚本对比当前配置与基线配置,差异部分自动告警
- 设置
auditd规则监控关键文件变化,特别是/etc/passwd、/etc/shadow、/etc/ssh/sshd_config - 将日志统一发送到远程日志服务器,防止被攻击者篡改本地日志。
漏洞与补丁管理
- 订阅厂商漏洞公告,例如Red Hat的RHSA、Debian的DSA
- 对高危漏洞设置快速修复SLA,优先重启受影响服务
- 使用
yum-cron或unattended-upgrades进行安全更新,但需在测试环境验证后再推送。
常见问题排查
- 固化后服务无法启动:检查
/var/log/audit/audit.log中的SELinux拒绝记录,或/var/log/messages中的权限错误 - 用户无法登录:首先确认SSH配置文件无误,然后在本地终端尝试
ssh -vvv user@localhost排错 - 防火墙规则导致业务中断:使用
firewall-cmd --panic-off紧急恢复,然后逐步调试规则。
Linux固化常见问题解答
Q:Linux系统固化后性能会明显下降吗?
A:合理的固化配置不会带来可感知的性能损耗,关闭不必要服务和调整内核参数(如启用反向路径过滤)反而能降低资源占用,唯一可能影响性能的是SELinux在高并发场景下的策略检查,但现代Linux内核已优化,性能损耗通常低于5%,如果业务对延迟极度敏感,可以启用SELinux的permissive模式辅助调试,但生产环境建议保持enforcing。
Q:有没有自动化的固化工具,避免手动一条条命令执行?
A:目前业内常用的自动化工具包括Lynis(开源审计与加固工具)、OpenSCAP(支持CIS基准检查)、以及Ansible的hardening角色,这些工具可以扫描系统缺失项并自动修正,但建议先理解每个配置项的含义,尤其在生产环境,需要分阶段灰度执行,避免误改动导致业务中断,CIS Benchmark也提供了对应的自动化脚本,但需根据自身操作系统版本适配。
Q:固化和安装杀毒软件能互相替代吗?
A:不能,固化侧重于减少攻击面和控制权限,降低入侵机会;而杀毒软件侧重于检测已知恶意样本,两者是互补关系,对于Linux服务器,核心思路是“默认拒绝”,让攻击者无法执行未授权代码,杀毒软件只是兜底防御,建议先完成系统固化,再根据业务需求决定是否部署ClamAV等轻量级扫描工具,并定期扫描上传目录。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/506691.html



