Armazenando dados sensíveis em código Terraform utilizando KMS

11331 단어 terraformsreawskms
Tratando-se de IaC, chegará cedo ou tarde o fatídico dia em que você terá que colocar uma senha, chave, ou qualquer outro dado sigiloso no seu código. Algumas pessoas não se preocupam muito quando estão versionando seus projetos, levando em thinkação coisas como o fato de seus repositórios serem privados, por exemplo. Entretanto, sejamos sinceros: não há lá muita garantia que o código fique só no seu repositório, não é?

A grande maioria das ferramentas hoje conta com pelo menos um mecanismo para resolver esse pequeno probleminha. 예를 들어 Ansible Vault에 포함된 Ansible. Terraform은 Vault(Hashicorp에 가입)와 통합된 예를 포함하여 다양한 유형에 포함되어 있습니다.

AWS KMS(키 관리 서비스)를 통해 AWS KMS(키 관리 서비스)를 사용할 수 있고 AWS를 서비스할 수 있고 서비스를 제공할 수 있습니다. 보라라?

KMS의 가장 중요한 문제 중 하나는 Terraform 또는 콘솔의 성능입니다. 가장 먼저 선택해야 하는 옵션은 Terraform의 다른 객체를 선택하는 데 필요한 것입니다. 데이터 원본(aws_iam_policy_document) 및 작업 리소스(aws_kms_key 및 aws_kms_alias). Abaixo uma breve descrição do papel que cada um desempenhará:

  • aws_iam_policy_document: este é o 데이터 원본 onde definiremos o documento da politica informando usuários e suas eacheverivs permissões reference às chaves e recursos dentro do KMS.

  • Detalhe: aqui nós estamos utilizando uma policy do tipo resource-based.


  • aws_kms_key: 중요한 자산입니다. Aqui informaremos o tipo da chave, se ela é simétrica ou assimétrica, se ela pode ser utilizada para criptografar ou descriptografar, assim como associar o documento criado no data source para definir uma política de acesso à ela';
  • aws_kms_alias: um alias nada mais é do que um apelido utilizado para referenciar a chave.

  • Terraform 및 Codigo Terraform:

    data "aws_iam_policy_document" "how_to_terraform_kms_pd" {
      statement {
        sid = "Enable IAM User Permissions"
        effect = "Allow"
        principals {
          type = "AWS"
          identifiers = [
            "arn:aws:iam::111111111111:root"
          ]
        }
        actions = [
          "kms:*"
        ]
        resources = [
          "*"
        ]
      }
    
      statement {
        sid = "Allow use of the key"
        effect = "Allow"
        principals {
          type = "AWS"
          identifiers = [
            "arn:aws:iam::111111111111:user/meu-usuario"
          ]
        }
        actions = [
          "kms:Encrypt",
          "kms:Decrypt",
          "kms:ReEncrypt*",
          "kms:GenerateDataKey*",
          "kms:DescribeKey"
        ]
        resources = [
          "*"
        ]
      }
    
      statement {
        sid = "Allow attachment of persistent resources"
        principals {
          type = "AWS"
          identifiers = [
            "arn:aws:iam::111111111111:user/meu-usuario"
          ]
        }
        actions = [
          "kms:CreateGrant",
          "kms:ListGrants",
          "kms:RevokeGrant"
        ]
        resources = [
          "*"
        ]
        condition {
          test = "Bool"
          variable = "kms:GrantIsForAWSResource"
          values = [
            "true"
          ]
        }
      }
    }
    
    resource "aws_kms_key" "how_to_terraform_kms" {
      description = "Teste de criptografia com KMS"
      key_usage = "ENCRYPT_DECRYPT"
      customer_master_key_spec = "SYMMETRIC_DEFAULT"
      policy = data.aws_iam_policy_document.how_to_terraform_kms_pd.json
    }
    
    resource "aws_kms_alias" "how_to_terraform_kms_alias" {
      name = "alias/how_to_terraform_kms"
      target_key_id = aws_kms_key.how_to_terraform_kms.key_id
    }
    
    output "how_to_terraform_kms_id" {
      value = aws_kms_key.how_to_terraform_kms.key_id
    }
    


    Nota: no data source how_to_terraform_kms_pd, nós definimos o account ID como 111111111111 e o usuário como meu-usuario. Ajuste esses valores para o seu caso.



    Após um terraform plan e um terraform apply os recursos já devem estar는 AWS에 대해 이야기합니다. Note que há também um output que imprime o ID da chave recém-criada e caso você opte por Consultá-lo diretamente na Console, o mesmo pode ser removido.

    Com a chave pronta para uso, agora é hora de criptografar algo. E é aí que o nosso velho amigo AWS CLI entra em cena. para isso o seguinte comando 활용:

    aws kms encrypt --key-id ${key_id} \ 
      --plaintext ${texto_a_ser_criptografado} \
      --output text \
      --query CiphertextBlob
    


    Nota: não se esqueça que você deve ter exportado as variáveis como AWS_SECRET_ACCESS_KEY e AWS_ACCESS_KEY_ID corretamente no seu terminal para acessar sua conta.



    Se tudo der certo, o valor criptografado deve aparecer na tela.

    Neste momento você deve estar se perguntando "OK, mas o propósito não era esconder as coisas no código do Terraform?". Estamos chegando 라. Este valor criptografado que nós geramos utilizando o AWS CLI pod ser resgatado dentro do próprio Terraform, que Consulta o o KMS durante sua execução utilizando o data source aws_kms_secrets da seguinte forma:

    data "aws_kms_secrets" "teste_kms" {
      secret {
        name = "valor_resgatado"
        payload = "AQICAHhAVXI4s1jnWVzWUxKnuk9yI2/aDoEQu8vyYkhh0tUC2QEMKXf54sQFje6ImNjDyraEAAAAcjBwBgkqhkiG9w0BBwagYzBhAgEAMFwGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMoKPEjuATAOXqrzraAgEQgC9Kwf2DiUTxrDy0g8kggiLc+bhWhuYLDQaB/DhsMxyV9pD6ROsT/boZztyJFD30oQ=="
      }
    }
    
    output "valor_resgatado" {
      value = data.aws_kms_secrets.teste_kms.plaintext["valor_resgatado"]
    }
    


    Dentro do bloco secret do data source você deve dar um nome único para referencenciá-lo eo seu valor criptográfico. 차브를 알리는 것이 필요하지 않은 경우 페이로드를 계속 사용할 수 없습니다. 메모를 사용하여 비밀 번호를 참조할 수 있습니다data.aws_kms_secrets.teste_kms.plaintext["valor_resgatado"] . Você pode incluir quantos blocossecret quiser dentro do 데이터 소스.

    참조


  • Storing secrets in terraform codebase with KMS
  • 좋은 웹페이지 즐겨찾기