linux安全巡检加固脚本核心是“检查→判断→修复→记录”,聚焦ssh安全、用户权限、无用服务三类高危项,用函数封装检查逻辑并返回状态码,支持dry-run和确认机制,操作前备份、语法校验、状态记录,输出结构化日志便于审计。

Linux 自动化安全巡检与加固脚本的核心是“检查 → 判断 → 修复 → 记录”,不是写一个万能脚本,而是围绕系统关键风险点,用 Shell 脚本组合标准命令、条件判断和日志输出,做到可执行、可验证、可回溯。
聚焦高危项:从登录、权限、服务三方面切入
不必覆盖所有 CIS 基准条目,优先处理攻击者最常利用的入口:
-
SSH 安全:检查是否禁用 root 远程登录(
PermitRootLogin no)、是否关闭密码认证(PasswordAuthentication no)、是否启用密钥强制校验; -
用户与权限:扫描 UID 为 0 的非 root 用户(
awk -F: '$3 == 0 && $1 != "root" {print}' /etc/passwd)、查找 world-writable 目录(find / -type d -perm -002 2>/dev/null); -
无用服务:列出监听公网(
netstat -tuln | grep ':.*:' | grep -v '127.0.0.1'或ss -tuln),比对白名单(如只允许 ssh、httpd),停用未授权服务(systemctl stop && systemctl disable)。
用函数封装检查逻辑,避免重复代码
每个检查项写成独立函数,返回 0(合规)或 1(不合规),便于后续统一处理:
check_ssh_no_password() {
if grep -q '^PasswordAuthentication[[:space:]]*no' /etc/ssh/sshd_config 2>/dev/null; then
return 0
else
echo "[WARN] Password authentication is enabled"
return 1
fi
}
<p>check_sudo_nopasswd() {
if grep -q 'NOPASSWD' /etc/sudoers /etc/sudoers.d/* 2>/dev/null; then
echo "[ALERT] Found NOPASSWD entries"
return 1
fi
return 0
}</p>
主流程调用时用 if ! check_ssh_no_password; then ... fi,修复动作也封装进对应函数(如自动替换配置、重载服务)。
加固操作必须加确认机制或干运行开关
直接修改系统配置有风险。脚本开头加参数支持:-d(dry-run 模式,只打印将执行的操作)、-y(跳过交互确认)。例如:
- 修改 SSH 配置前先备份:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.$(date +%s).bak; - 重启服务前检查语法:
sshd -t && systemctl restart sshd,失败则自动还原备份; - 禁用服务前记录原状态:
systemctl is-enabled xxx >> /var/log/sec-audit.log,方便回滚。
输出结构化日志,支持后续审计
每次运行生成带时间戳的报告文件,格式清晰、字段固定,方便人工查阅或导入 SIEM:
[2024-06-15 10:23:41] CHECK: SSH PasswordAuth → FAIL → remediated [2024-06-15 10:23:42] CHECK: Root login → PASS [2024-06-15 10:23:43] CHECK: World-writable dirs → WARN → /tmp, /var/tmp [2024-06-15 10:23:44] SUMMARY: 3 checks, 1 fixed, 1 warning, 1 passed
建议将日志同时输出到屏幕和文件,并设置 logrotate 控制保留周期(如 30 天)。
不复杂但容易忽略:脚本本身要设最小权限(chmod 700),运行用户用普通账号+sudo 特权控制,别用 root 直接执行;定期更新检查逻辑(比如内核漏洞公告后新增 sysctl 参数校验);生产环境首次部署务必在测试机完整验证。











