Usar condiciones de gestión de identidades y accesos

Las condiciones de IAM te permiten definir y aplicar controles de acceso condicionales basados en atributos paraGoogle Cloud recursos, incluidas las instancias de Cloud SQL. Para obtener más información sobre las condiciones de gestión de identidades y accesos, consulta la página Descripción general de las condiciones de gestión de identidades y accesos.

Introducción

En Cloud SQL, puedes aplicar el acceso condicional en función de los siguientes atributos:

  • Atributos de fecha y hora: se usan para definir el acceso temporal (con caducidad), programado o de duración limitada a los recursos de Cloud SQL. Por ejemplo, puedes permitir que un usuario acceda a una instancia de base de datos hasta una fecha concreta. Puede usar atributos de fecha y hora en cualquier nivel de la jerarquía de recursos. Para obtener más información, consulta el artículo sobre cómo configurar el acceso temporal.
  • Atributos de recursos: se usan para configurar el acceso condicional en función de una etiqueta, un nombre de recurso, un tipo de recurso o un atributo de servicio de recurso. En Cloud SQL, puedes usar atributos de instancias de bases de datos para configurar el acceso condicional. Por ejemplo, puedes permitir que un usuario solo acceda a instancias con una etiqueta específica. Para obtener más información, consulta el artículo sobre cómo configurar el acceso basado en recursos.

Se puede usar, por ejemplo, en estos casos:

  • Permitir que los usuarios se conecten a instancias específicas.

  • Permitir que los usuarios creen instancias con prefijos o sufijos específicos (por ejemplo, "prueba").

  • Limitar el acceso a las operaciones de copia de seguridad de las instancias de prueba

  • Permitir que los usuarios eliminen instancias de desarrollo y de prueba, pero no instancias de producción.

  • Permitir que los usuarios realicen operaciones administrativas en determinadas fechas o a determinadas horas.

Permitir que los usuarios se conecten a instancias específicas

Supongamos que quieres dar permiso a un usuario o a una cuenta de servicio para que se conecte solo a una instancia de Cloud SQL específica. Puedes incluir una condición de gestión de identidades y accesos en el enlace de la política de gestión de identidades y accesos que concede a esa cuenta los permisos de un rol de Cloud SQL.

De forma predeterminada, el rol Cliente de Cloud SQL predefinido (roles/cloudsql.client), que contiene el permiso cloudsql.instances.connect, autoriza a su miembro a conectarse a todas las instancias de Cloud SQL de un proyecto. Si introduces una condición de gestión de identidades y accesos en el enlace de la política, puedes conceder permiso solo a la instancia con el nombre especificado.

Consola

En este ejemplo se muestra cómo modificar la vinculación de gestión de identidades y accesos (IAM) del proyecto para asignar el rol Cliente de Cloud SQL a una cuenta de servicio en una instancia específica.

En este ejemplo se usan las siguientes variables:

  • PROJECT_ID: tu Google Cloud proyecto.
  • INSTANCE_ID: el nombre de la instancia a la que quieres conceder acceso.

  1. En la consola, ve a la página Gestión de identidades y accesos. Google Cloud

    Ir a IAM

  2. Haz clic en Añadir.
  3. En el cuadro de entrada Miembros nuevos, introduce el correo de la cuenta de servicio.
  4. Haz clic en la lista desplegable Rol y selecciona el rol Cliente de Cloud SQL.
  5. Haz clic en Añadir condición.
  6. Introduce un título y una descripción.
  7. Selecciona la pestaña Editor de condiciones.
  8. En la sección Creador de condiciones:
    • En Tipo de condición - Recurso - Nombre, escribe projects/PROJECT_ID/instances/INSTANCE_ID.
    • Asegúrate de que la condición Y esté seleccionada.
    • En Tipo de condición - Recurso - Servicio, selecciona sqladmin.googleapis.com.
  9. Haz clic en Guardar para guardar la condición.
  10. Haz clic en Guardar para guardar la política.

