Shell脚本如何监控用户操作行为

wen 实用脚本 2

本文目录导读:

Shell脚本如何监控用户操作行为

  1. 监控登录和命令历史
  2. 使用auditd进行系统调用监控
  3. 文件操作监控
  4. SSH连接监控
  5. 综合监控脚本
  6. 使用系统审计
  7. 使用proctable监控进程
  8. 使用方法
  9. 注意事项

我来介绍使用Shell脚本监控用户操作行为的几种方法:

监控登录和命令历史

实时监控用户登录

#!/bin/bash
# user_monitor.sh
LOG_FILE="/var/log/user_monitor.log"
# 监控登录用户变化
while true; do
    CURRENT_USERS=$(who | wc -l)
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 当前登录用户数: $CURRENT_USERS" >> $LOG_FILE
    who >> $LOG_FILE
    echo "---" >> $LOG_FILE
    sleep 60
done

监控特定用户的命令执行

#!/bin/bash
# command_monitor.sh
MONITOR_USER="username"
LOG_FILE="/var/log/cmd_monitor.log"
# 监控特定用户的~/.bash_history
tail -f /home/$MONITOR_USER/.bash_history | while read line; do
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $MONITOR_USER: $line" >> $LOG_FILE
done

使用auditd进行系统调用监控

#!/bin/bash
# audit_monitor.sh
# 安装并配置auditd
yum install audit audit-libs -y 2>/dev/null || apt-get install auditd -y 2>/dev/null
# 添加审计规则
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/sudoers -p wa -k sudoers_changes
# 搜索审计日志
ausearch -k passwd_changes --format text | tail -20

文件操作监控

#!/bin/bash
# file_monitor.sh
WATCH_DIR="/etc /home /root"
LOG_FILE="/var/log/file_monitor.log"
# 使用inotify监控文件变化
while read -r line; do
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $line" >> $LOG_FILE
    # 通过邮件发送警报(可选)
    # echo "$line" | mail -s "文件变化警报" admin@example.com
done < <(inotifywait -mr -e modify,create,delete,move $WATCH_DIR 2>/dev/null)

SSH连接监控

#!/bin/bash
# ssh_monitor.sh
LOG_FILE="/var/log/ssh_monitor.log"
# 监控SSH日志
tail -f /var/log/auth.log 2>/dev/null | grep -E "sshd" | while read line; do
    if echo "$line" | grep -qE "Accepted|Failed"; then
        USER=$(echo "$line" | grep -oP "user \K\w+")
        IP=$(echo "$line" | grep -oP "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+")
        ACTION=$(echo "$line" | grep -oP "^\w+ \d+ \d+:\d+:\d+.*?(Accepted|Failed)")
        echo "$(date '+%Y-%m-%d %H:%M:%S') - SSH $ACTION - 用户: $USER - IP: $IP" >> $LOG_FILE
        # 记录失败的登录尝试
        if echo "$line" | grep -q "Failed"; then
            echo "警告:SSH登录失败 - 用户: $USER - IP: $IP" >> $LOG_FILE
        fi
    fi
done

综合监控脚本

#!/bin/bash
# comprehensive_monitor.sh
# 配置
LOG_DIR="/var/log/user_activity"
MONITOR_USERS=("root" "admin" "devops")
ALERT_EMAIL="admin@example.com"
# 创建日志目录
mkdir -p $LOG_DIR
# 函数:记录用户活动
log_user_activity() {
    local user=$1
    local activity=$2
    local log_file="$LOG_DIR/${user}_activity.log"
    echo "$(date '+%Y-%m-%d %H:%M:%S') | $user | $activity" >> $log_file
    # 检测可疑活动
    case "$activity" in
        *"sudo"*|*"su"*|*"passwd"*|*"useradd"*|*"userdel"*)
            echo "高危操作警报: $user - $activity" | mail -s "安全警报" $ALERT_EMAIL
            ;;
    esac
}
# 主监控循环
echo "启动用户行为监控..."
echo "时间: $(date)"
echo "监控用户: ${MONITOR_USERS[*]}"
echo "日志目录: $LOG_DIR"
while true; do
    # 监控当前登录用户
    who >> "$LOG_DIR/current_users.log"
    # 监控特定用户的活动
    for user in "${MONITOR_USERS[@]}"; do
        # 检查用户是否在线
        if who | grep -q "^$user"; then
            # 获取该用户的进程信息
            ps -u "$user" --no-headers 2>/dev/null | while read -r line; do
                pid=$(echo "$line" | awk '{print $1}')
                cmd=$(echo "$line" | awk '{$1=$2=""; print $0}' | sed 's/^ *//')
                log_user_activity "$user" "PID:$pid $cmd"
            done
        fi
    done
    # 检查并清理旧的日志文件(保留30天)
    find "$LOG_DIR" -name "*.log" -mtime +30 -delete 2>/dev/null
    sleep 10
