

在这篇文章中,我们将学习谷歌云中用于加密的KMS密钥,以及如何用terraform配置它们。
什么是KMS?
KMS是谷歌云中的一个密钥管理服务,我们可以在这里创建密钥环和加密密钥。默认情况下,GCP中的每个资源都是用谷歌管理的加密密钥进行加密的,但在KMS的帮助下,我们可以创建客户管理的加密密钥。
前提是:
- 确保云钥匙管理服务(KMS)API已启用
- 确保你的服务账户对KMS资源有适当的权限
- 安装了terraform
- 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
}
}
在这里,你可以看到我们已经定义了以下参数:
- name - 将在钥匙圈内创建的加密钥匙的名称。请记住,它是一个必填字段。
- key_ring - 这也是必须的,它表示这把钥匙所属的钥匙圈,在我们的例子中,我们把它连接到我们之前创建的钥匙圈。
- rotation_period - (可选)每过一段时间,就会产生一个新的加密钥匙版本,并将其设置为主钥匙。
- 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的全部内容。你可以用它来进行加密和解密。