DynamoDB 存储后端

DynamoDB 存储后端可以用来将 Vault 的数据保存到 DynamoDB 表中。

  • 支持高可用集群 —— DynamoDB 存储后端支持高可用集群。由于 DynamoDB 使用 Vault 节点上的时间来实现锁的会话生命周期,所以 Vault 节点之间显著的时钟偏差可能会导致锁上的争用问题。
  • 仅有社区支持 —— DynamoDB 存储后端由社区支持。虽然它已经过 HashiCorp 员工的审查,但他们可能对该技术并不了解。如果遇到问题,该问题可能会被转交给原作者。
storage "dynamodb" {
  ha_enabled = "true"
  region     = "us-west-2"
  table      = "vault-data"
}

更多关于 DynamoDB 表的读写权限的信息,请参阅 AWS DynamoDB 官方文档

DynamoDB 参数

  • endpoint (string: "") – 指定一个非默认的,兼容 AWS 规范的 DynamoDB 端点。该参数也可以通过设置环境变量 AWS_DYNAMODB_ENDPOINT 来设置。(可用来配置使用兼容 DynamoDB 协议的其他存储服务)
  • ha_enabled (string: "false") – 配置该后端是否被用以运行在 Vault 高可用模式下。可选参数为 true 或是 false。该参数也可以通过设置环境变量 DYNAMODB_HA_ENABLED 来设置。
  • max_parallel (string: "128") – 设置最大并行请求数。
  • region (string "us-east-1") – 设置 AWS region。该参数也可以通过设置环境变量 AWS_DEFAULT_REGION 来设置。
  • read_capacity (int: 5) – 设置表上每秒可以执行多少次读操作,该参数在 Vault 创建 DynamoDB 表时生效,如果 table 已经存在则不起作用。该参数也可以通过设置环境变量 AWS_DYNAMODB_READ_CAPACITY 来设置。
  • table (string: "vault-dynamodb-backend") – 设置用来存储 Vault 数据的 DynamoDB 表名称。如果指定的表并不存在,那么在初始化时会创建该表。该参数也可以通过设置环境变量 AWS_DYNAMODB_TABLE 来设置。请阅读下方表结构 获取表结构信息。
  • write_capacity (int: 5) – 设置表上每秒可以执行多少次写操作,该参数在 Vault 创建 DynamoDB 表时生效,如果 table 已经存在则不起作用。该参数也可以通过设置环境变量 AWS_DYNAMODB_WRITE_CAPACITY 来设置。

下列参数用于向 AWS 进行身份验证。如果您在 EC2 实例上运行 Vault 服务器,您还可以使用 EC2 实例配置文件服务来提供 Vault 用于调用 DynamoDB API 的凭据。将 access_keysecret_key 字段留空将导致 Vault 尝试从 AWS 元数据服务检索凭证。

  • access_key (string: <required>) – 设置 AWS access key。该参数也可以通过设置环境变量 AWS_ACCESS_KEY_ID 来设置。
  • secret_key (string: <required>) – 设置 AWS secret key。该参数也可以通过设置环境变量 AWS_SECRET_ACCESS_KEY 来设置。
  • session_token (string: "") – 设置 AWS session token。该参数也可以通过设置环境变量 AWS_SESSION_TOKEN 来设置。

必要的 AWS 权限

Vault 所使用的 IAM 用户或是 EC2 实例配置文件所拥有的策略必须包含以下权限以使 Vault 可以顺利地对 DynamDB 表执行必要的操作:

  "Statement": [
    {
      "Action": [
        "dynamodb:DescribeLimits",
        "dynamodb:DescribeTimeToLive",
        "dynamodb:ListTagsOfResource",
        "dynamodb:DescribeReservedCapacityOfferings",
        "dynamodb:DescribeReservedCapacity",
        "dynamodb:ListTables",
        "dynamodb:BatchGetItem",
        "dynamodb:BatchWriteItem",
        "dynamodb:CreateTable",
        "dynamodb:DeleteItem",
        "dynamodb:GetItem",
        "dynamodb:GetRecords",
        "dynamodb:PutItem",
        "dynamodb:Query",
        "dynamodb:UpdateItem",
        "dynamodb:Scan",
        "dynamodb:DescribeTable"
      ],
      "Effect": "Allow",
      "Resource": [ "arn:aws:dynamodb:us-east-1:... dynamodb table ARN" ]
    },

表结构

如果要在 Vault 初始化之前预先创建 DynamoDB 表,我们需要创建包含以下属性(attribute)的表:

  • 主分区键(Primary partition key): "Path",string 类型
  • 主排序键(Primary sort key):"Key",string 类型

我们可以用 Terraform 来创建这样的表:

resource "aws_dynamodb_table" "dynamodb-table" {
  name           = "${var.dynamoTable}"
  read_capacity  = 1
  write_capacity = 1
    hash_key       = "Path"
    range_key      = "Key"
    attribute      = [
        {
            name = "Path"
            type = "S"
        },
        {
            name = "Key"
            type = "S"
        }
    ]
  tags {
    Name        = "vault-dynamodb-table"
    Environment = "prod"
  }
}

如果要创建的表已经存在,那么 Vault 不会修改它 —— Vault 配置文件中的 read_capacitywrite_capacity 值将不生效。

如果要创建的表尚不存在,Vault 会尝试创建它,并且分别应用Vault 配置文件中的 read_capacitywrite_capacity 值。

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。

Vault 配置使用 DynamoDB 的例子

使用自定义的表读写限制

该例子演示了使用自定义的读/写能力配置创建表:

storage "dynamodb" {
  table = "my-vault-data"

  read_capacity  = 10
  write_capacity = 15
}

启用高可用

该例子演示了为 DynamoDB 存储后端启用高可用:

api_addr = "https://vault-leader.my-company.internal"

storage "dynamodb" {
  ha_enabled    = "true"
  ...
}

results matching ""

    No results matching ""