在这篇博文中,我们探索了利用 IBM Cloud 上的 Terraform 通过无缝集成您的应用程序来创建和管理机密的实际实现 IBM 云 Kubernetes 服务 和 IBM 云秘密管理器。
此前,此功能 管理 TLS 和非 TLS 证书和机密 主要通过 CLI 使用命名空间进行访问 ibmcloud ks ingress secret
。 此 API 使用户能够通过将 Secrets Manager 秘密 CRN 传递到 API 来创建“入口秘密”资源,以在其 Kubernetes 集群中建立托管的相应秘密。 值得注意的是,对 Secrets Manager 实例中的密钥进行的任何更新都会自动反映在关联的 Kubernetes 集群中,从而确保两个环境之间的同步。
架构和行为
IBM Cloud Kubernetes Service 按以下方式协调创建的 Ingress 密钥:
- 该用户已有一个 IBM 云秘密管理器 实例和 IBM 云 Kubernetes 服务 实例。
- 用户注册 Secrets Manager 实例以确保其秘密 CRN 将在 Secrets Manager 秘密和相应的入口秘密之间同步。
- 然后,用户创建一个 IBM Cloud Kubernetes 入口秘密 它可以是具有 Secrets Manager CRN (ID) 的不透明密钥或 TLS 密钥。 这会在云中创建一个支持资源,将秘密 CRN 与 ClusterID/SecretName/SecretNamespace 相关联。
- IBM Cloud Kubernetes Service 通过 CRN 获取 Secrets Manager 密钥。
- IBM Cloud Kubernetes Service 使用 CRN 的值在集群中创建 Kubernetes 密钥。
- IBM Cloud Kubernetes Service 确保密钥值与相应的 Secrets Manager 密钥 CRN 保持同步。
好处
通过利用 一体化 借助 IBM Cloud Kubernetes Service 和 IBM Cloud Secrets Manager,您可以利用以下优势:
- 通过内置自动轮换功能无缝创建和管理 Secrets Manager 机密,以增强安全性。
- 使用您拥有的任何 Secrets Manager 实例的秘密 CRN 轻松配置 Kubernetes 秘密,确保一致且可靠的秘密管理。
- 定期在 Kubernetes 集群中自动同步和保存您的机密,无需手动更新并降低机密过时的风险。
- 直接从 IBM Cloud 控制台轻松跟踪和监控机密的过期日期,确保及时轮换并防止潜在的安全漏洞。
- 通过创建秘密组来保持对秘密访问的控制,允许您仅向批准的用户授予权限并增强应用程序的整体安全性。
实践示例
以下示例显示了通过 Terraform 脚本集成 IBM Cloud Kubernetes 和 IBM Cloud Secrets Manager。 要了解完整示例,请转到此 例子。 您将提供一个 IBM 云秘密管理器 实例,将其注册到 IBM Cloud Kubernetes Service,并创建托管 IBM Cloud Kubernetes Ingress 秘密 由 Secrets Manager 机密支持。
先决条件
要遵循此示例,您将需要以下内容:
浏览 Terraform 脚本
1. 创建 IBM Cloud Secrets Manager 实例
创建 IBM Cloud Secrets Manager 实例和密钥组来托管您的密钥。 学习更多关于 创建 Secrets Manager 服务实例:
resource "ibm_resource_instance"https://www.ibm.com/blog/unleashing-terraform-for-kubernetes-secret-management-with-ibm-cloud-kubernetes-service-and-secrets-manager/"sm_instance" {
name = var.sm_instance_name
service = "secrets-manager"
plan = var.sm_instance_plan
location = var.sm_instance_region
timeouts {
create = "60m"
delete = "2h"
}
}
resource "ibm_sm_secret_group"https://www.ibm.com/blog/unleashing-terraform-for-kubernetes-secret-management-with-ibm-cloud-kubernetes-service-and-secrets-manager/"sm_secret_group" {
instance_id = ibm_resource_instance.sm_instance.guid
region = ibm_resource_instance.sm_instance.location
name = var.sm_secret_group_name
description = var.sm_secret_group_description
}
2.通过IAM设置服务间授权
详细了解需要哪些配置 启用服务间通信:
resource "ibm_iam_authorization_policy"https://www.ibm.com/blog/unleashing-terraform-for-kubernetes-secret-management-with-ibm-cloud-kubernetes-service-and-secrets-manager/"sm_auth" {
source_service_name = "containers-kubernetes"
target_service_name = "secrets-manager"
roles = ["Manager"]
}
3. 将 Secrets Manager 实例注册到 IBM Cloud Kubernetes Service 集群
当你 将 Secrets Manager 实例注册到您的集群 默认情况下,所有新的 Ingress 子域证书都存储在该实例中:
resource "ibm_container_ingress_instance"https://www.ibm.com/blog/unleashing-terraform-for-kubernetes-secret-management-with-ibm-cloud-kubernetes-service-and-secrets-manager/"instance" {
cluster = var.cluster_name_or_id
secret_group_id = ibm_sm_secret_group.sm_secret_group.secret_group_id
instance_crn = ibm_resource_instance.sm_instance.id
is_default = true
}
4. 在 Secrets Manager 中创建密钥并启用自动轮换
在 Secrets Manager 中创建任意用户名凭据机密。 了解更多关于不同 秘密类型:
resource "ibm_sm_arbitrary_secret"https://www.ibm.com/blog/unleashing-terraform-for-kubernetes-secret-management-with-ibm-cloud-kubernetes-service-and-secrets-manager/"sm_arbitrary_secret" {
instance_id = ibm_resource_instance.sm_instance.guid
region = ibm_resource_instance.sm_instance.location
endpoint_type = var.sm_endpoint_type
name = var.sm_arbitrary_secret_name
description = var.sm_arbitrary_secret_description
expiration_date = var.sm_arbitrary_secret_expiration_date
labels = var.sm_arbitrary_secret_labels
secret_group_id = ibm_sm_secret_group.sm_secret_group.secret_group_id
payload = var.sm_arbitrary_secret_payload
}
resource "ibm_sm_username_password_secret"https://www.ibm.com/blog/unleashing-terraform-for-kubernetes-secret-management-with-ibm-cloud-kubernetes-service-and-secrets-manager/"sm_username_password_secret" {
instance_id = ibm_resource_instance.sm_instance.guid
region = ibm_resource_instance.sm_instance.location
endpoint_type = var.sm_endpoint_type
name = var.sm_username_password_secret_name
description = var.sm_username_password_secret_description
expiration_date = var.sm_username_password_secret_expiration_date
labels = var.sm_username_password_secret_labels
secret_group_id = ibm_sm_secret_group.sm_secret_group.secret_group_id
rotation {
auto_rotate = true
interval = 1
unit = "day"
}
username = var.sm_username_password_secret_username
password = var.sm_username_password_secret_password
}
5. 在集群中,创建一个持久的不透明密钥,该密钥由 Secrets Manager 中密钥的 CRN 支持
创建一个 入口不透明的秘密 在集群中。 现在,只要 Secrets Manager 中的密钥更新,相应的 Kubernetes 不透明密钥就会每天更新一次。 持久性字段确保如果用户无意中从集群中删除了密钥,它将被重新创建:
resource "ibm_container_ingress_secret_opaque"https://www.ibm.com/blog/unleashing-terraform-for-kubernetes-secret-management-with-ibm-cloud-kubernetes-service-and-secrets-manager/"secret_opaque" {
cluster = var.cluster_name_or_id
secret_name = var.opaque_secret_name
secret_namespace = var.opaque_secret_namespace
persistence = true
fields {
crn = ibm_sm_arbitrary_secret.sm_arbitrary_secret.crn
}
fields {
crn = ibm_sm_username_password_secret.sm_username_password_secret.crn
}
}
创建基础设施
现在您已经了解了 Terraform 脚本的每个块将执行的操作,让我们创建基础架构。
- 跑步
terraform init
在你的目录中。 - 复制
main.tf
和output.tf
示例存储库中的文件。 - 创建一个
.tfvars
文件并填写所需的相应变量。 您可以详细了解以下内容中需要哪些变量 变量.tf 文件。 - 跑步
terraform plan -var-file=<file_name>
。 - 创建资源
terraform apply -var-file=<file_name>
。
验证创建的资源
现在这些资源已创建,请进入 IBM Cloud Dashboard,在下面查看创建的资源 资源列表:
导航到创建的 IBM Cloud Secrets Manager 实例并查看创建的机密:
导航到 IBM Cloud Kubernetes Service,单击 入口,然后选择 秘密 选项卡查看不透明秘密:
联系我们
该示例作为一个起点,展示了将 Terraform 与 IBM 云 Kubernetes 服务 和 IBM 云秘密管理器。 请随意扩展和定制此方法以适合您的用例。
如果您有疑问,请通过 Slack 与我们的团队联系 在这里注册 并加入我们的 #general 频道中的讨论 公共 IBM Cloud Kubernetes 服务 Slack。