4091 字
20 分钟
一键搞定Linux安全基线检查
2025-10-15

一键搞定Linux安全基线检查#

服务器安全是每一位系统管理员、运维工程师和开发者都必须面对的核心课题。一个配置不当的 Linux 系统,就像一座没有上锁的房子,随时可能面临未经授权的访问和恶意攻击。

传统的安全审计往往需要手动执行数十个命令,检查上百个配置项,过程繁琐、耗时且容易出错。为了解决这个痛点,我们为您带来一个强大而简洁的解决方案——一个零依赖、功能全面的 Linux 基线安全审计脚本。

这个脚本就像一位不知疲倦的 AI 安全专家,只需一条命令,就能为您的系统进行一次全面的“健康体检”,并生成一份包含详细数据和专业优化建议的报告。

什么是“安全基线”?#

安全基线(Security Baseline)是一套标准化的安全配置和设置,它定义了系统在安全方面的最低要求。对系统进行基线检查,就像是对照一张“安全清单”来评估系统当前的状态,找出与最佳实践不符的薄弱环节。

脚本核心功能一览#

这个脚本涵盖了 Linux 系统安全的八个核心领域,确保了审计的广度和深度:

  1. 系统基本信息 (System Information):快速了解主机名、操作系统、内核版本、运行负载等基本情况。
  2. 用户与权限管理 (User and Permission Management):揪出潜藏的风险账户,如多余的 root 权限用户(UID=0)、空密码账户,并检查密码策略和危险的 NOPASSWD sudo 配置。
  3. 文件系统与权限 (Filesystem and Permissions):扫描关键系统文件的权限是否正确,查找全局可写文件/目录、无主文件以及高风险的 SUID/SGID 程序,这些都是权限提升攻击的温床。
  4. 网络安全 (Network Security):列出所有监听的网络端口,检查防火墙(iptables/firewalld)规则,并审查关键的网络内核参数,帮助您收缩攻击面,抵御常见网络攻击。
  5. 服务与进程 (Services and Processes):展示当前正在运行及开机自启的服务,列出以 root 权限运行的进程,助您清理不必要的服务,减少潜在漏洞。
  6. SSH 服务配置 (SSH Configuration):直接输出 SSH 服务的有效配置文件,让您一目了然地审查远程访问的安全性。
  7. 日志与审计 (Logging and Auditing):检查核心日志服务(rsyslog/journald)和审计服务(auditd)的运行状态,确保系统的所有活动都被有效记录,以便事后追溯。
  8. 软件与包管理 (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,强制使用普通用户登录后再 susudo 到root。
  • 禁用密码认证: PasswordAuthentication no,强烈建议使用密钥对进行认证,更加安全。

您不再需要自己去搜索每个配置项的含义和最佳实践,报告已经为您准备好了一切。

如何使用?#

使用这个脚本极其简单,只需三步:

  1. 保存脚本 将下面的完整脚本代码保存为一个文件,例如 security_audit.sh

  2. 授予执行权限 在终端中运行以下命令:

    Terminal window
    chmod +x security_audit.sh
  3. 以 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 1
fi
# --- 配置 ---
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
一键搞定Linux安全基线检查
https://blog.wlens.top/posts/一键搞定linux安全基线检查/
作者
Lao Wang
发布于
2025-10-15
许可协议
CC BY-NC-SA 4.0