Linux系统安全基线检查脚本

代码脚本 · 安全

检查Linux系统安全基线配置,包括密码策略、用户权限、服务端口、文件权限等,输出合规报告

详细内容

#!/bin/bash # ========================================== # Linux系统安全基线检查脚本 # 用途:检查系统安全配置,输出合规报告 # 使用方法:bash security_baseline_check.sh # ========================================== echo "========== 系统安全基线检查报告 ==========" echo "检查时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "主机名: $(hostname)" echo "" PASS=0 FAIL=0 WARN=0 check_pass() { echo " ✅ [PASS] $1" PASS=$((PASS+1)) } check_fail() { echo " ❌ [FAIL] $1" FAIL=$((FAIL+1)) } check_warn() { echo " ⚠️ [WARN] $1" WARN=$((WARN+1)) } # 1. 密码策略检查 echo "【1. 密码策略检查】" if [ -f /etc/login.defs ]; then PASS_MAX_DAYS=$(grep "^PASS_MAX_DAYS" /etc/login.defs | awk '{print $2}') if [ "$PASS_MAX_DAYS" -le 90 ] 2>/dev/null; then check_pass "密码最大有效期: ${PASS_MAX_DAYS}天 (≤90天)" else check_fail "密码最大有效期: ${PASS_MAX_DAYS}天 (>90天,建议≤90天)" fi PASS_MIN_LEN=$(grep "^PASS_MIN_LEN" /etc/login.defs | awk '{print $2}') if [ "$PASS_MIN_LEN" -ge 8 ] 2>/dev/null; then check_pass "密码最小长度: ${PASS_MIN_LEN}位 (≥8位)" else check_fail "密码最小长度: ${PASS_MIN_LEN}位 (<8位,建议≥8位)" fi else check_warn "未找到/etc/login.defs文件" fi echo "" # 2. 用户权限检查 echo "【2. 用户权限检查】" ROOT_UID_USERS=$(awk -F: '$3==0 {print $1}' /etc/passwd) ROOT_COUNT=$(echo "$ROOT_UID_USERS" | wc -l) if [ "$ROOT_COUNT" -eq 1 ]; then check_pass "UID=0的用户只有root" else check_fail "发现多个UID=0的用户: $ROOT_UID_USERS" fi # 检查空密码用户 EMPTY_PASS=$(awk -F: '($2=="") {print $1}' /etc/shadow 2>/dev/null) if [ -z "$EMPTY_PASS" ]; then check_pass "无空密码用户" else check_fail "发现空密码用户: $EMPTY_PASS" fi echo "" # 3. 服务端口检查 echo "【3. 监听端口检查】" LISTEN_PORTS=$(ss -tlnp 2>/dev/null | grep LISTEN | awk '{print $4}' | awk -F: '{print $NF}' | sort -n | uniq) echo " 当前监听端口: $(echo $LISTEN_PORTS | tr ' ' ' ')" DANGEROUS_PORTS="23 21 512 513 514" for port in $DANGEROUS_PORTS; do if echo "$LISTEN_PORTS" | grep -q "^$port$"; then check_fail "危险端口 $port 处于监听状态" fi done check_pass "已完成端口安全检查" echo "" # 4. SSH配置检查 echo "【4. SSH安全配置检查】" if [ -f /etc/ssh/sshd_config ]; then PERMIT_ROOT_LOGIN=$(grep -i "^PermitRootLogin" /etc/ssh/sshd_config | awk '{print $2}') if [ "$PERMIT_ROOT_LOGIN" = "no" ]; then check_pass "禁止root远程登录" else check_warn "root远程登录设置: $PERMIT_ROOT_LOGIN (建议设置为no)" fi PASSWORD_AUTH=$(grep -i "^PasswordAuthentication" /etc/ssh/sshd_config | awk '{print $2}') if [ "$PASSWORD_AUTH" = "no" ]; then check_pass "禁止密码登录(仅密钥登录)" else check_warn "密码登录已启用 (高安全环境建议禁用,仅用密钥)" fi else check_warn "未找到sshd_config文件" fi echo "" # 5. 文件权限检查 echo "【5. 关键文件权限检查】" CRITICAL_FILES="/etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/sudoers" for file in $CRITICAL_FILES; do if [ -f "$file" ]; then PERMS=$(stat -c "%a" "$file" 2>/dev/null) case "$file" in /etc/shadow|/etc/gshadow) if [ "$PERMS" -le 640 ] 2>/dev/null; then check_pass "$file 权限: $PERMS" else check_fail "$file 权限: $PERMS (建议≤640)" fi ;; *) if [ "$PERMS" -le 644 ] 2>/dev/null; then check_pass "$file 权限: $PERMS" else check_fail "$file 权限: $PERMS (建议≤644)" fi ;; esac fi done echo "" # 6. 防火墙检查 echo "【6. 防火墙状态检查】" if systemctl is-active --quiet firewalld 2>/dev/null; then check_pass "firewalld防火墙已启用" elif systemctl is-active --quiet iptables 2>/dev/null; then check_pass "iptables防火墙已启用" elif command -v ufw &>/dev/null && ufw status | grep -q "active"; then check_pass "ufw防火墙已启用" else check_warn "未检测到运行中的防火墙" fi echo "" # 汇总 echo "========== 检查汇总 ==========" echo " ✅ 通过: $PASS" echo " ❌ 失败: $FAIL" echo " ⚠️ 警告: $WARN" echo "" if [ "$FAIL" -gt 0 ]; then echo "🔴 存在 $FAIL 项安全风险,请及时修复" else echo "🟢 未发现严重安全风险" fi echo "========== 检查完成 =========="

适配环境

适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+

依赖环境:bash 4.0+

参数说明

[]
安全基线检查合规系统加固

更多安全