gcloud

En este ejemplo se muestra cómo modificar el enlace de la política de gestión de identidades y accesos de un proyecto para asignar el rol Cliente de Cloud SQL a una cuenta de servicio específica, pero solo para una instancia concreta.

En este ejemplo se usan las siguientes variables:

  • PROJECT_ID: tu Google Cloud proyecto.
  • INSTANCE_ID: el nombre de la instancia a la que quieres conceder acceso.
  • SERVICE_ACCOUNT_EMAIL: la dirección de correo completa de la cuenta de servicio cuyo acceso quieras modificar.

  1. Obtén las vinculaciones de políticas de gestión de identidades y accesos y guárdalas en el archivo bindings.json:
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
  3. Añade la siguiente vinculación de rol condicional al archivo bindings.json:
    {
      "bindings": [
        {
          "role": "roles/cloudsql.client",
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_EMAIL"
          ],
          "condition": {
            "expression": "resource.name == 'projects/PROJECT_ID/instances/INSTANCE_ID'
              && resource.service == 'sqladmin.googleapis.com'"
          }
        }
      ],
      "etag": "BwWKmjvelug=",
      "version": 3
    }
  4. Actualiza la política de gestión de identidades y accesos con el nuevo archivo bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json

Terraform

Para permitir que los usuarios se conecten a instancias específicas, usa un recurso de datos de google_iam_policyTerraform y un google_project_iam_policy recurso de Terraform.

data "google_iam_policy" "sql_iam_policy" {
  binding {
    role = "roles/cloudsql.client"
    members = [
      "serviceAccount:${google_project_service_identity.gcp_sa_cloud_sql.email}",
    ]
    condition {
      expression  = "resource.name == 'projects/${data.google_project.project.project_id}/instances/${google_sql_database_instance.default.name}' && resource.type == 'sqladmin.googleapis.com/Instance'"
      title       = "created"
      description = "Cloud SQL instance creation"
    }
  }
}

resource "google_project_iam_policy" "project" {
  project     = data.google_project.project.project_id
  policy_data = data.google_iam_policy.sql_iam_policy.policy_data
}

Aplica los cambios

Para aplicar la configuración de Terraform en un proyecto, sigue los pasos que se indican en las siguientes secciones. Google Cloud

Preparar Cloud Shell

  1. Abre Cloud Shell.
  2. Define el Google Cloud proyecto Google Cloud predeterminado en el que quieras aplicar tus configuraciones de Terraform.

    Solo tiene que ejecutar este comando una vez por proyecto y puede hacerlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Las variables de entorno se anulan si defines valores explícitos en el archivo de configuración de Terraform.

Preparar el directorio

Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).

  1. En Cloud Shell, crea un directorio y un archivo nuevo en ese directorio. El nombre del archivo debe tener la extensión .tf. Por ejemplo, main.tf. En este tutorial, nos referiremos al archivo como main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si estás siguiendo un tutorial, puedes copiar el código de ejemplo de cada sección o paso.

    Copia el código de ejemplo en el archivo main.tf que acabas de crear.

    También puedes copiar el código de GitHub. Se recomienda cuando el fragmento de Terraform forma parte de una solución integral.

  3. Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo tienes que hacerlo una vez por directorio.
    terraform init

    Si quieres usar la versión más reciente del proveedor de Google, incluye la opción -upgrade:

    terraform init -upgrade

Aplica los cambios

  1. Revisa la configuración y comprueba que los recursos que va a crear o actualizar Terraform se ajustan a tus expectativas:
    terraform plan

    Haga las correcciones necesarias en la configuración.

  2. Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo yes en la petición:
    terraform apply

    Espera hasta que Terraform muestre el mensaje "Apply complete!".

  3. Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola, ve a tus recursos en la interfaz de usuario para asegurarte de que Terraform los ha creado o actualizado.

Eliminar los cambios

