| name | detecting-cloud-cryptomining-activity |
| description | 通过分析计算使用异常、到挖矿池的网络流量、GuardDuty 发现以及使用 AWS、Azure 和 GCP 原生安全服务检测容器工作负载行为,检测云环境中的未授权加密货币挖矿活动。
|
| domain | cybersecurity |
| subdomain | cloud-security |
| tags | ["cloud-security","cryptomining","threat-detection","guardduty","cost-anomaly","incident-response"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
检测云加密货币挖矿活动
适用场景
- 调查云计算成本或 CPU 利用率意外峰值时
- GuardDuty、Defender for Cloud 或 SCC 报告与加密货币相关的发现时
- 监控被盗凭据用于启动挖矿实例时
- 为云环境中的未授权工作负载部署构建检测规则时
- 响应有关连接到已知挖矿池基础设施的网络告警时
不适用于:检测终端或本地服务器上的加密货币挖矿(使用 EDR 工具)、调查挖矿的财务影响(使用云成本管理工具),或在网络层面封锁挖矿(使用 DNS 过滤和防火墙规则)。
前置条件
- 跨所有账户和区域启用的 AWS GuardDuty
- 启用了服务器和容器计划的 Azure Defender for Cloud
- 启用了事件威胁检测的 GCP Security Command Center
- 启用 CloudTrail、Azure Activity Log 和 GCP Audit Log 用于 API 监控
- 配置了云成本监控和告警(AWS Cost Anomaly Detection、Azure Cost Management)
- 启用了网络流日志(VPC Flow Logs、NSG Flow Logs)
工作流程
步骤 1:识别 GuardDuty 加密货币发现(AWS)
查询 GuardDuty 中表示挖矿活动的加密货币专用发现类型。
aws guardduty list-findings \
--detector-id $(aws guardduty list-detectors --query 'DetectorIds[0]' --output text) \
--finding-criteria '{
"Criterion": {
"type": {
"Eq": [
"CryptoCurrency:EC2/BitcoinTool.B!DNS",
"CryptoCurrency:EC2/BitcoinTool.B",
"CryptoCurrency:Runtime/BitcoinTool.B!DNS",
"CryptoCurrency:Runtime/BitcoinTool.B",
"CryptoCurrency:Lambda/BitcoinTool.B"
]
},
"service.archived": {"Eq": ["false"]}
}
}' --output json
FINDING_IDS=$(aws guardduty list-findings \
--detector-id $(aws guardduty list-detectors --query 'DetectorIds[0]' --output text) \
--finding-criteria '{"Criterion":{"type":{"Eq":["CryptoCurrency:EC2/BitcoinTool.B!DNS"]}}}' \
--query 'FindingIds' --output json)
aws guardduty get-findings \
--detector-id $(aws guardduty list-detectors --query 'DetectorIds[0]' --output text) \
--finding-ids $FINDING_IDS \
--query 'Findings[*].{Type:Type,Severity:Severity,Resource:Resource.InstanceDetails.InstanceId,RemoteIP:Service.Action.NetworkConnectionAction.RemoteIpDetails.IpAddressV4,Domain:Service.Action.DnsRequestAction.Domain}' \
--output table
步骤 2:检测计算使用异常
监控意外的计算资源配置和 CPU 利用率峰值,这些可能表明挖矿活动。
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" \
--query 'Reservations[*].Instances[*].[InstanceId,InstanceType,LaunchTime,Tags[?Key==`Name`].Value|[0]]' \
--output table | grep -E "c5\.|c6\.|p3\.|p4\.|g4\.|g5\."
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-SUSPECT_INSTANCE \
--start-time 2026-02-22T00:00:00Z \
--end-time 2026-02-23T00:00:00Z \
--period 3600 \
--statistics Average \
--query 'Datapoints[*].[Timestamp,Average]' --output table
aws ce get-anomalies \
--date-interval '{"StartDate":"2026-02-16","EndDate":"2026-02-23"}' \
--query 'Anomalies[*].[AnomalyId,AnomalyScore.MaxScore,Impact.TotalImpact,RootCauses[0].Service]' \
--output table
az monitor metrics list \
--resource /subscriptions/SUB_ID/resourceGroups/RG/providers/Microsoft.Compute/virtualMachines/VM_NAME \
--metric "Percentage CPU" \
--interval PT1H \
--start-time 2026-02-22T00:00:00Z \
--end-time 2026-02-23T00:00:00Z
步骤 3:分析到挖矿池的网络流量
识别到已知加密货币挖矿池和 Stratum 协议流量的网络连接。
aws logs start-query \
--log-group-name vpc-flow-logs \
--start-time $(date -d "24 hours ago" +%s) \
--end-time $(date +%s) \
--query-string '
fields @timestamp, srcAddr, dstAddr, dstPort, bytes
| filter dstPort in [3333, 4444, 8333, 14444, 14433, 45700]
| sort bytes desc
| limit 100
'
aws logs start-query \
--log-group-name route53-resolver-logs \
--start-time $(date -d "24 hours ago" +%s) \
--end-time $(date +%s) \
--query-string '
fields @timestamp, query_name, srcids.instance
| filter query_name like /pool|mining|xmr|monero|nicehash|ethermine|f2pool|nanopool/
| limit 100
'
gcloud logging read '
resource.type="gce_subnetwork"
AND jsonPayload.connection.dest_port=(3333 OR 4444 OR 8333 OR 14444)
AND timestamp>="2026-02-22T00:00:00Z"
' --limit=50 --format=json
步骤 4:调查容器和无服务器挖矿
检查容器工作负载和无服务器函数中的加密货币挖矿。
kubectl top pods --all-namespaces --sort-by=cpu | head -20
kubectl get pods --all-namespaces -o json | python3 -c "
import json, sys
data = json.load(sys.stdin)
suspicious = ['xmrig', 'monero', 'miner', 'crypto', 'pool', 'hashrate']
for pod in data['items']:
ns = pod['metadata']['namespace']
name = pod['metadata']['name']
for container in pod['spec'].get('containers', []):
image = container.get('image', '').lower()
if any(s in image for s in suspicious):
print(f'可疑: {ns}/{name} -> 镜像: {container[\"image\"]}')
"
aws lambda list-functions --query 'Functions[*].[FunctionName,MemorySize,Timeout]' --output table
aws cloudwatch get-metric-statistics \
--namespace AWS/Lambda \
--metric-name Duration \
--dimensions Name=FunctionName,Value=SUSPECT_FUNCTION \
--start-time 2026-02-22T00:00:00Z \
--end-time 2026-02-23T00:00:00Z \
--period 3600 \
--statistics Average Maximum
步骤 5:追踪攻击向量
通过分析 API 日志和凭据使用情况,调查挖矿基础设施的部署方式。
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=ResourceType,AttributeValue=AWS::EC2::Instance \
--start-time 2026-02-20T00:00:00Z \
--query 'Events[?contains(Resources[0].ResourceName, `i-SUSPECT`)].[EventTime,EventName,Username,SourceIPAddress]' \
--output table
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=AccessKeyId,AttributeValue=AKIA_SUSPECT_KEY \
--query 'Events[*].[EventTime,EventName,SourceIPAddress,EventSource]' \
--output table
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=EventName,AttributeValue=RunInstances \
--start-time 2026-02-20T00:00:00Z \
--query 'Events[*].[EventTime,Username,SourceIPAddress]' \
--output table
步骤 6:遏制和修复
隔离挖矿资源,撤销被入侵的凭据,并实施预防控制。
aws ec2 terminate-instances --instance-ids i-MINING_INSTANCE_1 i-MINING_INSTANCE_2
aws iam update-access-key --user-name compromised-user \
--access-key-id AKIA_COMPROMISED --status Inactive
cat > mining-prevention-scp.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"ForAnyValue:StringLike": {
"ec2:InstanceType": ["p3.*", "p4.*", "g4.*", "g5.*"]
}
}
}]
}
EOF
aws cloudwatch put-metric-alarm \
--alarm-name high-ec2-spend \
--metric-name EstimatedCharges \
--namespace AWS/Billing \
--statistic Maximum \
--period 21600 \
--threshold 500 \
--comparison-operator GreaterThanThreshold \
--alarm-actions arn:aws:sns:us-east-1:ACCOUNT:billing-alerts
核心概念
| 术语 | 定义 |
|---|
| 加密货币挖矿(Cryptomining) | 未授权使用云计算资源挖掘加密货币,通常使用门罗币(XMR),因为其 CPU 挖矿效率和隐私特性 |
| Stratum 协议(Stratum Protocol) | 挖矿池通信协议,通常在端口 3333、4444 或 14444 上运行,用于在矿工和矿池之间协调挖矿工作 |
| GuardDuty 加密货币发现(GuardDuty CryptoCurrency Finding) | AWS 威胁检测发现,标识与已知加密货币挖矿基础设施通信的 EC2、EKS 或 Lambda 资源 |
| Cost Anomaly Detection | AWS 服务,使用机器学习检测可能指示未授权资源配置的异常消费模式 |
| 计算滥用(Compute Abuse) | 未授权使用云计算资源,通常通过被入侵的凭据或被利用的应用程序,用于加密货币挖矿或其他目的 |
| 服务控制策略(Service Control Policy) | AWS Organizations 策略,可限制实例类型或区域,防止攻击者启动 GPU/计算优化型挖矿实例 |
工具与系统
- AWS GuardDuty:威胁检测服务,包含针对 EC2、EKS 和 Lambda 上加密货币挖矿活动的专用发现类型
- Azure Defender for Cloud:通过行为分析和网络威胁情报检测加密货币挖矿
- GCP Event Threat Detection:SCC 组件,通过网络分析和进程监控识别加密货币挖矿
- CloudTrail / Activity Log / Audit Log:用于追踪挖矿资源如何配置的 API 审计日志
- VPC Flow Logs:用于识别到挖矿池基础设施连接的网络流数据
常见场景
场景:被入侵的 AWS 访问密钥用于启动 GPU 挖矿集群
场景背景:账单告警在周末从每天 200 美元激增到 15,000 美元后触发。调查发现 50 个 p3.8xlarge 实例在四个区域运行,全部由一名开发者的访问密钥启动。
方法:
- 查询 GuardDuty 的 CryptoCurrency 发现以确认挖矿活动
- 立即终止所有区域的所有挖矿实例
- 停用被入侵的访问密钥,并通过 CloudTrail 检查源 IP
- 发现密钥通过 TruffleHog 扫描在公开 GitHub 仓库中暴露
- 轮换被入侵用户的所有凭据
- 实施 SCP 以拒绝非生产账户中的 GPU 实例类型
- 启用具有自动告警的 AWS Cost Anomaly Detection
- 在整个开发团队中设置 git-secrets 预提交钩子
常见陷阱:加密货币矿工通常在账户没有监控的区域启动实例。在所有区域启用 GuardDuty。挖矿实例可能使用在实例终止后仍然存在的竞价请求,因此还需取消攻击者创建的任何活跃的竞价机群请求和自动扩展组。
输出格式
云加密货币挖矿事件报告
=====================================
账户: 123456789012(生产环境)
检测日期: 2026-02-23
告警来源: AWS Cost Anomaly Detection + GuardDuty
事件摘要:
启动的挖矿实例: 50 个(p3.8xlarge)
受影响区域: us-east-1, us-west-2, eu-west-1, ap-southeast-1
持续时间: 约 48 小时(2月21日 14:00 UTC 至 2月23日 10:00 UTC)
估计成本影响: 28,400 美元
挖掘的加密货币: 门罗币(XMR)
攻击向量:
被入侵的凭据: AKIA...WXYZ(developer-user)
暴露方式: 硬编码在公开 GitHub 仓库中
首次未授权 API 调用: 2月21日 13:47 UTC 来自 IP 185.x.x.x
GUARDDUTY 发现:
CryptoCurrency:EC2/BitcoinTool.B!DNS: 50 个发现
UnauthorizedAccess:EC2/TorIPCaller: 3 个发现
遏制操作:
[x] 所有挖矿实例已终止
[x] 被入侵的访问密钥已停用
[x] 通过 Secrets Manager 颁发了新访问密钥
[x] SCP 已应用以拒绝 GPU 实例类型
[x] 已配置成本异常告警
[x] 已在所有区域启用 GuardDuty