安全检查脚本#

脚本说明#

安全检查脚本用于检查系统安全状态,包括用户安全、文件权限、服务安全、网络安全等。

脚本代码#

#!/bin/bash

# 安全检查脚本
# 功能:检查系统安全状态
# 作者:System Admin
# 日期:2026-01-01

set -euo pipefail

# 配置变量
LOG_FILE="/var/log/security_check.log"
REPORT_FILE="/tmp/security_check_report.txt"
ALERT_EMAIL="admin@example.com"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 日志函数
log() {
    local level=$1
    shift
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] [$level] $@" | tee -a "$LOG_FILE"
}

log_info() {
    log "INFO" "$@"
}

log_error() {
    log "ERROR" "$@"
}

log_warning() {
    log "WARNING" "$@"
}

# 检查用户安全
check_user_security() {
    log_info "检查用户安全"
    
    echo "用户安全检查"
    echo "=========="
    
    # 检查空密码用户
    local empty_password=$(awk -F: '($2 == "") {print $1}' /etc/shadow)
    if [ -n "$empty_password" ]; then
        log_error "发现空密码用户: $empty_password"
        echo "空密码用户: $empty_password"
    else
        log_info "没有空密码用户"
        echo "空密码用户: 无"
    fi
    
    # 检查UID为0的用户
    local root_users=$(awk -F: '($3 == 0) {print $1}' /etc/passwd)
    if [ -n "$root_users" ]; then
        log_warning "UID为0的用户: $root_users"
        echo "UID为0的用户: $root_users"
    else
        log_info "没有UID为0的用户"
        echo "UID为0的用户: 无"
    fi
    
    # 检查sudo用户
    local sudo_users=$(grep -v "^#" /etc/sudoers | grep -v "^$" | awk '{print $1}' | sort -u)
    echo "sudo用户: $sudo_users"
    
    # 检查最近登录的用户
    echo ""
    echo "最近登录的用户:"
    last -n 10 | head -10
}

# 检查文件权限
check_file_permissions() {
    log_info "检查文件权限"
    
    echo ""
    echo "文件权限检查"
    echo "=========="
    
    # 检查全局可写文件
    echo "全局可写文件:"
    find / -type f -perm -0002 -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null | head -20
    
    # 检查SUID文件
    echo ""
    echo "SUID文件:"
    find / -type f -perm -4000 -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null
    
    # 检查SGID文件
    echo ""
    echo "SGID文件:"
    find / -type f -perm -2000 -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null
    
    # 检查重要文件权限
    echo ""
    echo "重要文件权限:"
    ls -l /etc/passwd /etc/shadow /etc/group /etc/sudoers
}

# 检查服务安全
check_service_security() {
    log_info "检查服务安全"
    
    echo ""
    echo "服务安全检查"
    echo "=========="
    
    # 检查运行中的服务
    echo "运行中的服务:"
    systemctl list-units --type=service --state=running | grep -v "systemd"
    
    # 检查开放端口
    echo ""
    echo "开放端口:"
    netstat -tuln | grep LISTEN
    
    # 检查SSH配置
    echo ""
    echo "SSH配置:"
    if [ -f "/etc/ssh/sshd_config" ]; then
        grep -E "^(PermitRootLogin|PasswordAuthentication|Port)" /etc/ssh/sshd_config
    fi
    
    # 检查防火墙状态
    echo ""
    echo "防火墙状态:"
    if command -v ufw &> /dev/null; then
        ufw status
    elif command -v firewall-cmd &> /dev/null; then
        firewall-cmd --state
    fi
}

# 检查网络安全
check_network_security() {
    log_info "检查网络安全"
    
    echo ""
    echo "网络安全检查"
    echo "=========="
    
    # 检查网络连接
    echo "活动网络连接:"
    netstat -an | grep ESTABLISHED | head -20
    
    # 检查监听端口
    echo ""
    echo "监听端口:"
    netstat -tuln | grep LISTEN
    
    # 检查网络接口
    echo ""
    echo "网络接口:"
    ip addr show
    
    # 检查路由表
    echo ""
    echo "路由表:"
    ip route show
}

# 检查系统更新
check_system_updates() {
    log_info "检查系统更新"
    
    echo ""
    echo "系统更新检查"
    echo "=========="
    
    # 检查可用更新
    if command -v apt-get &> /dev/null; then
        echo "可用更新:"
        apt list --upgradable 2>/dev/null | head -20
    elif command -v yum &> /dev/null; then
        echo "可用更新:"
        yum check-update 2>/dev/null | head -20
    fi
    
    # 检查内核版本
    echo ""
    echo "内核版本: $(uname -r)"
    
    # 检查系统版本
    echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')"
}

