Configurar cuentas de servicio especificadas por los usuarios

Para seguir el principio de mínimos accesos en Cloud Build, puedes configurar Cloud Build para que use una cuenta de servicio con los privilegios suficientes para ejecutar una compilación. En esta página se explica cómo configurar una cuenta de servicio.

Si no especificas una cuenta de servicio, Cloud Build puede seleccionar automáticamente una cuenta de servicio para ejecutar compilaciones por ti. Esta cuenta de servicio puede tener permisos innecesariamente amplios para tu caso de uso, como acceso a tus repositorios de Cloud Source y a cualquier segmento de Cloud Storage de tu proyecto.

Para mejorar la seguridad de tus proyectos y reducir el posible impacto de las configuraciones incorrectas o de los usuarios malintencionados, te recomendamos que sigas el principio de privilegio mínimo. Si adoptas este principio, puedes asignar a cada cuenta de servicio los permisos y roles que se ajusten a la tarea que realiza. Por ejemplo, puedes usar una cuenta de servicio para crear y enviar imágenes a Artifact Registry, como se muestra en el blog deGoogle Cloud .

Antes de empezar

  • Enable the Cloud Build and IAM APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  • Si tienes previsto usar esta cuenta para crear y gestionar credenciales (por ejemplo, para crear credenciales de corta duración), habilita la API IAM Service Account Credentials.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  • Crea una cuenta de servicio si aún no lo has hecho.

Conceder permisos de gestión de identidades y accesos

Para permitir que tu compilación acceda a los servicios a los que necesita conectarse, debes conceder algunos roles y permisos:

  1. Abre la página Configuración de Cloud Build:

    Abre la página Configuración de Cloud Build

    Verás la pestaña Permisos de cuenta de servicio:

    Captura de pantalla de la página Permisos de cuenta de servicio

  2. En la lista desplegable, selecciona la cuenta de servicio cuyos roles quieras cambiar.

  3. Cambia el estado del rol que quieras añadir a Habilitar.

  4. Si el rol que necesitas para tu canalización de compilación no aparece en esta lista, puedes conceder roles adicionales en la página de configuraciones de gestión de identidades y accesos.

Puedes consultar más información sobre los roles que se suelen necesitar para una compilación en Configurar el acceso a los recursos de Cloud Build y en la lista completa de roles y permisos de gestión de identidades y accesos de Cloud Build.

Configurar registros de compilación

Cuando especifiques tu propia cuenta de servicio para las compilaciones, deberás almacenar los registros de compilación en Cloud Logging o en un segmento de Cloud Storage creado por el usuario. No puedes almacenar tus registros en el segmento de registros predeterminado.

Ejecutar una compilación con un archivo de configuración

Para ejecutar manualmente una compilación con un archivo de configuración, sigue estos pasos:

  1. En el directorio raíz de tu proyecto, crea un archivo de configuración de compilación de Cloud Build llamado cloudbuild.yaml o cloudbuild.json.

  2. Añade el campo serviceAccount y la configuración de registro que prefieras.

    • Si almacenas los registros de compilación en Cloud Logging, añade un campo logging y asigna el valor CLOUD_LOGGING_ONLY al campo.

    • Si almacenas los registros de compilación en un segmento de Cloud Storage creado por el usuario, haz lo siguiente:

      • Añade un campo logging y asigna el valor GCS_ONLY.
      • Añade un campo logsBucket y asigna a su valor la ubicación de tu segmento de Cloud Storage.

    En el siguiente ejemplo se configura Cloud Build para que ejecute compilaciones con una cuenta de servicio especificada por el usuario y se configuran los registros de compilación para que se almacenen en un segmento de Cloud Storage creado por el usuario:

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    serviceAccount: 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "serviceAccount": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    
    

    Sustituye los valores de marcador de posición del archivo de configuración de compilación por los siguientes:

    • LOGS_BUCKET_LOCATION es el segmento de Cloud Storage para almacenar los registros de compilación. Por ejemplo, gs://mylogsbucket.
    • PROJECT_ID es el ID del Google Cloud proyecto en el que estás ejecutando la compilación.
    • SERVICE_ACCOUNT es la dirección de correo o el ID único de la cuenta de servicio que quieres especificar para las compilaciones. Por ejemplo, una dirección de correo de cuenta de servicio tiene este formato: service-account-name@project-id.iam.gserviceaccount.com.
  3. Inicia la compilación con el archivo de configuración de compilación:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    Sustituye los valores de los marcadores de posición de los comandos anteriores por los siguientes:

    • CONFIG_FILE_PATH es la ruta al archivo de configuración de compilación.
    • SOURCE_DIRECTORY es la ruta o la URL del código fuente.

    Si no especificas CONFIG_FILE_PATH y SOURCE_DIRECTORY en el comando gcloud builds submit, Cloud Build asume que el archivo de configuración de la compilación y el código fuente se encuentran en el directorio de trabajo actual.

Ejecutar compilaciones con activadores