Para eliminar los cambios, sigue estos pasos:

  1. Para inhabilitar la protección contra la eliminación, en el archivo de configuración de Terraform, asigna el valor false al argumento deletion_protection.
    deletion_protection =  "false"
  2. Aplica la configuración de Terraform actualizada ejecutando el siguiente comando e introduciendo yes en la petición:
    terraform apply
  1. Para quitar los recursos que se hayan aplicado anteriormente con tu configuración de Terraform, ejecuta el siguiente comando e introduce yes en la petición:

    terraform destroy

Limitar el acceso a las operaciones de copia de seguridad de las instancias de prueba

Supongamos que la topología de tu servicio está configurada de forma que todas las instancias de prueba tengan el prefijo test (por ejemplo, test-instance-1) y todas las instancias de producción tengan el prefijo prod (por ejemplo, prod-instance-1).

Puedes limitar el acceso a las operaciones de copia de seguridad a tus instancias de prueba para un usuario o una cuenta de servicio. Limitar el acceso implica restringir las operaciones CREATE, GET, LIST o DELETE a las copias de seguridad de tus instancias de prueba.

Consola

  1. En la consola, ve a la página Gestión de identidades y accesos. Google Cloud

    Ir a IAM

  2. Haz clic en la pestaña PRINCIPALS (Principales).
  3. Busca la dirección de correo electrónico o la cuenta de servicio (principal) del usuario al que quieras restringir el acceso.
  4. Haz clic en el icono Editar principal situado a la derecha del principal. Este icono tiene forma de lápiz.
  5. En el cuadro de diálogo Editar permisos, haz clic en AÑADIR OTRO ROL.
  6. En el campo Filter (Filtro) del cuadro de diálogo siguiente, introduce Cloud SQL Admin. A continuación, selecciona el rol Administrador de Cloud SQL que aparece.

    El cuadro de diálogo Editar permisos está activo y el rol Administrador de Cloud SQL aparece en el cuadro de diálogo.

  7. A la derecha del rol Administrador de Cloud SQL, haz clic en el enlace Añadir condición.
  8. En el cuadro de diálogo Editar condición, proporciona la siguiente información:
    1. En el campo Título, introduce un nombre para la condición que vas a añadir para limitar el acceso a las operaciones de copia de seguridad de las instancias de prueba. Por ejemplo, puedes escribir Limit access to backup operations.
    2. Haga clic en la pestaña EDITOR DE CONDICIONES y, a continuación, añada la siguiente condición:

      resource.type == "sqladmin.googleapis.com/BackupRun" && 
      resource.name.startsWith("projects/PROJECT_ID/instances/test")
          

      .

  9. Haz clic en GUARDAR.
  10. En el cuadro de diálogo Editar permisos, haz clic en GUARDAR.

gcloud

En este ejemplo se usan las siguientes variables:

  • PROJECT_ID: tu Google Cloud proyecto.
  • USER_EMAIL: la dirección de correo del usuario.
  • SERVICE_ACCOUNT_EMAIL:la dirección de correo completa de la cuenta de servicio cuyo acceso quieres limitar.

  1. Limita el ámbito del rol cloudsql.admin a un usuario cuya dirección de correo sea USER_EMAIL.

    El ámbito del rol se limita a los recursos cuyos nombres de recurso empiecen por projects/PROJECT_ID/instances/test.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:USER_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        
  2. OR

  3. Limita el ámbito del rol cloudsql.admin de un usuario que ha iniciado sesión con una cuenta de servicio de SERVICE_ACCOUNT_EMAIL.

    gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --role=roles/cloudsql.admin \
    --condition=expression="resource.type == \"sqladmin.googleapis.com/BackupRun\" && resource.name.startsWith(\"projects/PROJECT_ID/instances/test-instance-1\")",title="test"
        

Permitir que los usuarios eliminen instancias de prueba, pero no instancias de producción

