Ссылка на секреты gitlab в Terraform - PullRequest
0 голосов
/ 30 августа 2018

Я совершенно новичок в Terraforms и gitlab CI, и я кое-что пытаюсь здесь сделать.

Я хочу использовать Terraform для создания пользователя IAM и корзины S3. Использование политик разрешает определенные операции с этим сегментом S3 этому пользователю IAM. Сохраните учетные данные пользователя IAM в артефакте. Теперь вышесказанное станет моим основным модулем.

Основной модуль выглядит примерно так:

Содержимое: aws-s3-iam-combo.git

(Учетные данные пользователя IAM, с помощью которых будет запускаться весь Terraform, скажем, admin-user , будут храниться в секретах gitlab.)

main.tf

resource "aws_s3_bucket" "bucket" {
  bucket = "${var.name}"
  acl = "private"
  force_destroy = "true"

  tags {
    environment = "${var.tag_environment}"
    team        = "${var.tag_team}"
  }

  policy =<<EOF
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "${aws_iam_user.s3.arn}"
      },
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::${var.name}",
        "arn:aws:s3:::${var.name}/*"
      ]
    }
  ]
}
EOF
}

resource "aws_iam_user" "s3" {
  name = "${var.name}-s3"
  force_destroy = "true"
}

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

resource "aws_iam_user_policy" "s3_policy" {
  name = "${var.name}-policy-s3"
  user = "${aws_iam_user.s3.name}"
  policy =<<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::${var.name}",
        "arn:aws:s3:::${var.name}/*"
      ]
    }
  ]
}
EOF
}

outputs.tf

output "bucket" {
  value = "${aws_s3_bucket.bucket.bucket}"
}

output "bucket_id" {
  value = "${aws_s3_bucket.bucket.id}"
}

output "iam_access_key_id" {
  value = "${aws_iam_access_key.s3.id}"
}

output "iam_access_key_secret" {
  value = "${aws_iam_access_key.s3.secret}"
}

variables.tf

variable "name" {
  type = "string"
}

variable "tag_team" {
  type = "string"
  default = ""
}

variable "tag_environment" {
  type = "string"
  default = ""
}

variable "versioning" {
  type = "string"
  default = false
}

variable "profile" {
  type = "string"
  default = ""
}

Любой в организации, которому теперь нужно создать S3-контейнеры, должен будет создать новое репо, что-то вроде:

main.tf

module "aws-s3-john-doe" {
  source = "git::https://git@gitlab-address/terraform/aws-s3-iam-combo.git?ref=v0.0.1"
  name = "john-doe"
  tag_team = "my_team"
  tag_environment = "staging"
}

gitlab-ci.yml

stages:
  - plan
  - apply

plan:
  image: hashicorp/terraform
  stage: plan
  script:
    - terraform init
    - terraform plan

apply:
  image: hashicorp/terraform
  stage: apply
  script:
    - terraform init
    - terraform apply
  when: manual
  only:
    - master

И тогда будет запущен конвейер, и когда это хранилище будет объединено с мастером, будут созданы ресурсы (пользователь S3 и IAM), и у пользователя будут иметь учетные данные этого пользователя IAM.

Теперь проблема в том, что у нас есть несколько учетных записей AWS. Так, скажем, если разработчик хочет создать S3 в определенной учетной записи, это было бы невозможно при вышеупомянутой настройке, так как admin-user , чьи кредиты хранятся в секретах gitlab, предназначен только для одной учетной записи ,

Теперь я не понимаю, как мне выполнить моё вышеуказанное требование. У меня есть идея ниже: (Пожалуйста, предложите, если есть лучший способ сделать это)

  1. Настройте несколько разных кредитов в секретах gitlab для каждой рассматриваемой учетной записи AWS
  2. Взять пользовательский ввод, указав в качестве переменной учетную запись AWS, для которой он хочет создать ресурсы. Так что-то вроде сказать:

main.tf

module "aws-s3-john-doe" {
  source = "git::https://git@gitlab-address/terraform/aws-s3-iam-combo.git?ref=v0.0.1"
  name = "john-doe"
  tag_team = "my_team"
  tag_environment = "staging"
  aws_account = "account1"
}
  1. А затем в aws-s3-iam-combo.git main.tf каким-то образом прочитайте кредиты для account1 из секретов gitlab.

Теперь я не знаю, как этого добиться, например, как мне прочитать из gitlab необходимую секретную переменную и т. Д.

Может кто-нибудь, пожалуйста, помогите здесь?

1 Ответ

0 голосов
/ 08 апреля 2019

Вы спрашивали об этом некоторое время назад, но, возможно, моя идея все еще помогает тому или другому ...

Вы можете сделать это с помощью envsubst (требуется, чтобы pkg gettext был установлен на вашем бегуне или в образе Docker, используемом для запуска конвейера).

Вот пример:

Во-первых, в настройках проекта вы устанавливаете различные учетные записи пользователей в качестве переменных среды (секреты проекта:

SECRET_1: my-secret-1
SECRET_2: my-secret-2
SECRET_3: my-secret-3

Затем создайте файл, содержащий переменную Terraform, назовем его vars_template.tf:

variable "gitlab_secrets" {
    description = "Variables from GitLab"
    type = "map"
    default = {
        secret_1 = "$SECRET_1"
        secret_2 = "$SECRET_2"
        secret_3 = "$SECRET_3"
    }
}

Теперь в вашем конвейере CI вы можете настроить следующее:

plan:dev:
  stage: plan dev
  script:
    - envsubst < vars_template.tf > ./vars_envsubst.tf
    - rm vars_template.tf
    - terraform init
    - terraform plan -out "planfile_dev"
  artifacts:
    paths:
      - environments/dev/planfile_dev
      - environments/dev/vars_envsubst.tf

apply:dev:
  stage: apply dev
  script:
    - cd environments/dev
    - rm vars_template.tf
    - terraform init
    - terraform apply -input=false "planfile_dev"
  dependencies:
    - plan:dev

Важно отметить, что исходный vars_template.tf должен быть удален, иначе Terraform выдаст ошибку, что переменная определена несколько раз. Вы можете обойти это, сохранив файл шаблона в каталоге, который находится за пределами рабочего каталога Terraform. Но из состояния Terraform вы можете видеть, что значения переменных там, где правильно подставлены:

"outputs": {
    "gitlab_secrets": {
        "sensitive": false,
        "type": "map",
        "value": {
            "secret_1": "my-secret-1",
            "secret_2": "my-secret-2",
            "secret_3": "my-secret-3"
        }
    }
}

Затем вы можете получить доступ к значениям с помощью "${vars.gitlab_secrets["secret_1"]}" в своих ресурсах Terraform и т. Д.

ОБНОВЛЕНИЕ: Обратите внимание, что этот метод хранит секреты в файле состояния Terraform, что может стать потенциальной проблемой безопасности, если файл хранится в корзине S3 для совместной работы с Terraform. Ведро должно быть как минимум зашифровано. Кроме того, рекомендуется ограничить доступ к файлам с помощью списков ACL, чтобы, например, только пользователь terraform имел к нему доступ. И, конечно же, пользователь может раскрыть секреты через Terraoform outputs ...

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