AWS - KMS Enum

学习和练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) 学习和练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

KMS - Key Management Service

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

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

KMS 是一个特定区域的服务

Amazon 的管理员无法访问您的密钥。他们无法恢复您的密钥,也不会帮助您加密您的密钥。AWS 仅管理操作系统和底层应用程序,管理我们的加密密钥以及这些密钥的使用方式由我们负责。

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

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

有两种类型的主密钥:

  • AWS 管理的 CMKs:由其他服务用于加密数据。它由在某个区域创建它的服务使用。它们在您第一次在该服务中实现加密时创建。每 3 年轮换一次,无法更改。

  • 客户管理的 CMKs:灵活性、轮换、可配置的访问和密钥策略。启用和禁用密钥。

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

Key Policies

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

默认情况下:

  • 它赋予拥有 KMS 密钥的 AWS 账户对 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": "*"
}

如果账户被允许"arn:aws:iam::111122223333:root"),账户中的principal仍然需要IAM权限才能使用KMS密钥。然而,如果角色的ARN例如在Key Policy被特别允许,该角色不需要IAM权限

Policy Details

策略的属性:

  • 基于JSON的文档

  • 资源 --> 受影响的资源(可以是"*")

  • 操作 --> kms:Encrypt, kms:Decrypt, kms:CreateGrant ...(权限)

  • 效果 --> 允许/拒绝

  • Principal --> 受影响的arn

  • 条件(可选) --> 赋予权限的条件

Grants:

  • 允许将你的权限委托给你AWS账户内的另一个AWS principal。你需要使用AWS KMS API创建它们。可以指明CMK标识符、受让principal和所需的操作级别(Decrypt, Encrypt, GenerateDataKey...)

  • 在创建grant后,会发放一个GrantToken和一个GrantID

访问

  • 通过key policy -- 如果存在,这将优先于IAM策略

  • 通过IAM策略

  • 通过grants

Key Administrators

默认的Key administrator:

  • 有权管理KMS但不能加密或解密数据

  • 只有IAM用户和角色可以被添加到Key Administrators列表中(不是组)

  • 如果使用外部CMK,Key Administrators有权限导入密钥材料

CMKs的轮换

  • 密钥使用时间越长,用该密钥加密的数据就越多,如果该密钥被破坏,那么受影响的数据范围就越广。此外,密钥活跃时间越长,被破坏的概率就越大。

  • KMS每365天轮换一次客户密钥(或者你可以随时手动执行此过程),AWS管理的密钥每3年轮换一次,这个时间不能更改。

  • 保留旧密钥以解密在轮换之前加密的数据

  • 在破坏情况下,轮换密钥不会消除威胁,因为仍然可以解密使用被破坏密钥加密的所有数据。然而,新数据将使用新密钥加密

  • 如果CMK处于禁用待删除状态,KMS将不会执行密钥轮换,直到CMK重新启用或取消删除。

手动轮换

  • 需要创建一个新CMK,然后创建一个新的CMK-ID,因此你需要更新任何应用程序引用新的CMK-ID。

  • 为了使这个过程更容易,你可以使用别名来引用key-id,然后只需更新别名所引用的密钥。

  • 你需要保留旧密钥以解密旧文件

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

其他相关的KMS信息

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

KMS与CloudTrail有完整的审计和合规集成;你可以在这里审计对KMS进行的所有更改。

使用KMS策略你可以做以下事情:

  • 限制谁可以创建数据密钥以及哪些服务有权使用这些密钥

  • 限制系统访问仅加密、仅解密或两者

  • 定义允许系统跨区域访问密钥(尽管不推荐,因为托管KMS的区域故障将影响其他区域系统的可用性)。

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

Enumeration

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

提权

AWS - KMS Privesc

后渗透

AWS - KMS Post Exploitation

持久化

AWS - KMS Persistence

参考资料

学习和练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) 学习和练习 GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

Last updated