# 检查日志安全
check_log_security() {
    log_info "检查日志安全"
    
    echo ""
    echo "日志安全检查"
    echo "=========="
    
    # 检查认证日志
    echo "最近的认证失败:"
    grep "Failed password" /var/log/auth.log 2>/dev/null | tail -10 || \
    grep "Failed password" /var/log/secure 2>/dev/null | tail -10
    
    # 检查sudo日志
    echo ""
    echo "最近的sudo使用:"
    grep sudo /var/log/auth.log 2>/dev/null | tail -10 || \
    grep sudo /var/log/secure 2>/dev/null | tail -10
    
    # 检查系统日志错误
    echo ""
    echo "最近的系统错误:"
    journalctl -p err -n 10 --no-pager
}

# 检查进程安全
check_process_security() {
    log_info "检查进程安全"
    
    echo ""
    echo "进程安全检查"
    echo "=========="
    
    # 检查可疑进程
    echo "可疑进程:"
    ps aux | grep -E "(nc|netcat|telnet|ftp)" | grep -v grep
    
    # 检查网络连接的进程
    echo ""
    echo "网络连接的进程:"
    netstat -tulnp | grep LISTEN
    
    # 检查僵尸进程
    echo ""
    echo "僵尸进程:"
    ps aux | awk '{print $8}' | grep -c Z || echo "0"
    
    # 检查高CPU使用进程
    echo ""
    echo "高CPU使用进程:"
    ps aux --sort=-%cpu | head -10
}

# 检查磁盘安全
check_disk_security() {
    log_info "检查磁盘安全"
    
    echo ""
    echo "磁盘安全检查"
    echo "=========="
    
    # 检查磁盘使用
    echo "磁盘使用:"
    df -h
    
    # 检查inode使用
    echo ""
    echo "inode使用:"
    df -i
    
    # 检查大文件
    echo ""
    echo "大文件:"
    find / -type f -size +100M 2>/dev/null | head -20
}

# 检查密码策略
check_password_policy() {
    log_info "检查密码策略"
    
    echo ""
    echo "密码策略检查"
    echo "=========="
    
    # 检查密码复杂度
    if [ -f "/etc/pam.d/common-password" ]; then
        echo "密码复杂度配置:"
        grep "pam_pwquality.so" /etc/pam.d/common-password || \
        grep "pam_cracklib.so" /etc/pam.d/common-password
    fi
    
    # 检查密码过期策略
    echo ""
    echo "密码过期策略:"
    grep -E "PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE" /etc/login.defs
    
    # 检查账户锁定策略
    echo ""
    echo "账户锁定策略:"
    grep -E "FAILLOG_ENAB|FAIL_DELAY" /etc/login.defs
}

# 检查SSH安全
check_ssh_security() {
    log_info "检查SSH安全"
    
    echo ""
    echo "SSH安全检查"
    echo "=========="
    
    if [ ! -f "/etc/ssh/sshd_config" ]; then
        echo "SSH配置文件不存在"
        return
    fi
    
    # 检查SSH配置
    echo "SSH配置:"
    grep -E "^(PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|Port|Protocol|X11Forwarding)" /etc/ssh/sshd_config
    
    # 检查SSH密钥
    echo ""
    echo "SSH密钥:"
    ls -la ~/.ssh/ 2>/dev/null || echo "没有SSH密钥"
    
    # 检查SSH登录历史
    echo ""
    echo "SSH登录历史:"
    grep "sshd" /var/log/auth.log 2>/dev/null | tail -10 || \
    grep "sshd" /var/log/secure 2>/dev/null | tail -10
}

# 生成安全报告
generate_security_report() {
    log_info "生成安全报告"
    
    {
        echo "安全检查报告"
        echo "=========="
        echo "检查时间: $(date)"
        echo "主机名: $(hostname)"
        echo "操作系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')"
        echo "内核版本: $(uname -r)"
        echo ""
        
        check_user_security
        check_file_permissions
        check_service_security
        check_network_security
        check_system_updates
        check_log_security
        check_process_security
        check_disk_security
        check_password_policy
        check_ssh_security
        
        echo ""
        echo "检查完成"
        echo "========"
        echo "报告生成时间: $(date)"
    } > "$REPORT_FILE"
    
    log_info "安全报告已生成: $REPORT_FILE"
}

