如何用Terraform在GCP中创建KMS密钥?

174 阅读4分钟

在这篇文章中,我们将学习谷歌云中用于加密的KMS密钥,以及如何用terraform配置它们。

什么是KMS?

KMS是谷歌云中的一个密钥管理服务,我们可以在这里创建密钥环和加密密钥。默认情况下,GCP中的每个资源都是用谷歌管理的加密密钥进行加密的,但在KMS的帮助下,我们可以创建客户管理的加密密钥。

前提是:

  1. 确保云钥匙管理服务(KMS)API已启用
  2. 确保你的服务账户对KMS资源有适当的权限
  3. 安装了terraform
  4. Gcloud客户端

在terraform中添加提供者

provider "google" {

credentials = file("~/gcp/access-keys.json")

project = var.project_id

region = var.region

}

创建一个钥匙圈资源

首先,让我们了解一下什么是钥匙圈,钥匙圈是加密钥匙的顶级逻辑分组,它将钥匙组织在一个特定的谷歌云位置,并允许我们管理对钥匙组的访问控制。

为了创建一个钥匙圈,我们将使用资源 "google_kms_key_ring"

resource "google_kms_key_ring" "default" {

  name = var.ring_name

  location = var.region

}

在这个资源中,我们定义了一个钥匙圈资源,在这个资源中我们指定了两个字段,即钥匙圈的名称和它的位置。

创建一个钥匙资源

现在为了使用钥匙圈,我们必须在这个钥匙圈内创建一个钥匙。因此,为了创建一个加密钥匙,我们将使用google_kms_crypto_key这个资源。

resource "google_kms_crypto_key" "key" {

  name = var.key_name

  key_ring = google_kms_key_ring.keyring.id

  rotation_period = var.rotation_period


  version_template {

    algorithm = var.algorithm

  }


  lifecycle {

    prevent_destroy = false

  }

}

在这里,你可以看到我们已经定义了以下参数:

  1. name - 将在钥匙圈内创建的加密钥匙的名称。请记住,它是一个必填字段。
  2. key_ring - 这也是必须的,它表示这把钥匙所属的钥匙圈,在我们的例子中,我们把它连接到我们之前创建的钥匙圈。
  3. rotation_period - (可选)每过一段时间,就会产生一个新的加密钥匙版本,并将其设置为主钥匙。
  4. version_template - (可选)一个描述新密码钥匙版本设置的模板。在版本模板中,我们得到一个需要的参数算法,这被用来定义在此基础上创建版本时要使用的算法。

接下来在创建了这个钥匙圈和钥匙之后,我们必须给一个可以使用这个钥匙或加密和解密的谷歌身份以权限,即它将是一个服务账户,你也可以选择给它任何人的权限,无论是加密还是解密,或者是两者。

给予服务账户使用密钥的权限

resource "google_kms_crypto_key_iam_binding" "crypto_key" {

  crypto_key_id = google_kms_crypto_key.key.id

  role          = "roles/cloudkms.cryptoKeyEncrypterDecrypter"

  members       = [
     "serviceAccount:service-${data.google_project.project.number}@compute-system.iam.gserviceaccount.com",

  ]

}

GCP中的每个资源都有服务代理,通常是这样的类型

service-[PROJECT-NUMBER]@[Service-name].gserviceaccount.com

首先,我们用这个资源将我们创建的密钥与这个服务账户绑定,它将有一个角色来加密和解密它。这里我们使用的是google_kms_crypto_key_iam_binding资源,在这个资源下,我们给出了加密ID。

在上述资源中,你可能已经注意到"${data.google_project.project.number}",这是用来获取项目编号的,所以为了获取这个,请确保你在main.tf中添加这个数据

data "google_project" "project" {}。

这将有助于读取项目编号,你可以通过服务账户。

创建一个Var.tf文件

现在创建var.tf并添加变量

variable "key_name" {

  description = "Name of the KMS key"

  type = string

}

variable "keyring_name" {

  description = "Name of the KMS Keyring"

  type = string

}

variable "algorithm" {

  description = "Algorithm for the KMS key"


  type = string

}

variable "region" {

  description = "Region for the KMS key"

  type = string

}

variable "rotation_period" {

  description = "Time in seconds to rotate key"

  type = string


}

variable "project_id" {

  type = string

}

创建一个Terraform.tfvars文件

现在创建一个terraform.tfvars文件并传递所有的变量

project_id = "neon-semiotics-351410"

keyring_name  = "knoldus_keyring_east1"

key_name = "crypto-knoldus"

rotation_period = "2592000s" //30 days [its the default]

region = "us-east1"

algorithm = "GOOGLE_SYMMETRIC_ENCRYPTION"  

让我们运行并创建这个资源

terraform init

很明显,Terraform启动成功了,现在我们来运行计划

terraform plan

事实上,terraform的计划也是成功的,所以你可以运行apply来创建资源

terraform apply

运行apply后,系统会提示你是否要执行这些操作,请输入yes。

最后你可以看到它已经创建了资源,为了验证这一点,你可以访问控制台

在这里你可以看到它已经创建了一个名为knoldus_keyring_east1的密钥环,并在该密钥环内创建了一个名为crypto-knoldus的密钥。此外,它有一个软件保护级别,也有一个旋转周期。如果你想改变任何参数。此外,你可以直接在terraform代码中改变它,运行计划并应用它,它将被更新。

总结

这就是关于你如何在谷歌云中创建和管理KMS的全部内容。你可以用它来进行加密和解密。