Обновление пароля принципа обслуживания с помощью Terraform - PullRequest
1 голос
/ 02 апреля 2019

Обновление пароля принципов обслуживания с помощью Terraform в зависимости от того, когда он истекает

Настройка принципа обслуживания с помощью пароля в первый раз работает отлично, однако, я хочу, чтобы срок действия пароля истек, и если срок действия пароля истекает, генерируется новый и обновляет принцип обслуживания с ним, я не Я абсолютно уверен, как делать условия в Terraform, так как я все еще довольно новичок в Terraform, документы не говорят об обновлении принципа обслуживания, только создавая его, и нет никакого объекта данных для извлечения, когда срок его действия истекает

Пока у меня есть это (полное раскрытие, это часть большей терраформной базы, с которой я помогаю):

resource "azuread_application" "current" {
  name = "test"
}

resource "azuread_service_principal" "current" {
  application_id = "${azuread_application.current.application_id}"
}

resource "random_string" "password" {
  length  = 64
  special = true
}

resource "azuread_service_principal_password" "current" {
  service_principal_id = "${azuread_service_principal.current.id}"
  value                = "${random_string.password.result}"
  end_date_relative    = "2160h"   # valid for 90 days
}

Поскольку пароль действителен только в течение 90 дней, я хочу запустить terraform apply непосредственно перед его истечением и обновить пароль

Обновление 1:

Похоже, что если вы действительно измените ресурс azuread_service_principal_password, это будет считаться изменением в дереве зависимостей и воссоздает ресурс, к которому вы прикрепили принцип обслуживания, что означает, что нет способа сохранить состояние в учетные данные принципов обслуживания в Terraform, если они должны быть обновлены

Обновление 2:

Я пытался сделать следующее, однако недостатком этого является то, что он запускается каждый раз, когда вы запускаете terraform apply:

скрипт terraform:

resource "azuread_application" "current" {
  name = "${var.metadata_name}"
}

resource "azuread_service_principal" "current" {
  application_id = "${azuread_application.current.application_id}"
}
resource "random_string" "password" {
  length  = 64
  special = true
}

resource "azuread_service_principal_password" "current" {
  service_principal_id = "${azuread_service_principal.current.id}"
  value                = "${random_string.password.result}"
  end_date_relative    = "2160h"                                   # valid for 90 days
}


resource "null_resource" "password_updater" {
  # Updates everytime you run terraform apply so it will run this script everytime
  triggers {
    timestamp = "${timestamp()}"
  }

  provisioner "local-exec" {
    command = "sh ${path.module}/update_service_password.sh ${azuread_service_principal.current.id} ${var.resource_group} ${azurerm_kubernetes_cluster.current.name}"
  }
}

сценарий:

#!/bin/sh
service_principle_id=$1
resource_group=$2
cluster_name=$3

# get service password expiration
expiration=$(az ad sp list --filter="objectId eq '$service_principle_id'" | jq '.[].passwordCredentials' | jq '.[].endDate' | cut -d'T' -f 1 | cut -d'"' -f 2)

# Format date for condition
now=$(date  +%Y%m%d%H%M%S)
expiration_date=$(date -d "$expiration - 30 days"  +%Y%m%d%H%M%S)


# Compare today with expiration date
if [ ${now} -ge ${expiration_date} ];
then
    # IF expiration date in the next 30 days rest password
    sp_id=$(az aks show -g ${resource_group} -n ${cluster_name} --query servicePrincipalProfile.clientId -o tsv)
    service_principle_secret=$(az ad sp credential reset --name ${sp_id} --end-date $(date -d "+ 90 days"  +%Y-%m-%d) --query password -o tsv)

    # Update cluster with new password
    az aks update-credentials \
    --resource-group ${resource_group} \
    --name ${cluster_name} \
    --reset-service-principal \
    --service-principal ${sp_id} \
    --client-secret ${service_principle_secret}
fi

Ответы [ 2 ]

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

Я просто собираюсь установить это как Ответ, так как после разговора с разработчиками модуля terraform принципа обслуживания они сказали мне, что это невозможно каким-либо другим способом, если найден лучший способ, пожалуйста, прокомментируйте:

Ответ:

Используйте поставщика null_resource для запуска скрипта, запускающего обновление -

resource "azuread_application" "current" {
  name = "${var.metadata_name}"
}

resource "azuread_service_principal" "current" {
  application_id = "${azuread_application.current.application_id}"
}
resource "random_string" "password" {
  length  = 64
  special = true
}

resource "azuread_service_principal_password" "current" {
  service_principal_id = "${azuread_service_principal.current.id}"
  value                = "${random_string.password.result}"
  end_date_relative    = "2160h"                                   # valid for 90 days
}


resource "null_resource" "password_updater" {
  # Updates everytime you run terraform apply so it will run this script everytime
  triggers {
    timestamp = "${timestamp()}"
  }

  provisioner "local-exec" {
    command = "sh ${path.module}/update_service_password.sh ${azuread_service_principal.current.id} ${var.resource_group} ${azurerm_kubernetes_cluster.current.name}"
  }
}

сценарий:

#!/bin/sh
service_principle_id=$1
resource_group=$2
cluster_name=$3

# get service password expiration
expiration=$(az ad sp list --filter="objectId eq '$service_principle_id'" | jq '.[].passwordCredentials' | jq '.[].endDate' | cut -d'T' -f 1 | cut -d'"' -f 2)

# Format date for condition
now=$(date  +%Y%m%d%H%M%S)
expiration_date=$(date -d "$expiration - 30 days"  +%Y%m%d%H%M%S)


# Compare today with expiration date
if [ ${now} -ge ${expiration_date} ];
then
    # IF expiration date in the next 30 days rest password
    sp_id=$(az aks show -g ${resource_group} -n ${cluster_name} --query servicePrincipalProfile.clientId -o tsv)
    service_principle_secret=$(az ad sp credential reset --name ${sp_id} --end-date $(date -d "+ 90 days"  +%Y-%m-%d) --query password -o tsv)

    # Update cluster with new password
    az aks update-credentials \
    --resource-group ${resource_group} \
    --name ${cluster_name} \
    --reset-service-principal \
    --service-principal ${sp_id} \
    --client-secret ${service_principle_secret}
fi
0 голосов
/ 02 апреля 2019

Для субъекта службы его пароль можно сбросить с помощью интерфейса командной строки Azure az ad sp reset, но для этого необходимо разрешение.

...