
一键搞定Linux安全基线检查
服务器安全是每一位系统管理员、运维工程师和开发者都必须面对的核心课题。一个配置不当的 Linux 系统,就像一座没有上锁的房子,随时可能面临未经授权的访问和恶意攻击。
传统的安全审计往往需要手动执行数十个命令,检查上百个配置项,过程繁琐、耗时且容易出错。为了解决这个痛点,我们为您带来一个强大而简洁的解决方案——一个零依赖、功能全面的 Linux 基线安全审计脚本。
这个脚本就像一位不知疲倦的 AI 安全专家,只需一条命令,就能为您的系统进行一次全面的“健康体检”,并生成一份包含详细数据和专业优化建议的报告。
什么是“安全基线”?
安全基线(Security Baseline)是一套标准化的安全配置和设置,它定义了系统在安全方面的最低要求。对系统进行基线检查,就像是对照一张“安全清单”来评估系统当前的状态,找出与最佳实践不符的薄弱环节。
脚本核心功能一览
这个脚本涵盖了 Linux 系统安全的八个核心领域,确保了审计的广度和深度:
- 系统基本信息 (System Information):快速了解主机名、操作系统、内核版本、运行负载等基本情况。
- 用户与权限管理 (User and Permission Management):揪出潜藏的风险账户,如多余的 root 权限用户(UID=0)、空密码账户,并检查密码策略和危险的
NOPASSWD
sudo 配置。 - 文件系统与权限 (Filesystem and Permissions):扫描关键系统文件的权限是否正确,查找全局可写文件/目录、无主文件以及高风险的 SUID/SGID 程序,这些都是权限提升攻击的温床。
- 网络安全 (Network Security):列出所有监听的网络端口,检查防火墙(iptables/firewalld)规则,并审查关键的网络内核参数,帮助您收缩攻击面,抵御常见网络攻击。
- 服务与进程 (Services and Processes):展示当前正在运行及开机自启的服务,列出以 root 权限运行的进程,助您清理不必要的服务,减少潜在漏洞。
- SSH 服务配置 (SSH Configuration):直接输出 SSH 服务的有效配置文件,让您一目了然地审查远程访问的安全性。
- 日志与审计 (Logging and Auditing):检查核心日志服务(rsyslog/journald)和审计服务(auditd)的运行状态,确保系统的所有活动都被有效记录,以便事后追溯。
- 软件与包管理 (Software and Package Management):列出已安装的软件包,提醒您保持系统更新,及时修复已知漏洞。
独家亮点:内置专家级优化建议
单纯罗列数据是不够的。这个脚本最强大的功能在于,它在完成数据收集后,会自动生成一份详尽的**《安全审计优化建议报告》**。
这份报告会针对前面审计发现的每一个潜在风险点,给出清晰、可操作的加固建议。例如:
--- 3. 文件系统与权限 ---
- 全局可写文件/目录: 全局可写(world-writable)的文件和目录是严重的安全隐患,攻击者可以利用它们写入恶意脚本或修改数据。请逐一审查列表中的文件和目录,使用
chmod o-w <path>
移除不必要的写权限。- SUID/SGID 文件: SUID/SGID程序允许普通用户以文件所有者(通常是root)的权限执行。这是权限提升的常见途径。请仔细审查列表中的每一个文件…使用
chmod u-s <path>
移除特殊权限。--- 6. SSH 服务配置 (/etc/ssh/sshd_config) ---
- 禁止root登录:
PermitRootLogin no
,强制使用普通用户登录后再su
或sudo
到root。- 禁用密码认证:
PasswordAuthentication no
,强烈建议使用密钥对进行认证,更加安全。
您不再需要自己去搜索每个配置项的含义和最佳实践,报告已经为您准备好了一切。
如何使用?
使用这个脚本极其简单,只需三步:
-
保存脚本 将下面的完整脚本代码保存为一个文件,例如
security_audit.sh
。 -
授予执行权限 在终端中运行以下命令:
Terminal window chmod +x security_audit.sh -
以 root 权限运行 脚本需要 root 权限来访问系统中的所有关键信息。
Terminal window sudo bash security_audit.sh# 或者# sudo ./security_audit.sh
脚本运行后,它会实时在屏幕上输出审计过程,并在当前目录下生成一个名为 security_report_主机名_日期时间.txt
的详细报告文件。
安全须知:工具与策略
请记住,任何自动化工具都是辅助手段。这个脚本能极大地提高您的审计效率,并提供专业的指导。但最终的安全决策仍需您结合具体的业务场景来判断。例如,某些被标记为“高风险”的 SUID 文件可能是某个正常业务软件所必需的。
安全是一个持续的过程,而非一次性的任务。建议您定期运行此脚本(例如每月一次),持续监控和加固您的系统。
结语
这个 Linux 安全基线审计脚本是一个强大的盟友,它将繁琐的安全检查工作自动化,并将专家的知识固化在代码中。无论您是经验丰富的运维专家还是刚接触 Linux 的新手,它都能帮助您快速提升服务器的安全水平。
立即下载并运行它,为您的数字资产筑起一道更坚固的防线吧!
附:完整脚本代码
#!/bin/bash
# ==============================================================================# Linux Baseline Security Audit Script# Author: Your AI Security Expert# Version: 1.1 (Fixed recommendation generation issue)# Description: This script performs a comprehensive security baseline check on a# Linux system without any external dependencies. It generates a# detailed report with findings and optimization recommendations.# Usage: Run as root. `sudo bash security_audit.sh`# ==============================================================================
# 检查是否为root用户if [ "$(id -u)" -ne 0 ]; then echo "错误:此脚本必须以root权限运行。" >&2 exit 1fi
# --- 配置 ---REPORT_FILE="security_report_$(hostname)_$(date +%Y%m%d_%H%M%S).txt"
# --- 辅助函数 ---# 打印标题print_header() { echo "" | tee -a "$REPORT_FILE" echo "==============================================================================" | tee -a "$REPORT_FILE" echo " $1" | tee -a "$REPORT_FILE" echo "==============================================================================" | tee -a "$REPORT_FILE"}
# 打印子标题print_subheader() { echo "" | tee -a "$REPORT_FILE" echo "--- $1 ---" | tee -a "$REPORT_FILE"}
# --- 审计函数 ---
# 1. 系统基本信息check_system_info() { print_header "1. 系统基本信息 (System Information)"
print_subheader "主机名" hostname | tee -a "$REPORT_FILE"
print_subheader "操作系统版本" cat /etc/os-release | tee -a "$REPORT_FILE"
print_subheader "内核版本" uname -a | tee -a "$REPORT_FILE"
print_subheader "系统运行时间与负载" uptime | tee -a "$REPORT_FILE"
print_subheader "已登录用户" who | tee -a "$REPORT_FILE"}
# 2. 用户与权限管理check_user_accounts() { print_header "2. 用户与权限管理 (User and Permission Management)"
print_subheader "特权用户 (UID=0)" awk -F: '($3 == 0) { print $1 }' /etc/passwd | tee -a "$REPORT_FILE"
print_subheader "空密码账户" awk -F: '($2 == "" || $2 == "!") { print $1 }' /etc/shadow | tee -a "$REPORT_FILE"
print_subheader "密码策略 (/etc/login.defs)" grep -E "^(PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE)" /etc/login.defs | tee -a "$REPORT_FILE"
print_subheader "Sudoers 配置检查 (NOPASSWD)" grep -r "NOPASSWD" /etc/sudoers* 2>/dev/null | tee -a "$REPORT_FILE"
print_subheader "用户最后登录信息" lastlog | head -n 20 | tee -a "$REPORT_FILE"}
# 3. 文件系统与权限check_filesystem() { print_header "3. 文件系统与权限 (Filesystem and Permissions)"
print_subheader "关键文件权限检查" ls -l /etc/passwd /etc/shadow /etc/group /etc/gshadow | tee -a "$REPORT_FILE"
print_subheader "查找全局可写文件" find / -xdev -type f -perm -0002 -print 2>/dev/null | head -n 100 | tee -a "$REPORT_FILE"
print_subheader "查找全局可写目录" find / -xdev -type d -perm -0002 -print 2>/dev/null | head -n 100 | tee -a "$REPORT_FILE"
print_subheader "查找没有所有者的文件" find / -xdev \( -nouser -o -nogroup \) -print 2>/dev/null | head -n 100 | tee -a "$REPORT_FILE"
print_subheader "查找 SUID/SGID 文件 (高风险)" { find / -xdev -perm -4000 -type f -print 2>/dev/null; find / -xdev -perm -2000 -type f -print 2>/dev/null; } | tee -a "$REPORT_FILE"
print_subheader "挂载点选项检查 (检查 /tmp, /var/tmp, /home 是否有 noexec, nosuid, nodev)" mount | grep -E 'on /(tmp|var/tmp|home) ' | tee -a "$REPORT_FILE"}
# 4. 网络安全check_network() { print_header "4. 网络安全 (Network Security)"
print_subheader "监听的 TCP/UDP 端口" ss -tuln | tee -a "$REPORT_FILE"
print_subheader "防火墙规则 (iptables)" if command -v iptables &> /dev/null; then iptables -L -n -v | tee -a "$REPORT_FILE" else echo "iptables 命令不存在。" | tee -a "$REPORT_FILE" fi
print_subheader "防火墙规则 (firewalld - 如果存在)" if command -v firewall-cmd &> /dev/null && systemctl is-active --quiet firewalld; then echo "Firewalld is active." | tee -a "$REPORT_FILE" firewall-cmd --list-all | tee -a "$REPORT_FILE" else echo "Firewalld 未运行或未安装。" | tee -a "$REPORT_FILE" fi
print_subheader "网络核心参数 (sysctl)" sysctl -a 2>/dev/null | grep -E "net.ipv4.ip_forward|net.ipv4.conf.all.accept_redirects|net.ipv4.conf.all.send_redirects|net.ipv4.conf.all.accept_source_route|net.ipv4.conf.default.accept_redirects|net.ipv4.conf.default.send_redirects|net.ipv4.conf.default.accept_source_route|net.ipv4.icmp_echo_ignore_broadcasts|net.ipv4.tcp_syncookies" | tee -a "$REPORT_FILE"}
# 5. 服务与进程check_services() { print_header "5. 服务与进程 (Services and Processes)"
print_subheader "正在运行的服务 (Systemd)" if command -v systemctl &> /dev/null; then systemctl list-units --type=service --state=running | tee -a "$REPORT_FILE" else echo "systemctl 命令不存在,可能是非 systemd 系统。" | tee -a "$REPORT_FILE" fi
print_subheader "以 root 权限运行的进程" ps -U root -u root u | tee -a "$REPORT_FILE"
print_subheader "开机自启的服务 (Systemd)" if command -v systemctl &> /dev/null; then systemctl list-unit-files --type=service --state=enabled | tee -a "$REPORT_FILE" else echo "systemctl 命令不存在。" | tee -a "$REPORT_FILE" fi}
# 6. SSH 服务配置check_ssh() { print_header "6. SSH 服务配置 (SSH Configuration)" if [ -f /etc/ssh/sshd_config ]; then grep -vE '^\s*#|^\s*$' /etc/ssh/sshd_config | tee -a "$REPORT_FILE" else echo "/etc/ssh/sshd_config 文件不存在。" | tee -a "$REPORT_FILE" fi}
# 7. 日志与审计check_logging() { print_header "7. 日志与审计 (Logging and Auditing)"
print_subheader "日志服务状态 (rsyslog/journald)" if command -v systemctl &> /dev/null; then systemctl is-active rsyslog &>/dev/null && echo "Rsyslog is running." | tee -a "$REPORT_FILE" systemctl is-active systemd-journald &>/dev/null && echo "Systemd-journald is running." | tee -a "$REPORT_FILE" fi
print_subheader "审计服务状态 (auditd)" if command -v systemctl &> /dev/null; then if systemctl is-active auditd &>/dev/null; then echo "Auditd is running." | tee -a "$REPORT_FILE" else echo "警告: Auditd 服务未运行。" | tee -a "$REPORT_FILE" fi elif command -v service &> /dev/null; then service auditd status 2>/dev/null | tee -a "$REPORT_FILE" else echo "无法确定 auditd 服务状态。" | tee -a "$REPORT_FILE" fi
print_subheader "日志文件权限" ls -l /var/log/messages /var/log/secure /var/log/auth.log /var/log/syslog 2>/dev/null | tee -a "$REPORT_FILE"}
# 8. 软件与包管理check_software() { print_header "8. 软件与包管理 (Software and Package Management)"
print_subheader "Debian/Ubuntu 系统已安装包列表 (前50个)" if command -v dpkg &> /dev/null; then dpkg-query -l | head -n 50 | tee -a "$REPORT_FILE" echo "..." | tee -a "$REPORT_FILE" echo "注意:仅显示前50个包,完整列表请运行 'dpkg -l'。" | tee -a "$REPORT_FILE" fi
print_subheader "RedHat/CentOS 系统已安装包列表 (前50个)" if command -v rpm &> /dev/null; then rpm -qa | head -n 50 | tee -a "$REPORT_FILE" echo "..." | tee -a "$REPORT_FILE" echo "注意:仅显示前50个包,完整列表请运行 'rpm -qa'。" | tee -a "$REPORT_FILE" fi}
# --- 生成优化建议报告 ---generate_recommendations() { # 使用 'EOF' (带单引号) 来确保 heredoc 中的内容被当作纯文本,不会被shell解释执行 cat >> "$REPORT_FILE" << 'EOF'
============================================================================== 安全审计优化建议报告 (Optimization Recommendations)==============================================================================
尊敬的系统管理员:
本报告基于上述审计数据,为您提供一份详细的安全加固建议。请结合您的业务实际情况,仔细评估并采纳以下建议。
--- 2. 用户与权限管理 ---* **特权用户**: 确保除了 'root' 之外,没有其他用户的UID为0。任何多余的UID 0用户都应被立即调查并移除,因为它们拥有与root等同的权限。* **空密码账户**: 绝对不允许存在空密码账户。使用 `passwd <username>` 命令为所有空密码账户设置一个强密码。* **密码策略**: 建议在 `/etc/login.defs` 中设置严格的密码策略。 - `PASS_MAX_DAYS 90`: 密码最长有效期90天。 - `PASS_MIN_DAYS 7`: 7天内不能修改密码,防止用户频繁改回旧密码。 - `PASS_WARN_AGE 7`: 密码过期前7天发出警告。* **Sudoers NOPASSWD**: 审查所有包含 `NOPASSWD` 的sudo规则。该配置允许用户无需密码即可执行特权命令,风险极高。除非是自动化脚本等特殊场景,否则应移除 `NOPASSWD` 标志。
--- 3. 文件系统与权限 ---* **关键文件权限**: - `/etc/passwd`: 权限应为 644 (`-rw-r--r--`)。 - `/etc/shadow`: 权限应为 000 或 400 (`-r--------`),只有root可读。 - `/etc/group`: 权限应为 644 (`-rw-r--r--`)。 - `/etc/gshadow`: 权限应为 000 或 400 (`-r--------`)。* **全局可写文件/目录**: 全局可写(world-writable)的文件和目录是严重的安全隐患,攻击者可以利用它们写入恶意脚本或修改数据。请逐一审查列表中的文件和目录,使用 `chmod o-w <path>` 移除不必要的写权限。* **无主文件**: 系统中不应存在没有所有者或所属组的文件。这通常是由于软件卸载不彻底或用户被删除导致。使用 `chown root:root <path>` 命令将它们的所有权分配给root。* **SUID/SGID 文件**: SUID/SGID程序允许普通用户以文件所有者(通常是root)的权限执行。这是权限提升的常见途径。请仔细审查列表中的每一个文件,如果不是系统正常运行所必需(如`passwd`, `su`, `ping`等),请使用 `chmod u-s <path>` (SUID) 或 `chmod g-s <path>` (SGID) 移除特殊权限。* **挂载点选项**: 对于 `/tmp`、`/var/tmp` 和 `/home` 等分区,建议在 `/etc/fstab` 中使用 `noexec`, `nosuid`, `nodev` 选项挂载,以防止在这些分区执行恶意程序或利用设备文件。
--- 4. 网络安全 ---* **监听端口**: 审查所有正在监听的端口。关闭所有非必要的服务,以最小化攻击面。使用 `lsof -i:<port>` 或 `ss -tlpn | grep <port>` 查看是哪个进程在监听该端口。* **防火墙**: 必须启用并正确配置防火墙。默认策略应为“拒绝所有”(DROP all),然后仅开放业务必需的端口。* **网络核心参数**: 为了抵御常见的网络攻击,建议在 `/etc/sysctl.conf` 中进行以下设置: - `net.ipv4.ip_forward = 0`: 除非是路由器,否则关闭IP转发。 - `net.ipv4.conf.all.accept_redirects = 0`: 禁用ICMP重定向。 - `net.ipv4.conf.all.send_redirects = 0`: 禁止发送ICMP重定向。 - `net.ipv4.conf.all.accept_source_route = 0`: 禁用源路由。 - `net.ipv4.icmp_echo_ignore_broadcasts = 1`: 忽略ICMP广播请求(防止Smurf攻击)。 - `net.ipv4.tcp_syncookies = 1`: 启用SYN Cookies,防御SYN洪水攻击。 修改后执行 `sysctl -p` 使其生效。
--- 5. 服务与进程 ---* **服务审查**: 检查所有正在运行和开机自启的服务。禁用所有与业务无关的服务(如:NFS, RPCbind, Avahi等,除非明确需要)。使用 `systemctl disable <service_name>` 命令禁用服务。* **Root进程**: 关注以root权限运行的非系统核心进程,确保其来源可靠。
--- 6. SSH 服务配置 (/etc/ssh/sshd_config) ---* **禁止root登录**: `PermitRootLogin no`,强制使用普通用户登录后再 `su` 或 `sudo` 到root。* **使用协议2**: `Protocol 2`,协议1存在安全漏洞。* **禁用密码认证**: `PasswordAuthentication no`,强烈建议使用密钥对进行认证,更加安全。* **限制监听地址**: `ListenAddress <your_server_ip>`,如果服务器有多个IP,仅监听在必要的IP上。* **限制登录用户**: 使用 `AllowUsers`, `AllowGroups`, `DenyUsers`, `DenyGroups` 指令,只允许授权用户登录。* **禁用X11转发**: `X11Forwarding no`,除非需要图形界面转发。
--- 7. 日志与审计 ---* **确保服务运行**: 确保 `rsyslog` (或 `journald`) 和 `auditd` 服务正在运行并开机自启。`auditd` 提供了非常详细的系统活动审计 trail,对于安全事件追溯至关重要。* **日志权限**: 确保日志文件(如 `/var/log/*`)的权限设置正确,通常只有root和特定组(如adm)可读,防止普通用户查看敏感日志信息。
--- 8. 软件与包管理 ---* **定期更新**: 定期运行 `sudo apt update && sudo apt upgrade` (Debian/Ubuntu) 或 `sudo yum update` (CentOS/RHEL) 来安装安全补丁,修复已知漏洞。* **最小化安装**: 系统中只安装业务必需的软件包,移除所有不必要的软件,以减少潜在的攻击向量。
此报告为您提供了一个全面的安全基线和改进方向。安全是一个持续的过程,建议您定期执行此类审计。
EOF}
# --- 主执行流程 ---main() { echo "Linux安全基线审计开始..." echo "报告将保存在: ${REPORT_FILE}" echo "==================== Security Audit Started: $(date) ====================" > "$REPORT_FILE"
check_system_info check_user_accounts check_filesystem check_network check_services check_ssh check_logging check_software
echo "==================== Security Audit Finished: $(date) ====================" >> "$REPORT_FILE"
echo "正在生成优化建议报告..." generate_recommendations
echo "审计完成!" echo "详细报告已生成: ${REPORT_FILE}"}
# --- 运行主函数 ---main