IAM AKSK泄漏自动响应

GuardDuty Findings被发送到默认的 AWS EventBridge 事件总线。我们根据 InstanceCredentialExfiltration 发现的自定义事件模式配置了一个触发规则。该规则接收 GuardDuty 发现的 JSON 并提取被入侵的 IAM 角色及其最后看到的时间戳,然后将这些内容注入包含 IAM 策略的新 JSON 文档,并将其发送到我们的 Step Function 状态机。状态机通过其内置 SDK 集成调用 IAM PutRolePolicy API,针对 IAM 角色应用该策略,该策略会立即撤销所有活动会话。这将使攻击者窃取的凭据失去作用,从而在我们建立的保护措施都无效时中断攻击。

适用的发现类型

如果您的 EC2 实例凭据被用于从一个 IP 地址调用 API,而该 IP 地址的所有者是与相关 EC2 实例运行账户不同的 AWS 账户,则该发现会通知您。

配置Step Function

创建状态机

状态机名称

revoke-old-sessions

类型

标准

code

配置EventBridge

打开 EventBridge console

点击 创建规则 按钮。

名称

IAM-AKSK-Leak-RemediationRule

描述

GuardDuty EC2 Credential Remediation Rule

规则类型

具有事件模式的规则

事件源

AWS 事件或 EventBridge 合作伙伴事件

创建方法

使用模式表单

事件模式

{ "detail-type": ["GuardDuty Finding"], "source": ["aws.guardduty"], "detail": { "type": ["UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS", "UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS"] } }

选择目标

AWS 服务-Step Function状态机-revoke-old-sessions

我们不希望将之前查看过的整个 GuardDuty 发现 JSON 发送到步骤函数,而是想提取几个关键属性,并用它们来制定 IAM 策略,以撤销受损 IAM 角色的活动会话。为此,我们使用输入转换器和 JSON 选择器语法来提取 IAM 角色名称和时间戳。

在目标中展开其他设置,配置目标输入选择输入转换器,配置输入转换器:

输入路径:

{
  "role_name": "$.detail.resource.accessKeyDetails.userName",
  "timestamp": "$.detail.service.eventLastSeen"
}

输入模版:

{
  "RoleName": "<role_name>",
  "PolicyDocument": {
    "Version": "2012-10-17",
    "Statement": {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "DateLessThan": {
          "aws:TokenIssueTime": "<timestamp>"
        }
      }
    }
  }
}

验证效果

模拟获取IAM安全凭据的攻击过程,会触发GuardDuty的告警。

然后查看模拟中使用的IAM role是否新增加一个策略:"RevokeOldSession"

最后更新于