# 发送安全告警
send_security_alert() {
    local message=$1
    
    log_error "发送安全告警: $message"
    
    # 发送邮件告警
    if command -v mail &> /dev/null; then
        echo "$message" | mail -s "安全告警" "$ALERT_EMAIL"
    fi
    
    # 记录到系统日志
    logger -p auth.warning "Security Alert: $message"
}

# 执行完整安全检查
run_full_security_check() {
    log_info "开始完整安全检查"
    
    local issues=0
    
    # 执行各项检查
    check_user_security
    check_file_permissions
    check_service_security
    check_network_security
    check_system_updates
    check_log_security
    check_process_security
    check_disk_security
    check_password_policy
    check_ssh_security
    
    # 生成报告
    generate_security_report
    
    # 检查是否有安全问题
    if grep -q "ERROR\|WARNING" "$REPORT_FILE"; then
        issues=$(grep -c "ERROR\|WARNING" "$REPORT_FILE")
        send_security_alert "发现 $issues 个安全问题"
        return 1
    fi
    
    log_info "安全检查完成,没有发现安全问题"
    return 0
}

# 显示帮助
show_help() {
    echo "用法: $0 [选项] [检查项]"
    echo ""
    echo "选项:"
    echo "  -r <文件>        报告文件(默认: /tmp/security_check_report.txt)"
    echo "  -e <邮箱>        告警邮箱"
    echo "  -h               显示帮助信息"
    echo ""
    echo "检查项:"
    echo "  all               执行完整检查(默认)"
    echo "  user              检查用户安全"
    echo "  file              检查文件权限"
    echo "  service           检查服务安全"
    echo "  network           检查网络安全"
    echo "  update            检查系统更新"
    echo "  log               检查日志安全"
    echo "  process           检查进程安全"
    echo "  disk              检查磁盘安全"
    echo "  password          检查密码策略"
    echo "  ssh               检查SSH安全"
    echo ""
    echo "示例:"
    echo "  $0"
    echo "  $0 all"
    echo "  $0 user"
    echo "  $0 service"
}

# 主函数
main() {
    # 解析选项
    while getopts "r:e:h" opt; do
        case $opt in
            r)
                REPORT_FILE="$OPTARG"
                log_info "报告文件: $REPORT_FILE"
                ;;
            e)
                ALERT_EMAIL="$OPTARG"
                log_info "告警邮箱: $ALERT_EMAIL"
                ;;
            h)
                show_help
                exit 0
                ;;
            *)
                log_error "无效选项: $opt"
                show_help
                exit 1
                ;;
        esac
    done
    
    shift $((OPTIND - 1))
    
    # 检查检查项
    local check_item=${1:-all}
    
    # 执行检查
    case $check_item in
        all)
            run_full_security_check
            ;;
        user)
            check_user_security
            ;;
        file)
            check_file_permissions
            ;;
        service)
            check_service_security
            ;;
        network)
            check_network_security
            ;;
        update)
            check_system_updates
            ;;
        log)
            check_log_security
            ;;
        process)
            check_process_security
            ;;
        disk)
            check_disk_security
            ;;
        password)
            check_password_policy
            ;;
        ssh)
            check_ssh_security
            ;;
        *)
            log_error "无效的检查项: $check_item"
            show_help
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"

使用说明#

  1. 添加执行权限:

    chmod +x security_check.sh
  2. 基本用法:

    # 执行完整安全检查
    ./security_check.sh
    
    # 检查用户安全
    ./security_check.sh user
    
    # 检查文件权限
    ./security_check.sh file
    
    # 检查服务安全
    ./security_check.sh service
  3. 高级用法:

    # 指定报告文件
    ./security_check.sh -r /tmp/custom_report.txt
    
    # 指定告警邮箱
    ./security_check.sh -e admin@example.com
    
    # 检查网络安全
    ./security_check.sh network
    
    # 检查SSH安全
    ./security_check.sh ssh

功能特点#

  • 用户安全检查
  • 文件权限检查
  • 服务安全检查
  • 网络安全检查
  • 系统更新检查
  • 日志安全检查
  • 进程安全检查
  • 磁盘安全检查
  • 密码策略检查
  • SSH安全检查
  • 详细安全报告
  • 告警功能

依赖项#

  • netstat: 用于网络检查
  • systemctl: 用于服务检查
  • ufw/firewall-cmd: 用于防火墙检查

注意事项#

  1. 某些检查需要root权限
  2. 告警功能需要配置邮件
  3. 检查间隔建议不要太频繁
  4. 报告文件路径需要有写权限
  5. 可以根据实际情况调整检查项