done

使用系统审计

#!/bin/bash
# system_audit.sh
AUDIT_DIR="/var/log/audit"
# 安装audit包
install_audit() {
    if command -v yum &> /dev/null; then
        yum install -y audit audit-libs
    elif command -v apt-get &> /dev/null; then
        apt-get install -y auditd audispd-plugins
    fi
}
# 配置审计规则
configure_audit() {
    cat > /etc/audit/rules.d/user_monitor.rules << EOF
# 监控用户创建和删除
-w /etc/passwd -p wa -k user_account
-w /etc/shadow -p wa -k user_account
-w /etc/group -p wa -k user_account
# 监控sudo命令
-w /etc/sudoers -p wa -k sudo_usage
-w /var/log/sudo.log -p rw -k sudo_log
# 监控重要文件
-w /etc/ssh/sshd_config -p wa -k ssh_config
-w /etc/crontab -p wa -k cron_changes
# 监控系统调用(可选)
-a always,exit -S execve -k process_execution
EOF
    auditctl -D
    auditctl -R /etc/audit/rules.d/user_monitor.rules
}
# 生成报告
generate_report() {
    local report_file="$AUDIT_DIR/report_$(date +%Y%m%d).txt"
    echo "=== 用户行为审计报告 ===" > $report_file
    echo "生成时间: $(date)" >> $report_file
    echo "" >> $report_file
    # 最近的小时内的活动
    echo "=== 最近1小时内的用户活动 ===" >> $report_file
    ausearch -ts recent -i >> $report_file 2>/dev/null
    # 特定类型的事件
    echo "" >> $report_file
    echo "=== sudo使用记录 ===" >> $report_file
    ausearch -k sudo_usage -ts today -i >> $report_file 2>/dev/null
    echo "" >> $report_file
    echo "=== 账户变更记录 ===" >> $report_file
    ausearch -k user_account -ts today -i >> $report_file 2>/dev/null
}
# 主函数
main() {
    echo "系统审计配置开始..."
    install_audit
    configure_audit
    generate_report
    echo "审计配置完成,日志位置: $AUDIT_DIR"
}
main

使用proctable监控进程

#!/bin/bash
# process_monitor.sh
LOG_FILE="/var/log/process_monitor.log"
monitor_processes() {
    while true; do
        echo "=== $(date '+%Y-%m-%d %H:%M:%S') ===" >> $LOG_FILE
        # 监控所有用户进程
        ps aux --sort=-%cpu | head -20 >> $LOG_FILE
        # 监控特定进程
        echo "--- 监控进程 ---" >> $LOG_FILE
        ps -eo pid,ppid,user,cmd,%cpu,%mem --sort=-%cpu | head -10 >> $LOG_FILE
        # 监控网络连接
        echo "--- 网络连接 ---" >> $LOG_FILE
        netstat -tulpn 2>/dev/null | grep -E "LISTEN|ESTABLISHED" >> $LOG_FILE
        echo "" >> $LOG_FILE
        sleep 300  # 每5分钟监控一次
    done
}
# 启动监控
monitor_processes &
echo "进程监控已启动,PID: $!"

使用方法

  1. 赋予执行权限

    chmod +x monitor_script.sh
  2. 作为服务运行

    # 创建systemd服务
    cat > /etc/systemd/system/user-monitor.service << EOF
    [Unit]
    Description=User Activity Monitor
    After=network.target

[Service] Type=simple ExecStart=/path/to/monitor_script.sh Restart=always User=root

[Install] WantedBy=multi-user.target EOF

systemctl daemon-reload systemctl enable user-monitor.service systemctl start user-monitor.service


3. **查看监控日志**:
```bash
tail -f /var/log/user_monitor.log

注意事项

  1. 权限管理:监控脚本需要root权限才能获取全面信息
  2. 日志轮转:使用logrotate管理日志文件大小
  3. 性能影响:频繁的监控可能影响系统性能
  4. 隐私考虑:确保符合公司政策和当地法律法规
  5. 安全存储:保护监控日志的安全,防止未授权访问

这些脚本可以帮助你全面监控用户操作行为,但建议根据具体需求选择合适的方法。

抱歉,评论功能暂时关闭!