# IAM AKSK泄漏自动响应

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

## 适用的发现类型

* [UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS](https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-types-iam.html#unauthorizedaccess-iam-instancecredentialexfiltrationinsideaws)

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

## 配置Step Function

创建状态机

<table><thead><tr><th width="201"></th><th></th></tr></thead><tbody><tr><td>状态机名称</td><td>revoke-old-sessions</td></tr><tr><td>类型</td><td>标准</td></tr><tr><td>code</td><td><p></p><pre class="language-json"><code class="lang-json">{
  "StartAt": "RevokeOldSessions",
  "States": {
    "RevokeOldSessions": {
      "End": true,
      "Parameters": {
        "PolicyDocument.$": "$.PolicyDocument",
        "PolicyName": "RevokeOldSessions",
        "RoleName.$": "$.RoleName"
      },
      "Resource": "arn:aws:states:::aws-sdk:iam:putRolePolicy",
      "Type": "Task"
    }
  }
}
</code></pre></td></tr></tbody></table>

## 配置EventBridge

打开 [EventBridge console ](https://console.aws.amazon.com/events/home?region=us-west-2)。

点击 **创建规则** 按钮。

<table><thead><tr><th width="188"></th><th></th></tr></thead><tbody><tr><td>名称</td><td>IAM-AKSK-Leak-RemediationRule</td></tr><tr><td>描述</td><td>GuardDuty EC2 Credential Remediation Rule</td></tr><tr><td>规则类型</td><td>具有事件模式的规则</td></tr><tr><td>事件源</td><td>AWS 事件或 EventBridge 合作伙伴事件</td></tr><tr><td>创建方法</td><td>使用模式表单</td></tr><tr><td>事件模式</td><td>{ "detail-type": ["GuardDuty Finding"], "source": ["aws.guardduty"], "detail": { "type": ["UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.OutsideAWS", "UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS"] } }</td></tr><tr><td>选择目标</td><td>AWS 服务-Step Function状态机-revoke-old-sessions</td></tr></tbody></table>

我们不希望将之前查看过的整个 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安全凭据的攻击过程](https://aws-gcr-wwso-security.gitbook.io/an-quan-zui-jia-shi-jian/an-quan-ti-xi-jian-she/yun-zi-chan-ru-qin-fang-fan/mo-ni-gong-ji-ce-shi-fang-hu-xiao-guo/duo-zhong-huo-qu-aws-iam-an-quan-ping-ju-de-ban-fa/tong-guo-web-lou-dong-huo-qu-iam-an-quan-ping-ju)，会触发GuardDuty的告警。

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

<figure><img src="https://3752289132-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTfg4e0NhLEbwi6WFJp%2Fuploads%2FvMfA1y3RmWgfMA79aFdY%2Fimage.png?alt=media&#x26;token=cb042cde-fd75-4599-90cc-2f8b07b02cac" alt=""><figcaption></figcaption></figure>
