本文目录导读:

我来介绍使用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: $!"
使用方法
-
赋予执行权限:
chmod +x monitor_script.sh
-
作为服务运行:
# 创建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
注意事项
- 权限管理:监控脚本需要root权限才能获取全面信息
- 日志轮转:使用logrotate管理日志文件大小
- 性能影响:频繁的监控可能影响系统性能
- 隐私考虑:确保符合公司政策和当地法律法规
- 安全存储:保护监控日志的安全,防止未授权访问
这些脚本可以帮助你全面监控用户操作行为,但建议根据具体需求选择合适的方法。