本文目录导读:

我来为你整理一份Java安全排查的流程规范文档,这份规范从发现问题到闭环处理的完整流程出发,适用于线上安全事件应急、代码审计、日常安全巡检等场景。
Java安全排查流程规范
事件分级与响应时效
| 等级 | 描述 | 响应时间 | 排查时间 |
|---|---|---|---|
| P0 | 数据泄露、RCE、核心服务瘫痪 | 15分钟 | 2小时 |
| P1 | 越权、SSRF、高危SQL注入 | 30分钟 | 4小时 |
| P2 | XSS、CSRF、敏感信息明文存储 | 2小时 | 8小时 |
| P3 | 配置不当、弱密码、信息泄露 | 4小时 | 24小时 |
快速定位阶段(前30分钟)
第一步:确认攻击来源与影响范围
# 1. 检查最近异常日志 tail -5000 /app/logs/app.log | grep -E "ERROR|Exception|SQL|suspicious" # 2. 查看网络连接状态 netstat -anp | grep -E "ESTABLISHED|TIME_WAIT" | sort -k4 # 3. 检查进程异常 ps aux --sort=-%mem | head -20 ps aux | grep -E "malware|miner|shell" # 4. 查看文件变更 find /app -mmin -30 -type f -name "*.class" -o -name "*.jar" -o -name "*.sh"
第二步:关键日志采集清单
| 日志类型 | 路径 | 关键排查字段 |
|---|---|---|
| 应用日志 | /app/logs/ | userId, ip, requestUri, exception |
| 访问日志 | /nginx/logs/ | sourceIp, userAgent, status, bodyBytes |
| SQL慢日志 | /var/lib/mysql/slow.log | query_time, rows_examined, sql_text |
| 安全日志 | /var/log/secure | Failed password, Accepted |
| 系统日志 | /var/log/messages | kernel, OOM, error |
系统层面排查
# 3.1 进程与资源 top -b -n 1 | head -30 free -h df -h # 3.2 用户与权限 cat /etc/passwd | grep -E "/bin/bash|/bin/sh" last -10 w # 3.3 定时任务 crontab -l cat /etc/crontab ls -la /etc/cron.* # 3.4 网络连接 netstat -antp | grep -E "LISTEN|ESTABLISHED" lsof -i :8080 # 检查特定端口 # 3.5 文件异常 find / -name "*.jsp" -mmin -60 find / -name "*.php" -type f 2>/dev/null find / -perm -4000 -o -perm -2000 2>/dev/null
应用层面排查
1 JVM问题排查
// 快速诊断脚本 jstack_diagnostic.sh
#!/bin/bash
APP_PID=$(jps -l | grep "application.jar" | awk '{print $1}')
# 线程堆栈
jstack $APP_PID > /tmp/jstack_$(date +%Y%m%d_%H%M%S).log
# 内存快照
jmap -dump:live,format=b,file=/tmp/heap_$(date +%Y%m%d_%H%M%S).hprof $APP_PID
# GC日志分析
jstat -gcutil $APP_PID 1000 10
# 类加载分析
jcmd $APP_PID VM.class_histogram | head -50
2 常见漏洞排查清单
| 漏洞类型 | 排查点 | 检测命令/方法 |
|---|---|---|
| SQL注入 | MyBatis/MyBatis-Plus SQL拼接 | grep -r "\$\\{" src/main/resources/mapper/ |
| XSS | 未使用HTML转义 | grep -r "request.getParameter\|@RequestParam" src/ |
| RCE | Runtime.exec/ProcessBuilder | grep -r "Runtime.getRuntime()" src/ |
| SSRF | URL连接外网 | grep -r "new URL\|HttpURLConnection" src/ |
| 越权 | 未校验用户ID | grep -r "getUserById\|findById" src/ --include="*Controller*" |
| 敏感信息 | 配置文件明文密码 | grep -r "password\|secret\|key" src/main/resources/ |
3 依赖包安全扫描
<!-- pom.xml 集成 OWASP Dependency-Check -->
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>9.0.9</version>
<configuration>
<failBuildOnCVSS>7</failBuildOnCVSS>
<formats>
<format>HTML</format>
<format>JSON</format>
</formats>
</configuration>
</plugin>
<!-- 执行扫描 -->
mvn org.owasp:dependency-check-maven:check
数据安全排查
-- 5.1 数据库异常查询
-- MySQL 慢查询分析
SELECT * FROM mysql.slow_log
WHERE query_time > 2
ORDER BY query_time DESC
LIMIT 100;
-- PostgreSQL 活动连接
SELECT pid, usename, application_name,
client_addr, state, query
FROM pg_stat_activity
WHERE state != 'idle';
-- 5.2 数据泄露检测
-- 检查非常规时间段的查询
SELECT * FROM audit_log
WHERE action = 'QUERY'
AND create_time BETWEEN '00:00:00' AND '06:00:00'
ORDER BY create_time DESC;
-- 5.3 敏感数据查询审计
SELECT * FROM audit_log
WHERE table_name IN ('user', 'credit_card', 'id_card')
AND query_columns LIKE '%password%'
OR query_columns LIKE '%mobile%';
网络层面排查
# 6.1 异常流量检测
# 外网连接
netstat -antp | grep -v "127.0.0.1" | grep "ESTABLISHED" | awk '{print $5}' | sort | uniq -c | sort -rn | head -20
# DNS查询异常
tcpdump -i eth0 port 53 -c 100
cat /etc/hosts | grep -v "^#" | grep -v "^$"
# 6.2 WAF日志分析
# Nginx WAF日志
tail -f /var/log/nginx/waf.log | grep -E "BLOCK|ALERT"
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 6.3 代理/隧道检测
ss -tuln | grep -E "1080|8080|3128|9050"
lsof -i | grep -E "SOCKS|PROXY"
排查结果记录模板
# 安全事件排查报告 ## 基础信息 - **事件ID**: SEC-20241201-001 - **等级**: P1 - **发现时间**: 2024-12-01 14:30:00 - **报告人**: 张三 ## 事件描述 [详细描述问题现象和发现经过] ## 排查过程 ### 7.1 时间线 | 时间 | 操作 | 结果 | |------|------|------| | 14:30-14:45 | 日志分析 | 发现异常IP 192.168.1.100 | | 14:45-15:00 | 进程检查 | 发现可疑进程java -jar suspicious.jar | ### 7.2 影响范围 - **受影响系统**: [系统名称] - **受影响用户**: [用户范围] - **受影响数据**: [数据类型及数量] ### 7.3 根因分析 [分析问题根源,包括技术层面和流程层面] ### 7.4 处置措施 1. [措施一] 2. [措施二] 3. [措施三] ### 7.5 后续改进 1. [改进点一] 2. [改进点二] ## 附件 - [日志文件路径] - [堆dump文件路径] - [排查工具输出]
自动化排查脚本
#!/usr/bin/env python3
# Java安全快速排查脚本 safe_check.py
import os
import subprocess
import json
from datetime import datetime
class SecurityChecker:
def __init__(self, app_dir="/app"):
self.app_dir = app_dir
self.results = {
"timestamp": datetime.now().isoformat(),
"checks": [],
"risk_indicators": []
}
def check_process(self):
"""检查异常进程"""
result = subprocess.run(
["ps", "aux", "--sort=-%mem"],
capture_output=True, text=True
)
# 检查可疑进程
suspicious_keywords = ["miner", "xmr", "stratum", "malware"]
for line in result.stdout.split('\n'):
if any(kw in line.lower() for kw in suspicious_keywords):
self.results["risk_indicators"].append({
"type": "suspicious_process",
"detail": line
})
def check_logs(self, minutes=60):
"""检查最近日志异常"""
app_log = f"{self.app_dir}/logs/app.log"
if os.path.exists(app_log):
# 检查最近几分钟的异常
count = subprocess.run(
f"grep -c 'ERROR|Exception' <(tail -{minutes*60} {app_log})",
shell=True,
capture_output=True,
text=True
)
if int(count.stdout.strip()) > 10:
self.results["risk_indicators"].append({
"type": "high_error_rate",
"detail": f"minutes}分钟异常数: {count.stdout.strip()}"
})
def check_network(self):
"""检查异常网络连接"""
result = subprocess.run(
["netstat", "-antp"],
capture_output=True, text=True
)
# 检查高危端口
risk_ports = [4444, 5555, 6666, 8888, 31337, 9999]
for line in result.stdout.split('\n'):
for port in risk_ports:
if f":{port}" in line:
self.results["risk_indicators"].append({
"type": "risk_port",
"detail": f"高危端口 {port} 开放: {line}"
})
def run_all_checks(self):
"""执行全量检查"""
print("[*] 开始安全排查...")
self.check_process()
self.check_logs()
self.check_network()
# 输出结果
with open(f"/tmp/safety_check_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json", 'w') as f:
json.dump(self.results, f, indent=2)
return self.results
if __name__ == "__main__":
checker = SecurityChecker()
results = checker.run_all_checks()
if results["risk_indicators"]:
print(f"[!] 发现 {len(results['risk_indicators'])} 个风险项")
for risk in results["risk_indicators"]:
print(f" - {risk['type']}: {risk['detail']}")
else:
print("[+] 未发现明显异常")
安全加固清单
| 类别 | 检查项 | 整改建议 | 优先级 |
|---|---|---|---|
| 认证授权 | 默认密码 | 强制密码复杂度+定期修改 | P0 |
| session超时 | 设置空闲超时30分钟 | P1 | |
| 接口鉴权 | 所有API需要token校验 | P0 | |
| 输入验证 | 参数校验 | 统一使用Validation注解 | P1 |
| 文件上传 | 限制类型和大小,重命名 | P1 | |
| 配置安全 | 日志打印 | 脱敏处理敏感信息 | P1 |
| CORS配置 | 设置白名单 | P2 | |
| 依赖管理 | 第三方库 | 定期更新修复CVE | P1 |
| 部署安全 | JVM参数 | 设置安全管理器 | P2 |
| Docker | 使用非root用户运行 | P1 |
应急响应流程图
事件发现
↓
【15分钟】 事件分级与通知
↓
【30分钟】 快速定位与止损
↓
【1小时】 深入排查与证据固定
↓
【2小时】 根因分析与处置
↓
【4小时】 恢复服务与监控
↓
【24小时】 复盘与改进
最佳实践
- 日志集中管理:使用ELK或Splunk统一收集,便于快速检索
- 基线建立:维持正常时的系统、网络、应用基线,便于异常发现
- 自动化检测:将排查脚本集成到CI/CD流水线中
- 演习常态化:定期进行红蓝对抗和应急演练
- 知识库沉淀:每次排查后更新Checklist和排查手册
这套流程规范涵盖了从快速定位到深入排查的完整过程,可根据实际环境灵活调整,建议将常用命令封装成工具脚本,部署在堡垒机上供运维和安全人员快速使用。