Use o Terraform para criar e gerenciar segredos. Este tópico apresenta um exemplo de criação de segredo.
Visão geral
O Key Management Service (KMS) usa uma chave específica para criptografar e proteger segredos. Portanto, crie uma chave antes de criar um segredo. Para obter mais informações sobre segredos, consulte Visão geral do gerenciamento de segredos.
Execute o código de exemplo deste tópico com um único clique em. Executar o código
Notas de uso
-
Uma conta Alibaba Cloud tem permissões totais sobre todos os recursos. Se as credenciais dessa conta forem comprometidas, seus recursos ficarão expostos a altos riscos de segurança. Como prática recomendada de segurança, crie um usuário do Resource Access Management (RAM) e um par de AccessKey para esse usuário. Para mais detalhes, consulte Criar um usuário RAM e Criar um AccessKey.
-
Conceda ao usuário RAM as seguintes permissões: AliyunKMSFullAccess (para gerenciar o Key Management Service) e AliyunRAMFullAccess (para gerenciar o Resource Access Management). Para mais informações, consulte Gerenciar permissões de usuários RAM.
{ "Version": "1", "Statement": [ { "Action": "kms:*", "Resource": "*", "Effect": "Allow" }, { "Action": "ram:CreateServiceLinkedRole", "Condition": { "StringEquals": { "ram:ServiceName": [ "secretsmanager-rds.kms.aliyuncs.com", "keystore.kms.aliyuncs.com" ] } }, "Resource": "*", "Effect": "Allow" } ] } -
Prepare um ambiente Terraform. Use o Terraform de uma das seguintes formas:
Use o Terraform no Terraform Explorer: A Alibaba Cloud oferece um ambiente online para o Terraform, sem necessidade de instalação local. Após fazer login, use e teste o Terraform diretamente no navegador. Essa opção é ideal para testes e depurações rápidos, práticos e sem custo.
Criar recursos com o Terraform: Os componentes do Terraform vêm pré-instalados no Cloud Shell da Alibaba Cloud, com credenciais de identidade configuradas. Execute comandos do Terraform diretamente no Cloud Shell. Essa abordagem é recomendada para quem busca acesso rápido, prático e de baixo custo ao Terraform.
Instalar e configurar o Terraform no seu computador: Esta alternativa é indicada para cenários com conectividade de rede limitada ou quando é necessário um ambiente de desenvolvimento personalizado.
A versão do Terraform deve ser v0.12.28 ou superior. Para verificar a versão instalada, execute o comando terraform --version.
Recursos utilizados
alicloud_kms_secret: Cria e gerencia segredos.
alicloud_vpc: Cria uma Virtual Private Cloud (VPC).
alicloud_vswitch: Cria um vSwitch para dividir uma VPC em uma ou mais sub-redes.
alicloud_kms_instance: Adquire e ativa uma instância de gerenciamento de chaves por software.
alicloud_kms_key: Cria e gerencia chaves.
alicloud_kms_alias: Cria e gerencia aliases.
Criar um segredo usando o Terraform
Defina sensitive = true para secret_data (o valor do segredo) para evitar que valores sensíveis sejam impressos nos logs ou no console. Para mais informações, consulte Proteger variáveis de entrada sensíveis.
Este exemplo demonstra como criar um segredo genérico.
-
Crie um diretório de trabalho e, dentro dele, um arquivo de configuração chamado
main.tf.-
Adicione o conteúdo abaixo ao arquivo
main.tf. Antes de prosseguir, certifique-se de ter criado uma instância do KMS e uma chave:ImportanteA chave usada para criptografar o valor do segredo deve ser simétrica.
Crie uma instância do KMS:
variable "region" { default = "cn-heyuan" } provider "alicloud" { region = var.region } variable "instance_name" { default = "tf-kms-vpc-172-16" } # Create a VPC. resource "alicloud_vpc" "vpc" { vpc_name = var.instance_name cidr_block = "192.168.0.0/16" } # Create a vSwitch with the CIDR block 192.168.10.0/24. resource "alicloud_vswitch" "vsw" { vpc_id = alicloud_vpc.vpc.id cidr_block = "192.168.10.0/24" zone_id = "cn-heyuan-a" vswitch_name = "terraform-example-1" } # Create another vSwitch with the CIDR block 192.168.20.0/24. resource "alicloud_vswitch" "vsw1" { vpc_id = alicloud_vpc.vpc.id cidr_block = "192.168.20.0/24" zone_id = "cn-heyuan-b" vswitch_name = "terraform-example-2" } # Create a software key management instance and start it with network parameters. resource "alicloud_kms_instance" "default" { # Software key management instance. product_version = "3" vpc_id = alicloud_vpc.vpc.id # Specify the zones for the KMS instance. Use the zone IDs obtained earlier. zone_ids = [ "cn-heyuan-a", "cn-heyuan-b", ] # vSwitch IDs. vswitch_ids = [ alicloud_vswitch.vsw.id,alicloud_vswitch.vsw1.id ] # Computing performance, number of keys, number of secrets, and number of access management operations. vpc_num = "1" key_num = "1000" secret_num = "100" spec = "1000" # Optional: Associate other VPCs with the KMS instance. # If the VPC and the KMS instance's VPC belong to different Alibaba Cloud accounts, you must first share the vSwitch. #bind_vpcs { #vpc_id = "vpc-j6cy0l32yz9ttxfy6****" #vswitch_id = "vsw-j6cv7rd1nz8x13ram****" #region_id = "cn-shanghai" #vpc_owner_id = "119285303511****" #} #bind_vpcs { #vpc_id = "vpc-j6cy0l32yz9ttd7g3****" #vswitch_id = "vsw-3h4yrd1nz8x13ram****" #region_id = "cn-shanghai" #vpc_owner_id = "119285303511****" #} } # Save the CA certificate of the KMS instance to a local file. resource "local_file" "ca_certificate_chain_pem" { content = alicloud_kms_instance.default.ca_certificate_chain_pem filename = "ca.pem" }Crie uma chave na instância do KMS:
# The key has a specification of Aliyun_AES_256 and is used for encryption and decryption (ENCRYPT/DECRYPT). resource "alicloud_kms_key" "kms_software_key_encrypt_decrypt" { description = "default_key_encrypt_decrypt description" # The usage of the key. Default: ENCRYPT/DECRYPT. Valid value: ENCRYPT/DECRYPT, which indicates that the key is used to encrypt or decrypt data. key_usage = "ENCRYPT/DECRYPT" # The specification of the key. Default: Aliyun_AES_256. key_spec = "Aliyun_AES_256" # The ID of the KMS instance. dkms_instance_id = alicloud_kms_instance.default.id pending_window_in_days = 7 # Optional: The map of tags to assign to the resource. # tags = { # "Environment" = "Production" # "Name" = "KMS-01" # "SupportTeam" = "PlatformEngineering" # "Contact" = "ali***@test.com" # } } # The key alias is alias/kms_software_key_encrypt_decrypt, which must be unique within the Alibaba Cloud account. resource "alicloud_kms_alias" "kms_software_key_encrypt_decrypt_alias" { # Alias. alias_name = "alias/kms_software_key_encrypt_decrypt" # Key ID. key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id } -
Adicione o seguinte conteúdo ao arquivo
main.tfpara criar um segredo.-
Segredo genérico
# Create a generic secret named kms_secret_general1 with the value secret_data_kms_secret_general1. resource "alicloud_kms_secret" "kms_secret_general" { # Name. secret_name = "kms_secret_general1" # Description. description = "secret_data_kms_secret_general" # Type. secret_type = "Generic" # Specifies whether to immediately delete the secret. Default: false. Valid values: true, false. force_delete_without_recovery = true # The ID of the KMS instance. dkms_instance_id = alicloud_kms_instance.default.id # The ID of the KMS key. encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id # Version ID. version_id = "v1" # The type of the value. Default: text. Valid values: text, binary. secret_data_type = "text" # Data. secret_data = "secret_data_kms_secret_general1" } -
Credenciais RAM
# Example of creating a RAM secret. # Before you start, create a RAM user and an AccessKey for which you want to create a managed RAM secret. # This process consists of two steps. # Step 1: Grant KMS the permissions to manage the AccessKey of the RAM user. # 1.1 Create a custom policy named AliyunKMSManagedRAMCrendentialsRolePolicy. resource "alicloud_ram_policy" "AliyunKMSManagedRAMCrendentialsRolePolicy" { policy_name = "AliyunKMSManagedRAMCrendentialsRolePolicy" policy_document = <<EOF { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ram:ListAccessKeys", "ram:CreateAccessKey", "ram:DeleteAccessKey", "ram:UpdateAccessKey" ], "Resource": "*" } ] } EOF description = "AliyunKMSManagedRAMCrendentialsRolePolicy" force = true } # 1.2 Create a RAM role named AliyunKMSManagedRAMCrendentialsRole. resource "alicloud_ram_role" "AliyunKMSManagedRAMCrendentialsRole" { name = "AliyunKMSManagedRAMCrendentialsRole" description = "AliyunKMSManagedRAMCrendentialsRole" document = <<EOF { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "kms.aliyuncs.com" ] } } ], "Version": "1" } EOF force = true } # 1.3 Attach the AliyunKMSManagedRAMCrendentialsRolePolicy policy to the AliyunKMSManagedRAMCrendentialsRole role. resource "alicloud_ram_role_policy_attachment" "attach" { policy_name = alicloud_ram_policy.AliyunKMSManagedRAMCrendentialsRolePolicy.policy_name policy_type = alicloud_ram_policy.AliyunKMSManagedRAMCrendentialsRolePolicy.type role_name = alicloud_ram_role.AliyunKMSManagedRAMCrendentialsRole.name } # Step 2: Create the RAM secret. resource "alicloud_kms_secret" "kms_secret_RAMCredentials" { # The name of the secret. secret_name = "my_secret" # The description. description = "secret_kms_secret_RAMCredentials" # The type of the secret. secret_type = "RAMCredentials" # The ID of the KMS instance. dkms_instance_id = alicloud_kms_instance.default.id # The ID of the key used to encrypt the secret value. encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id # Specifies whether to immediately delete the secret. Default: false. Valid values: true, false. force_delete_without_recovery = true # Specifies whether to enable automatic rotation. Default: false. Valid values: true, false. enable_automatic_rotation = true # The interval for automatic rotation. rotation_interval = "7d" # The extended configuration. Replace the value of UserName with your username. extended_config = "{\"SecretSubType\":\"RamUserAccessKey\", \"UserName\":\"testuser\"}" # Version. version_id = "V1" # The type of the secret value. Default: text. Valid values: text, binary. secret_data_type ="text" # Data. secret_data = "{\"AccessKeys\":[{\"AccessKeyId\":\"LTAI****************\",\"AccessKeySecret\":\"yourAccessKeySecret\"}]}" } -
Segredo RDS
Este exemplo mostra como criar um segredo RDS no modo de hospedagem de conta dupla.
variable "region" { default = "cn-hangzhou" } provider "alicloud" { region = var.region } variable "zone_id" { default = "cn-hangzhou-b" } variable "instance_type" { default = "pg.n2.2c.2m" } # Create a VPC. resource "alicloud_vpc" "main" { vpc_name = "alicloud" cidr_block = "172.16.0.0/16" } # Create a vSwitch. resource "alicloud_vswitch" "main" { vpc_id = alicloud_vpc.main.id cidr_block = "172.16.192.0/20" zone_id = var.zone_id depends_on = [alicloud_vpc.main] } # Create an ApsaraDB RDS for PostgreSQL instance. resource "alicloud_db_instance" "instance" { engine = "PostgreSQL" engine_version = "13.0" instance_type = var.instance_type instance_storage = "30" instance_charge_type = "Postpaid" vswitch_id = alicloud_vswitch.main.id } # Create an RDS secret. resource "alicloud_kms_secret" "kms_secret_RDS_MYSQL" { # The name of the secret. secret_name = "rds_secret/${alicloud_db_instance.instance.id}" # Type. secret_type = "Rds" # The ID of the KMS instance. dkms_instance_id = alicloud_kms_instance.default.id # The ID of the key used to encrypt the secret value. encryption_key_id = alicloud_kms_key.kms_software_key_encrypt_decrypt.id # Specifies whether to enable automatic rotation. Default: false. Valid values: true, false. enable_automatic_rotation = true # The interval for automatic rotation. rotation_interval = "7d" # Specifies whether to immediately delete the secret. Default: false. Valid values: true, false. force_delete_without_recovery = true # Configuration. extended_config = "{\"SecretSubType\":\"DoubleUsers\", \"DBInstanceId\":\"rm-7xv1450tq4pj4****\" ,\"CustomData\": {}}" # Version. version_id = "V1" # The type of the secret value. Default: text. Valid values: text, binary. secret_data_type = "text" # Data. secret_data = "{\"Accounts\":[{\"AccountName\":\"rdsuser1\",\"AccountPassword\":\"Admin****\"},{\"AccountName\":\"rdsuser2\",\"AccountPassword\":\"Admin****\"}]}" }
-
-
-
Execute o comando a seguir para inicializar o ambiente Terraform.
terraform initTerraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary. -
Crie um plano de execução e visualize as alterações.
terraform plan -
Execute o comando abaixo para criar o segredo genérico.
terraform applyQuando solicitado, insira
yese pressione Enter. Aguarde a conclusão do comando. Se a saída abaixo for retornada, o segredo genérico foi criado com sucesso.Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes ... alicloud_kms_key.kms_software_key_encrypt_decrypt: Creation complete after 0s [id=key-shh6715c21812y8i7z***] alicloud_kms_alias.kms_software_key_encrypt_decrypt_alias: Creating... alicloud_kms_secret.kms_secret_general: Creating... alicloud_kms_alias.kms_software_key_encrypt_decrypt_alias: Creation complete after 0s [id=alias/kms_secret] alicloud_kms_secret.kms_secret_general: Creation complete after 1s [id=kms_secret_general1] ... Apply complete! Resources: 2 added, 0 changed, 0 destroyed. -
Verifique os resultados.
Executar o comando terraform show
Execute o comando a seguir para consultar os detalhes dos recursos criados com o Terraform:
terraform show
Fazer login no console do Key Management Service
Acesse o console do Key Management Service para visualizar o segredo criado.
Limpar recursos
Se não precisar mais dos recursos criados ou gerenciados pelo Terraform, execute o comando a seguir para liberá-los. Para mais detalhes sobre o comando terraform destroy, consulte Comandos comuns.
terraform destroy
Exemplo completo
O código de exemplo deste tópico permite execução com um clique em. Execute-o diretamente. Executar o código