通用安全加固脚本通过识别/etc/os-release等信息准确判断distro_family为"rhel"或"debian",封装pkg_install、svc_enable等函数实现跨发行版适配,聚焦fail2ban、防火墙、空密码锁定、远程日志、AIDE及内核参数加固,并支持备份、配置验证、--dry-run和JSON报告。

编写一个适用于主流Linux发行版(如CentOS/RHEL、Ubuntu/Debian、AlmaLinux、Rocky Linux等)的通用安全加固脚本,核心在于“识别差异、抽象共性、按需适配”。不能指望一条命令走天下,但可以通过判断发行版、包管理器、服务管理方式和关键配置路径,实现一次编写、多环境可靠运行。
识别系统环境并动态适配
脚本启动第一件事是准确识别当前系统类型,这是后续所有操作的基础。仅靠uname -r或/etc/os-release部分内容容易误判(比如Ubuntu子版本或容器环境)。推荐组合判断:
- 读取
/etc/os-release中的ID和VERSION_ID字段,覆盖95%场景 - 对RHEL系补充检查
rpm -q centos-release || rpm -q rocky-release || rpm -q almalinux-release - 对Debian系验证
dpkg --version是否存在,避免在最小化RHEL容器中误执行apt命令 - 将结果统一映射为
distro_family="rhel"或distro_family="debian"变量,后续逻辑只依赖该变量
统一包管理与服务控制封装
避免在脚本中反复写apt install和dnf install。定义两个函数:
pkg_install() { local pkg="$1"; [ "$distro_family" = "debian" ] && apt-get install -y "$pkg" || dnf install -y "$pkg"; }-
svc_enable() { local svc="$1"; [ "$distro_family" = "debian" ] && systemctl enable "$svc" || systemctl enable "$svc"; }(注意:systemctl在两者上行为一致,无需区分) - 关键点:安装前加
apt-get update或dnf makecache,且用-y和--quiet减少干扰;对失败操作记录日志并退出,不静默跳过
加固项选取:聚焦高价值、低破坏性动作
通用脚本应避开需人工确认或易引发业务中断的操作(如强制修改SSH端口、禁用root登录)。优先落地以下可批量、可逆、有明确安全收益的项:
-
基础防护:安装
fail2ban(自动封禁暴力破解IP),启用ufw(Debian)或firewalld(RHEL),默认拒绝入站,仅放行必要端口 -
账户安全:锁定空密码账户(
awk -F: '$2=="" {print $1}' /etc/shadow | xargs -I{} passwd -l {} 2>/dev/null),禁用ftp、telnet等明文协议服务 -
审计与日志:确保
rsyslog或syslog-ng启用,并配置远程日志(如发往SIEM);启用aide做文件完整性校验(首次初始化后定期校验关键目录) -
内核参数:通过
/etc/sysctl.d/99-secure.conf统一设置,如net.ipv4.conf.all.rp_filter=1、kernel.randomize_va_space=2,最后执行sysctl --system
安全执行与回滚设计
生产环境脚本必须自带“后悔药”:
- 所有配置文件修改前先备份,如
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.$(date +%s).bak - 关键服务重启前,用
sshd -t或nginx -t验证配置语法,失败则终止流程并提示恢复备份 - 提供
--dry-run模式:只输出将要执行的命令,不实际修改任何内容 - 生成加固报告(JSON格式),包含系统信息、已执行项、跳过项及原因,便于审计追踪
不复杂但容易忽略——真正的通用性不在命令堆砌,而在对差异的敬畏和对失败的预设。脚本不是越长越安全,而是每次执行都让人心里有底。










