如何通过编程/CLI工具找出30天未使用的KMS密钥?
识别超过30天未使用的KMS密钥
CLI方式(以AWS KMS为例)
可以用AWS CLI结合bash脚本批量排查,脚本会遍历所有KMS密钥,查询最近30天的调用统计,筛选出无调用记录的密钥:
#!/bin/bash # 计算30天前的UTC时间,格式符合KMS API要求 THIRTY_DAYS_AGO=$(date -d "-30 days" +%Y-%m-%dT%H:%M:%SZ) # 遍历所有KMS密钥ID for key_id in $(aws kms list-keys --query 'Keys[*].KeyId' --output text); do # 获取密钥别名(方便识别,可选) alias=$(aws kms list-aliases --key-id $key_id --query 'Aliases[0].AliasName' --output text) # 查询最近30天的总调用次数 usage=$(aws kms get-key-usage-statistics --key-id $key_id --start-time $THIRTY_DAYS_AGO --query 'KeyUsageStatistics[*].TotalCalls' --output text) # 无调用统计或调用次数为0时,标记为未使用 if [ -z "$usage" ] || [ "$usage" -eq 0 ]; then echo "未使用密钥:ID=$key_id 别名=$alias" fi done
使用前确保已配置AWS CLI权限(需要kms:ListKeys、kms:ListAliases、kms:GetKeyUsageStatistics权限),执行脚本即可输出结果。
编程方式(Python + Boto3)
用Python结合AWS SDK(Boto3)实现批量排查,逻辑和CLI一致,适合需要进一步处理结果的场景:
import boto3 from datetime import datetime, timedelta # 初始化KMS客户端 kms_client = boto3.client('kms') # 计算30天前的UTC时间 thirty_days_ago = datetime.utcnow() - timedelta(days=30) start_time = thirty_days_ago.strftime('%Y-%m-%dT%H:%M:%SZ') # 获取所有KMS密钥列表 keys = kms_client.list_keys()['Keys'] for key in keys: key_id = key['KeyId'] # 获取密钥别名 aliases = kms_client.list_aliases(KeyId=key_id)['Aliases'] alias = aliases[0]['AliasName'] if aliases else '无别名' # 查询最近30天的调用统计 try: usage_stats = kms_client.get_key_usage_statistics( KeyId=key_id, StartTime=start_time )['KeyUsageStatistics'] total_calls = usage_stats[0]['TotalCalls'] if usage_stats else 0 except: # 新创建或无统计数据的密钥默认视为未使用 total_calls = 0 if total_calls == 0: print(f"未使用密钥:ID={key_id} 别名={alias}")
其他云厂商适配思路
如果使用Azure Key Vault或GCP Cloud KMS,逻辑类似:
- Azure:用
az keyvault key list获取密钥,结合az monitor metrics list查询密钥调用指标 - GCP:用
gcloud kms keys list获取密钥,结合gcloud monitoring metrics query查询调用统计
内容的提问来源于stack exchange,提问作者Tom Ron
相关产品推荐
相关产品推荐