Supongamos que quieres permitir que una cuenta de servicio elimine instancias de prueba, pero no instancias de producción. Para ello, puedes usar etiquetas y añadir las dos vinculaciones de políticas siguientes a la cuenta de servicio:

  • El rol Editor de Cloud SQL en el recurso en el que has concedido el rol y sus descendientes. Si se concede en el proyecto, el rol se aplica a todas las instancias del proyecto. El rol Editor de Cloud SQL no contiene el permiso cloudsql.instances.delete.
  • Un rol de administrador de Cloud SQL en instancias con la etiqueta test.

Consola

  1. En la consola, ve a la página Gestión de identidades y accesos. Google Cloud

    Ir a IAM

  2. Haz clic en Añadir.
  3. En el campo Miembros nuevos, introduce el correo de la cuenta de servicio.
  4. Haz clic en la lista desplegable Rol y selecciona el rol Editor de Cloud SQL. No añadas nada más para este rol.
  5. Haz clic en Guardar para guardar la condición.
  6. Haz clic en el menú Rol de la misma cuenta y selecciona el rol Administrador de Cloud SQL.
  7. Haz clic en Añadir condición.
  8. Introduce un título y una descripción.
  9. Selecciona la pestaña Editor de condiciones.
  10. En la sección Creador de condiciones:
    • En Tipo de condición - Recurso - Nombre, introduce un nombre para la condición.
    • En Tipo de condición - Recurso - Servicio, selecciona sqladmin.googleapis.com.
    • En Tipo de condición - Recurso - Etiqueta, introduce el nombre con espacio de nombres de la clave de la etiqueta. En este ejemplo, el operador es matches y el valor es 815471563813/env/test.
  11. Haz clic en Guardar para guardar la condición.
  12. Haz clic en Guardar para guardar la política.

gcloud

En este ejemplo se usan las siguientes variables:

  • PROJECT_ID: tu Google Cloud proyecto.
  • INSTANCE_ID: tu instancia de Cloud SQL.
  • REGION: la región en la que se encuentra tu instancia de Cloud SQL.
  • ORGANIZATION_ID: ID de la organización que será el recurso principal de esta clave de etiqueta. Por ejemplo: 12345678901. Para saber cómo obtener el ID de tu organización, consulta el artículo Crear y gestionar organizaciones.
  • SERVICE_ACCOUNT_EMAIL:la dirección de correo completa de la cuenta de servicio cuyo acceso quieras modificar.

  1. Crea una clave de etiqueta llamada "env" con los valores de etiqueta "prod" y "test". Para obtener más información, consulta el artículo Crear y definir una etiqueta.
    gcloud alpha resource-manager tags keys create env \
    --parent=organizations/ORGANIZATION_ID
    gcloud alpha resource-manager tags values create prod \
    --parent=env
    gcloud alpha resource-manager tags values create test \
    --parent=env
        
  2. Asigna la etiqueta `env` con el valor `test` a tus instancias de Cloud SQL del entorno de prueba. Para obtener más información, consulta la página Etiquetas de Cloud SQL.
  3. gcloud alpha resource-manager tags bindings create \
    --tag-value=test \
    --parent=//sqladmin.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID \
    --location=REGION
      
  4. Obtén las vinculaciones de políticas de gestión de identidades y accesos y guárdalas en el archivo bindings.json:
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
  5. Añade las siguientes vinculaciones condicionales al archivo bindings.json:
    {
      "bindings": [
        {
          "role": "roles/cloudsql.editor",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ]
        },
        {
          "role": "roles/cloudsql.admin",
          "members": [
              "serviceAccount:SERVICE_ACCOUNT_EMAIL"
            ],
          "condition": {
            "expression": "resource.matchTag('ORGANIZATION_ID/env', 'test')"
          }
        }
      ],
      "etag": "BwWKmjvelug="
      "version": 3
    }
  6. Actualiza los enlaces de la política de gestión de identidades y accesos con el nuevo archivo bindings.json.
    gcloud projects set-iam-policy PROJECT_ID bindings.json