awskms
封印
AWS KMS 封印配置了 Vault 如何使用 AWS KMS 封装封印密钥。AWS KMS 封印可以由以下任一方式激活:
- Vault 配置文件中设置了
seal "awskms"
块 - 环境变量
VAULT_SEAL_TYPE
的值被设置为awskms
。如果通过环境变量启用该功能,必须通过环境变量提供所有 AWS KMS 所需要的其他值和所有有助进行身份验证的环境变量。(例如AWS_ACCESS_KEY_ID
)
awskms
例子
下面的例子显示了通过 Vault 配置文件提供所有必要的值来配置 AWS KMS 封印:
seal "awskms" {
region = "us-east-1"
access_key = "AKIAIOSFODNN7EXAMPLE"
secret_key = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
kms_key_id = "19ec80b0-dfdd-4d97-8164-c6examplekey"
endpoint = "https://vpce-0e1bb1852241f8cc6-pzi0do8n.kms.us-east-1.vpce.amazonaws.com"
}
awskms
参数
以下参数可以在 Vault 配置文件的 seal
配置节当中使用:
region
(string: "us-east-1")
: 加密密钥所处的 AWS 区域。可以通过设置环境变量AWS_REGION
或是AWS_DEFAULT_REGION
来配置,也可以在~/.aws/config
文件中配置,或是使用实例元信息。access_key
(string: <required>)
: 使用的 AWS access key。可以通过设置环境变量AWS_ACCESS_KEY_ID
来配置,或是在 AWS 命令行配置文件或实例配置文件中配置。session_token
(string: "")
: 配置 AWS 会话(session)令牌。可以通过设置环境变量AWS_SESSION_TOKEN
来配置。secret_key
(string: <required>)
: 使用的 AWS secret key。可以通过设置环境变量AWS_SECRET_ACCESS_KEY
来配置,或是在 AWS 命令行配置文件或实例配置文件中配置。kms_key_id
(string: <required>)
: 加解密密钥的 KMS key ID 或是 ARN。可以通过设置环境变量VAULT_AWSKMS_SEAL_KEY_ID
来配置。endpoint
(string: "")
: 用于接收 AWS KMS 请求的 KMS API 终端节点。也可以由AWS_KMS_ENDPOINT
环境变量指定。有时,比如说需要通过 VPC 端点走内网连接 KMS 时该参数会很有用。如果没有设置该参数,Vault 将使用您所在地区的默认 API 端点。
身份验证
必须设置身份验证参数,可以通过环境变量或是配置文件中的参数。
注意:虽然我们可以在配置文件中配置 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
,但我们强烈推荐使用环境变量配置这两个参数。
AWS 身份验证参数有:
AWS_REGION
或是AWS_DEFAULT_REGION
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
注意:客户端使用官方 AWS SDK,如果没有提供上面的 AWS 参数,,将按顺序使用指定的凭证、环境变量中的凭证、共享文件凭证或 IAM 角色/ECS 任务凭证。
Vault 需要对 KMS 密钥具有以下权限:
kms:Encrypt
kms:Decrypt
kms:DescribeKey
以上权限可以通过 Vault 使用的委托(principal)的对指定 KMS 密钥的密钥策略的 IAM 权限授予,也可以通过密钥的 KMS Grants配置。
awskms
环境变量
AWS KMS 封印也可以通过设置以下环境变量来启用
VAULT_SEAL_TYPE
VAULT_AWSKMS_SEAL_KEY_ID
密钥轮换
AWS KMS 封印支持轮换 AWS KMS 文档中定义的主密钥。因为密钥信息与加密数据一起存储,所以KMS 支持自动轮换和手动轮换。旧密钥不得禁用或删除,并用于解密旧数据。任何新增或更新的数据都将使用封印配置中定义的当前密钥,或者利用密钥别名设置为当前密钥的密钥进行加密。
AWS 实例元数据超时
影响 Vault 1.4 及以后的版本
Vault 在 EC2 实例上使用实例元数据服务的时候,例如从实例配置文件中获取凭据,使用到实例元数据服务 (IMDSv2) 的 v2 版本时可能会出现延迟。 Vault 使用的 AWS SDK 首先尝试连接到 IMDSv2,如果超时,则回退到 v1。在 Vault 1.4 中,此超时最多可能需要 2 分钟。在 Vault 1.5.5 及更高版本中最多可能需要 2 秒钟。
超时会发生在 Vault 和 IMDSv2 之间存在代理,并且实例 hop 限制设置为小于 Vault 和 IMDSv2 之间的“hop”数的时候。例如,如果 Vault 在 EC2 实例上的 docker 中运行,并且实例 hop 限制设置为 1,AWS SDK 客户端将尝试连接到 IMDSv2,超时并回退到 IMDSv1,因为 docker 和 IMDS 之间存在额外的网络 hop.
为避免超时行为,可以在底层 EC2 实例上调整 hop 限制。对于 docker 示例,将 hop 限制设置为 2 就可以让 Vault 中的 AWS SDK 无延迟地连接到 IMDSv2。