AWS - KMS Enum

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

KMS - 密钥管理服务

AWS 密钥管理服务 (AWS KMS) 被呈现为一种托管服务,简化了用户 创建和管理客户主密钥 (CMKs) 的过程。这些 CMKs 在用户数据的加密中至关重要。AWS KMS 的一个显著特点是 CMKs 主要 由硬件安全模块 (HSMs) 保护,增强了加密密钥的保护。

KMS 使用 对称加密。这用于 加密静态信息(例如,在 S3 内部)。如果您需要 加密传输中的信息,则需要使用类似 TLS 的东西。

KMS 是一种 区域特定服务

亚马逊的管理员无法访问您的密钥。他们无法恢复您的密钥,也不会帮助您加密您的密钥。AWS 仅管理操作系统及其底层应用程序,管理我们的加密密钥及其使用方式则由我们自己负责。

客户主密钥 (CMK):可以加密最大 4KB 大小的数据。它们通常用于创建、加密和解密 DEKs(数据加密密钥)。然后使用 DEKs 来加密数据。

客户主密钥 (CMK) 是 AWS KMS 中主密钥的逻辑表示。除了主密钥的标识符和其他元数据(包括创建日期、描述和密钥状态)外,CMK 包含用于加密和解密数据的密钥材料。当您创建 CMK 时,AWS KMS 默认会为该 CMK 生成密钥材料。然而,您可以选择创建没有密钥材料的 CMK,然后将自己的密钥材料导入该 CMK。

主密钥有两种类型:

  • AWS 管理的 CMKs:由其他服务用于加密数据。它由在区域中创建它的服务使用。它们在您首次在该服务中实现加密时创建。每 3 年轮换一次,无法更改。
  • 客户管理的 CMKs:灵活性、轮换、可配置的访问和密钥策略。启用和禁用密钥。

信封加密 在密钥管理服务 (KMS) 的上下文中:两级层次系统 使用数据密钥加密数据,然后使用主密钥加密数据密钥

密钥策略

这些定义了 谁可以使用和访问 KMS 中的密钥

默认情况下:

  • 它授予 拥有 KMS 密钥的 AWS 账户的 IAM 访问 管理 KMS 密钥的访问权限。

与其他 AWS 资源策略不同,AWS KMS 密钥策略不会自动授予账户的任何主体权限。要授予账户管理员权限,密钥策略必须包含提供此权限的明确声明,如下所示。

  • 如果不允许账户("AWS": "arn:aws:iam::111122223333:root")的 IAM 权限将无效。

  • 允许账户使用 IAM 策略 允许访问 KMS 密钥,除了密钥策略之外。

没有此权限,允许访问密钥的 IAM 策略将无效,尽管拒绝访问密钥的 IAM 策略仍然有效。

  • 通过向账户管理员(包括无法删除的账户根用户)授予访问控制权限,降低密钥变得不可管理的风险

默认策略 示例:

{
"Sid": "Enable IAM policies",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "kms:*",
"Resource": "*"
}

Warning

如果账户被允许"arn:aws:iam::111122223333:root"),则该账户的主体仍然需要IAM权限才能使用KMS密钥。然而,如果某个角色的ARN密钥策略被特别允许,则该角色不需要IAM权限

策略详情

策略的属性:

  • 基于JSON的文档
  • 资源 –> 受影响的资源(可以是“*“)
  • 操作 –> kms:Encrypt, kms:Decrypt, kms:CreateGrant …(权限)
  • 效果 –> 允许/拒绝
  • 主体 –> 受影响的arn
  • 条件(可选) –> 授予权限的条件

授权:

  • 允许将您的权限委托给您AWS账户内的另一个AWS主体。您需要使用AWS KMS API创建它们。可以指明CMK标识符、受赠主体和所需的操作级别(解密、加密、生成数据密钥…)
  • 授权创建后,会发出GrantToken和GrantID

访问

  • 通过密钥策略 – 如果存在此策略,则优先于IAM策略
  • 通过IAM策略
  • 通过授权

密钥管理员

默认的密钥管理员:

  • 有权管理KMS,但无权加密或解密数据
  • 只有IAM用户和角色可以添加到密钥管理员列表中(不包括组)
  • 如果使用外部CMK,密钥管理员有权限导入密钥材料

CMK的轮换

  • 同一密钥放置的时间越长,使用该密钥加密的数据就越多,如果该密钥被泄露,则数据的风险范围就越广。此外,密钥活动的时间越长,被泄露的概率就越高。
  • KMS每365天轮换客户密钥(或者您可以在任何时候手动执行此过程),AWS管理的密钥每3年轮换一次,且此时间不可更改。
  • 旧密钥被保留以解密在轮换之前加密的数据
  • 在发生泄露时,轮换密钥不会消除威胁,因为仍然可以解密所有使用被泄露密钥加密的数据。然而,新数据将使用新密钥加密
  • 如果CMK处于禁用待删除状态,KMS将不执行密钥轮换,直到CMK被重新启用或删除被取消。

手动轮换

  • 需要创建一个新CMK,然后创建一个新的CMK-ID,因此您需要更新任何应用程序引用新的CMK-ID。
  • 为了简化此过程,您可以使用别名来引用密钥ID,然后只需更新别名所指向的密钥。
  • 您需要保留旧密钥以解密使用其加密的旧文件

您可以从您的本地密钥基础设施导入密钥。

其他相关KMS信息

KMS按每月从所有服务接收的加密/解密请求数量定价。

KMS与CloudTrail有完整的审计和合规集成;您可以在此审计对KMS所做的所有更改。

使用KMS策略,您可以执行以下操作:

  • 限制谁可以创建数据密钥以及哪些服务可以使用这些密钥
  • 限制系统访问仅加密、仅解密或两者都可以
  • 定义使系统能够跨区域访问密钥(尽管不推荐,因为托管KMS的区域发生故障将影响其他区域系统的可用性)。

您不能在区域之间同步或移动/复制密钥;您只能定义规则以允许跨区域访问。

枚举

aws kms list-keys
aws kms list-key-policies --key-id <id>
aws kms list-grants --key-id <id>
aws kms describe-key --key-id <id>
aws kms get-key-policy --key-id <id> --policy-name <name> # Default policy name is "default"
aws kms describe-custom-key-stores

# This script enumerates AWS KMS keys across all available regions.
for region in $(aws ec2 describe-regions --query "Regions[].RegionName" --output text); do
echo -e "\n### Region: $region ###"; aws kms list-keys --region $region --query "Keys[].KeyId" --output text | tr '\t' '\n';
done

权限提升

AWS - KMS Privesc

后期利用

AWS - KMS Post Exploitation

持久性

AWS - KMS Persistence

参考文献

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks