Usa condiciones de IAM

Las Condiciones de IAM te permiten definir y aplicar el control de acceso condicional basado en atributos para los recursos de Google Cloud, incluidas las instancias de Cloud SQL. Para obtener más información sobre las Condiciones de IAM, consulta Descripción general de las Condiciones de IAM.

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 configurar el acceso temporal (por vencer), 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 específica. Puedes usar atributos de fecha y hora en cualquier nivel de la jerarquía de recursos. Para obtener más información, consulta Configura 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 Configura el acceso basado en recursos.

Los casos prácticos incluyen:

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

  • Permitir a los usuarios crear instancias con prefijos o sufijos específicos (por ejemplo, “prueba”).

  • Limita el acceso a las operaciones de copia de seguridad para instancias de prueba

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

  • Permitir a los usuarios realizar operaciones administrativas en ciertas fechas o en ciertos momentos

Permite que los usuarios se conecten a instancias específicas

Supongamos que quieres permitir que un usuario o cuenta de servicio tenga permiso para conectarse solo a una instancia específica de Cloud SQL. Puedes incluir una condición de IAM en la vinculación de la política de IAM que otorgue a esa cuenta los permisos de un rol de Cloud SQL.

De forma predeterminada, el rol predefinido de cliente de Cloud SQL (roles/cloudsql.client), que contiene el permiso cloudsql.instances.connect, autoriza al miembro a conectarse a todas las instancias de Cloud SQL de un proyecto. Si ingresas una condición de IAM en la vinculación de la política, puedes otorgar permiso solo a la instancia con nombre.

Console

En este ejemplo, se muestra cómo modificar la vinculación de IAM existente para que el proyecto otorgue un rol de cliente de Cloud SQL a una cuenta de servicio para una instancia específica.

En este ejemplo, se usan las siguientes variables:

  • PROJECT_ID: Es el proyecto de Google Cloud.
  • INSTANCE_ID: El nombre de la instancia a la que deseas otorgar acceso.

  1. En la consola de Google Cloud, ve a la página IAM.

    Ir a IAM

  2. Haz clic en Agregar.
  3. En la casilla de entrada Miembros nuevos, ingresa el correo electrónico 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 Agregar condición:
  6. Ingresa un título y una descripción.
  7. Selecciona la pestaña Editor de Condiciones.
  8. En la sección Creador de Condiciones, haz lo siguiente:
    • En Condition type - Resource - Name, ingresa projects/PROJECT_ID/instances/INSTANCE_ID.
    • Asegúrate de que la opción condicional AND 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 la vinculación de la política de IAM existente para que el proyecto otorgue a la cuenta de servicio específica el rol de cliente de Cloud SQL, pero solo para una instancia específica.

En este ejemplo, se usan las siguientes variables:

  • PROJECT_ID: Es el proyecto de Google Cloud.
  • INSTANCE_ID: El nombre de la instancia a la que deseas otorgar acceso.
  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico completa de la cuenta de servicio cuyo acceso deseas modificar.

  1. Obtén las vinculaciones de políticas de IAM existentes y envíalas al archivo bindings.json:
  2. gcloud projects get-iam-policy PROJECT_ID --format=json > bindings.json
    
  3. Agrega 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 IAM con el archivo bindings.json nuevo.
    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 google_iam_policy de Terraform y un recurso de Terraform google_project_iam_policy.

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 tu configuración de Terraform en un proyecto de Google Cloud, completa los pasos de las siguientes secciones.

Prepara Cloud Shell

  1. Inicia Cloud Shell
  2. Establece el proyecto de Google Cloud predeterminado en el que deseas aplicar tus configuraciones de Terraform.

    Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

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

Prepara 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 dentro de ese directorio. El nombre del archivo debe tener la extensión .tf, por ejemplo, main.tf. En este instructivo, el archivo se denomina main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si sigues un instructivo, puedes copiar el código de muestra en cada sección o paso.

    Copia el código de muestra en el main.tf recién creado.

    De manera opcional, copia el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

  3. Revisa y modifica los parámetros de muestra que se aplicarán a tu entorno.
  4. Guarda los cambios.
  5. Inicializa Terraform. Solo debes hacerlo una vez por directorio.
    terraform init

    De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

    terraform init -upgrade

Aplica los cambios

  1. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:
    terraform plan

    Corrige la configuración según sea necesario.

  2. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:
    terraform apply

    Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

  3. Abre tu proyecto de Google Cloud para ver los resultados. En la consola de Google Cloud, navega a tus recursos en la IU para asegurarte de que Terraform los haya creado o actualizado.

Borra los cambios

Para borrar tus cambios, haz lo siguiente:

  1. Para inhabilitar la protección contra la eliminación, en tu archivo de configuración de Terraform, establece el argumento deletion_protection en false.
    deletion_protection =  "false"
  2. Para aplicar la configuración actualizada de Terraform, ejecuta el siguiente comando y, luego, ingresa yes cuando se te solicite:
    terraform apply
  1. Quita los recursos que se aplicaron antes con tu configuración de Terraform mediante la ejecución del siguiente comando y, luego, ingresa yes cuando se te solicite:

    terraform destroy

Limita el acceso a las operaciones de copia de seguridad para instancias de prueba

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

Puedes limitar el acceso a las operaciones de copia de seguridad de las instancias de prueba para un usuario o una cuenta de servicio. El límite de acceso incluye la restricción de las operaciones CREATE, GET, LIST o DELETE a copias de seguridad para las instancias de prueba.

Console

  1. En la consola de Google Cloud, ve a la página IAM.

    Ir a IAM

  2. Haz clic en la pestaña PRINCIPALES.
  3. Ubica la dirección de correo electrónico o la cuenta de servicio (principal) del usuario a la que deseas restringir el acceso.
  4. Haz clic en el ícono Editar principal a la derecha del principal. Este ícono aparece como un lápiz.
  5. En el cuadro de diálogo Editar permisos, haz clic en AGREGAR OTRO ROL.
  6. En el campo Filtro del cuadro de diálogo posterior, ingresa Cloud SQL Admin. Luego, 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 ahora aparece en el cuadro de diálogo.

  7. A la derecha del rol Administrador de Cloud SQL, haz clic en el vínculo Agregar condición.
  8. En el cuadro de diálogo Editar condición, ingresa la siguiente información:
    1. En el campo Título, ingresa un nombre para la condición que deseas agregar a fin de limitar el acceso a las operaciones de copia de seguridad de instancias de prueba. Por ejemplo, puedes ingresar Limit access to backup operations.
    2. Haz clic en la pestaña EDITOR DE CONDICIONES y, luego, agrega 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: Es el proyecto de Google Cloud.
  • USER_EMAIL: La dirección de correo electrónico del usuario.
  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico completa de la cuenta de servicio cuyo acceso deseas limitar.

  1. Limita el permiso del rol cloudsql.admin para un usuario que tiene una dirección de correo electrónico USER_EMAIL.

    El permiso del rol se limita a los recursos que tienen nombres de recursos que comienzan con 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. O

  3. Limita el permiso del rol cloudsql.admin para un usuario que accedió 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"
        

Permite que los usuarios borren las instancias de prueba, pero no las de producción

Supongamos que deseas permitir que una cuenta de servicio borre instancias de prueba, pero no de producción. Puedes hacerlo mediante las etiquetas y si agregas las siguientes dos vinculaciones de políticas para la cuenta de servicio:

  • Un rol de editor de Cloud SQL en el recurso en el que otorgaste la función y sus descendientes Si se otorga en el proyecto, el rol se aplica a todas las instancias del proyecto. El rol de Editor de Cloud SQL no contiene el permiso cloudsql.instances.delete.
  • Un rol de Administrador de Cloud SQL en instancias con la etiqueta test

Console

  1. En la consola de Google Cloud, ve a la página IAM.

    Ir a IAM

  2. Haz clic en Agregar.
  3. En el campo Miembros nuevos, ingresa la dirección de correo electrónico de la cuenta de servicio.
  4. Haz clic en la lista desplegable Rol y selecciona el rol Editor de Cloud SQL. No agregues 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 Agregar condición:
  8. Ingresa un título y una descripción.
  9. Selecciona la pestaña Editor de Condiciones.
  10. En la sección Creador de Condiciones, haz lo siguiente:
    • En Tipo de condición - Recurso - Nombre, ingresa un nombre para la condición.
    • En Tipo de condición - Recurso - Servicio, selecciona sqladmin.googleapis.com.
    • En Tipo de condición - recurso - etiqueta, ingresa el nombre del espacio de nombres de la clave de 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: Es el proyecto de Google Cloud.
  • INSTANCE_ID: Es la instancia de Cloud SQL
  • REGION: Es la región en la que se encuentra tu instancia de Cloud SQL.
  • ORGANIZATION_ID: Es el ID de la organización que será el recurso superior de esta clave de etiqueta, por ejemplo: 12345678901. Para obtener información sobre cómo obtener el ID de tu organización, consulta la sección sobre cómo crear y administrar organizaciones.
  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico completa de la cuenta de servicio cuyo acceso deseas modificar.

  1. Crea una clave de etiqueta llamada “env” con los valores de etiqueta “prod” y “test”. Para obtener más información, consulta Crea y define una etiqueta nueva.
    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. Adjunta 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 IAM existentes y envíalas al archivo bindings.json:
    gcloud projects get-iam-policy PROJECT_ID --format=json >> bindings.json
    
  5. Agrega 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 las vinculaciones de política de IAM con el archivo bindings.json nuevo.
    gcloud projects set-iam-policy PROJECT_ID bindings.json