Как скрыть учетные данные AWS от внешней программы? - PullRequest
1 голос
/ 19 октября 2019

В моем случае я пытаюсь скрыть ключи доступа aws и секретные ключи доступа, которые печатаются через выходные данные.

Я пытался реализовать решение, но, к сожалению, оно печатало учетные данные в плане. Поэтому всякий раз, когда я отправляю код / ​​коммит в GITHUB, у нас запускается terraform в Jenkins, он выкладывает план в GITHUB, выставляя учетные данные в плане terraform.

Хотя я скрыл в выходных данных, но теперь я печатаю его в планеи разоблачение в GitHub. Я также попытался использовать sensitive:true в выходах, которые легко решат эту проблему. Но моя команда хочет реализовать это решение: (

resource "aws_iam_access_key" "key" {
  user = "${aws_iam_user.user.name}"
}

resource "null_resource" "access_key_shell" {
  triggers = {
    aws_user = "${aws_iam_user.user.name}" // triggering an alert on the user, since if we pass aws_iam_access_key, access key is visible in plan.
  }
}

data "external" "stdout" {
  depends_on = ["null_resource.access_key_shell"]
  program    = ["sh", "${path.module}/read.sh"]

  query {
    access_id = "${aws_iam_access_key.key.id}"
    secret_id = "${aws_iam_access_key.key.secret}"
  }
}

resource "null_resource" "contents_access" {
  triggers = {
    stdout = "${lookup(data.external.logstash_stdout.result, "access_key")}"
    value  = "${aws_iam_access_key.key.id}"
  }
}

output "aws_iam_podcast_logstash_access_key" {
  value = "${chomp(null_resource.contents_access.triggers["stdout"])}"
}

read.sh

#!/bin/bash
set -eux
echo {\"access_key\":\"$(aws kms encrypt --key-id alias/amp_key --plaintext ${access_id}  --output text --query CiphertextBlob)\", > sample.json && echo \"secret_key\": \"$(aws kms encrypt --key-id alias/amp_key --plaintext ${secret_id} --output text --query CiphertextBlob)\"} >> sample.json
cat sample.json | jq -r '.access_key'
cat sample.json | jq -r '.secret_key'

Мой план terraform:

<= data.external.stdout
      id:                <computed>
      program.#:         "2"
      program.0:         "sh"
      program.1:         "/Users/xxxx/projects/tf_iam_stage/read.sh"
      query.%:           "2"
      query.access_id:   "xxxxxxxx"  ----> I want to hide these values from the plan
      query.secret_id:   "xxxxxxxxxxxxxxxxxxxxxx/x" ----> I want to hide these values from the plan
      result.%:          <computed>

Любая помощь! Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Здесь происходит несколько вещей.

Во-первых, вы теряете свои учетные данные, потому что храните свой .tfstate в GitHub. У этого есть простое решение. Во-первых, добавьте *.tfstate к вашему .gitignore, затем установите удаленный бэкэнд, и, если вы используете S3, тогда извлекайте политики и ACL для предотвращения публичного доступа.

Во-вторых, ваша другая проблема заключается в том, что вы выбираетеучетные данные во время выполнения и во время выполнения Terraform отображает все, если вы не добавите чувствительный флаг. Таким образом, в основном, если вы хотите следовать этому подходу, вы вынуждены использовать sensitive: true, независимо от того, что говорит ваша команда. Однако зачем получать учетные данные таким образом? Почему бы вам не добавить нового провайдера с этими учетными данными, установить псевдоним для этого провайдера и просто использовать его для ресурсов, в которых находятся эти ключи?

0 голосов
/ 19 октября 2019

в вашем сценарии вам будет хорошо, если вы будете использовать: Remote State подход.

Remote State позволяет Terraform сохранять состояние в удаленном хранилище. Terraform поддерживает сохранение состояния в таких местах, как Terraform Enterprise, Consul, S3 и т. Д.

Настройка заключается в создании корзины на AWS S3, она не должна быть доступна для чтения или записи кем-либо, кроме пользователя, который будетиспользование для Terraform.

Код, который я добавил, был;

 terraform {
    backend "s3" {
      bucket = "my-new-bucket"
      key = "state/key"
      region = "eu-west-1"
    }
  }

Это просто говорит Terraform использовать S3 в качестве бэкэнд-провайдера для таких вещей, как хранение tfstate файлов.

Не забудьте запустить terraform init, потому что это требование, Terraform заметит, что вы перешли от локального хранения к хранению в S3.

Как только это будет сделано, вы можете удалить локальные файлы tfstate безопасноНасколько вам известно, ваши данные были надежно сохранены на S3.

Вот несколько полезных документов: Нажмите документы

Второй подход заключается в использовании Terraform plugin подробнеездесь: Плагин Terraform

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...