Autenticación en Azure con la entidad de servicio

En este artículo se explica cómo autenticar Terraform en Azure con una entidad de servicio.

En este artículo aprenderá a:

  • Creación de una entidad de servicio
  • Especificación de credenciales de entidad de servicio en variables de entorno
  • Especificar las credenciales de la entidad de servicio en un bloque de proveedor de Terraform.

Creación de una entidad de servicio

Si no tiene acceso a una entidad de servicio, continúe con esta sección para crear una nueva entidad de servicio. Si tiene una entidad de servicio que puede usar, vaya a la sección Especificar credenciales de entidad de servicio.

las herramientas automatizadas que usan los servicios de Azure, como Terraform, deberán tener siempre permisos restringidos. En lugar de que las aplicaciones inicien sesión como un usuario con todos los privilegios, Azure ofrece entidades de servicio.

El patrón más común es iniciar sesión de forma interactiva en Azure, crear una entidad de servicio, probarla y, luego, usarla en futuras autenticaciones (ya sea de forma interactiva o con los scripts).

  1. Para crear una entidad de servicio, inicie sesión en Azure. Después de autenticarse en Azure mediante una cuenta Microsoft, vuelva aquí.

  2. Si va a crear una entidad de servicio desde Git Bash, establezca la variable de entorno MSYS_NO_PATHCONV. (Este paso no es necesario si usa Cloud Shell).

    export MSYS_NO_PATHCONV=1    
    

    Puntos clave:

    • Puede establecer la variable de entorno MSYS_NO_PATHCONV globalmente (para todas las sesiones de terminal) o localmente (solo para la sesión actual). Como la creación de una entidad de servicio no es algo que se haga con frecuencia, en el ejemplo se establece el valor de la sesión actual. Para establecer esta variable de entorno globalmente, agregue la configuración al archivo ~/.bashrc.
  3. Para crear una entidad de servicio, ejecute az ad sp create-for-rbac.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    Puntos clave:

    • Puede reemplazar <service-principal-name> por un nombre personalizado para su entorno u omitir el parámetro por completo. Si omite el parámetro, el nombre de la entidad de seguridad de servicio se genera en función de la fecha y hora actuales.
    • Una vez finalizado correctamente, az ad sp create-for-rbac muestra varios valores. En el paso siguiente se usan los valores appId, password y tenant.
    • La contraseña no se puede recuperar si se pierde. Por lo tanto, debe almacenarla en un lugar seguro. Si olvida la contraseña, puede restablecer las credenciales de la entidad de servicio.
    • En este artículo, se usa una entidad de servicio con el rol Colaborador. Para más información sobre el control de acceso basado en rol (RBAC), consulte RBAC: roles integrados.
    • La salida de la creación de la entidad de servicio incluye credenciales confidenciales. Asegúrese de no incluirlas en el código ni en el control de código fuente.
    • Para más información sobre las opciones al crear una entidad de servicio con la CLI de Azure, consulte el artículo Creación de una entidad de servicio de Azure con la CLI de Azure.

Especificación de credenciales de entidad de servicio

Hay un par de maneras de especificar las credenciales de la entidad de servicio. Sin embargo, por motivos de seguridad, se recomienda no almacenar credenciales en el bloque de proveedor. Esa técnica solo se muestra con fines de integridad y pruebas.

Especificar las credenciales de la entidad de servicio en las variables de entorno.

Después de crear una entidad de servicio, puede especificar sus credenciales en Terraform mediante variables de entorno.

  1. Modifique el archivo ~/.bashrc agregando las siguientes variables de entorno.

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. Para ejecutar el script ~/.bashrc, ejecute source ~/.bashrc (o su equivalente abreviado, . ~/.bashrc). También puede salir y volver a abrir Cloud Shell para que el script se ejecute automáticamente.

    . ~/.bashrc
    
  3. Una vez establecidas las variables de entorno, puede comprobar sus valores de la siguiente manera:

    printenv | grep ^ARM*
    

    Puntos clave:

    • Para obtener más información sobre cómo trabajar con variables de entorno en Terraform HCL, consulte Lectura y uso de variables de entorno en ejecuciones de Terraform.
    • Al crear y aplicar planes de ejecución de Terraform se realizan cambios en la suscripción de Azure asociada a la entidad de servicio. A veces, este hecho puede resultar confuso si ha iniciado sesión en una suscripción de Azure y las variables de entorno apuntan a una segunda suscripción de Azure. Echemos un vistazo al ejemplo siguiente para explicarlo. Supongamos que tiene dos suscripciones de Azure: SubA y SubB. Si la suscripción actual de Azure es SubA (determinada a través de az account show) mientras que las variables de entorno apuntan a SubB, los cambios realizados por Terraform se encuentran en SubB. Por lo tanto, tendría que iniciar sesión en su suscripción SubB para ejecutar los comandos de la CLI de Azure o de Azure PowerShell y ver los cambios.
  4. Vaya a la sección Pasos siguientes.

Especificar las credenciales de la entidad de servicio en un bloque de proveedor de Terraform.

Precaución

La posibilidad de especificar las credenciales de suscripción de Azure en un archivo de configuración de Terraform puede resultar práctica, especialmente durante las pruebas. Sin embargo, no es aconsejable almacenar las credenciales en un archivo de texto no cifrado que puedan ver usuarios que no son de confianza.

El bloque de proveedor de Azure define la sintaxis que permite especificar la información de autenticación de la suscripción de Azure.

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

Pasos siguientes