Para ejecutar una compilación con activadores de Cloud Build usando tu propia cuenta de servicio, configura la opción de registro que prefieras y selecciona la cuenta de servicio que quieras al crear el activador.

  1. En el archivo de configuración de compilación:

    • Si almacenas los registros de compilación en Cloud Logging, añade un campo logging y asigna el valor CLOUD_LOGGING_ONLY al campo.

    • Si almacenas los registros de compilación en un segmento de Cloud Storage creado por el usuario, haz lo siguiente:

      • Añade un campo logging y asigna el valor GCS_ONLY.
      • Añade un campo logsBucket y asigna a su valor la ubicación de tu segmento de Cloud Storage.

    En el siguiente ejemplo se configura el almacenamiento de los registros de compilación en un segmento de Cloud Storage creado por el usuario:

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    

    Sustituye LOGS_BUCKET_LOCATION por el segmento de Cloud Storage en el que se almacenarán los registros de compilación. Por ejemplo, gs://mylogsbucket.

  2. Especifica una cuenta de servicio que se usará con el activador de compilación:

    Consola

    Para ejecutar compilaciones mediante la página Activador de la consola, la cuenta de servicio especificada por el usuario debe estar en el mismo proyecto que el activador de compilación. Google Cloud Para usar activadores con cuentas de servicio entre proyectos, crea el activador de compilación con la herramienta gcloud.

    1. Crea o edita tu activador de compilación.

    2. En el campo Cuenta de servicio, especifica tu cuenta de servicio. Si no especificas ninguna cuenta de servicio, Cloud Build usará la cuenta de servicio predeterminada.

    3. Haz clic en Crear para guardar el activador de compilación.

    gcloud

    Cuando crees un activador de compilación, especifica tu cuenta de servicio con la marca --service-account. En el siguiente ejemplo, el comando gcloud crea un activador de compilación que extrae código de un repositorio de Git:

    gcloud builds triggers create github \
       --name=TRIGGER_NAME \
       --repo-name=REPO_NAME \
       --repo-owner=REPO_OWNER \
       --branch-pattern=BRANCH_PATTERN
       --build-config=BUILD_CONFIG_FILE
       --service-account=SERVICE_ACCOUNT
       --project=BUILD_PROJECT
    

    Sustituye los valores de marcador de posición del archivo de configuración de compilación por los siguientes:

    • TRIGGER_NAME es el nombre del activador de compilación.
    • REPO_NAME es el nombre de tu repositorio.
    • REPO_OWNER es el nombre de usuario del propietario del repositorio.
    • BRANCH_PATTERN es el nombre de la rama de tu repositorio en la que se invoca la compilación.
    • TAG_PATTERN es el nombre de la etiqueta de tu repositorio para invocar la compilación.
    • BUILD_CONFIG_FILE es la ruta a tu archivo de configuración de compilación.
    • SERVICE_ACCOUNT es tu cuenta de servicio con el formato /projects/PROJECT_ID/serviceAccounts/ACCOUNT_ID_OR_EMAIL.
    • BUILD_PROJECT es el proyecto en el que vas a iniciar las compilaciones.

Configuración entre proyectos

Solo puedes usar una cuenta de servicio especificada por el usuario para ejecutar compilaciones en un proyecto que sea diferente del proyecto en el que creaste la cuenta de servicio si no se aplica la restricción de la política de organización iam.disableCrossProjectServiceAccountUsage. Esta restricción se aplica de forma predeterminada.

  • El siguiente comando inhabilita la aplicación de esa restricción y concede el acceso necesario. Tu organización debe conocer las ventajas y desventajas de seguridad antes de definir la restricción en su política:

    gcloud resource-manager org-policies disable-enforce \
       iam.disableCrossProjectServiceAccountUsage \
       --project=SERVICE_ACCOUNT_PROJECT_ID
    

    En este comando, SERVICE_ACCOUNT_PROJECT_ID es el proyecto que contiene la cuenta de servicio especificada por el usuario.

  • En el proyecto que tenga la cuenta de servicio especificada por el usuario, asigna el rol roles/iam.serviceAccountTokenCreator al agente de servicio de Cloud Build del proyecto en el que estés ejecutando compilaciones:

    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member="serviceAccount:BUILD_SERVICE_AGENT" \
        --role="roles/iam.serviceAccountTokenCreator"
    

    Sustituye los valores de marcador de posición del comando por los siguientes:

    • SERVICE_ACCOUNT_PROJECT_ID: el ID del proyecto que contiene la cuenta de servicio que has especificado.
    • BUILD_SERVICE_AGENT: el ID de correo del agente de servicio con el formato service-BUILD_PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com, donde BUILD_PROJECT_NUMBER es el número del proyecto en el que estás ejecutando compilaciones. Puedes obtener el número de proyecto en la página de configuración del proyecto.

Limitaciones:

  • Tu Google Cloud proyecto debe estar en una Google Cloud organización.

  • Debes iniciar las compilaciones en la línea de comandos con gcloud builds submit o gcloud builds triggers create. Para usar la página Activadores en la Google Cloud consola, la cuenta de servicio especificada por el usuario y el activador de compilación deben estar en el mismo proyecto.

Siguientes pasos