Soluciona problemas con “withcond” en políticas y vinculaciones de funciones

Cuando ves una política de administración de identidades y accesos (IAM), es posible que veas nombres de funciones que incluyan la string withcond, seguida de un valor de hash. Por ejemplo, es posible que veas el nombre de una función como roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8.

En esta página, se explica cuándo y por qué puede que veas la string withcond en una política de IAM. También se recomiendan acciones que debes realizar si ves esta string.

Versiones de políticas y vinculaciones de funciones condicionales

Una política de IAM se puede representar de varias formas diferentes. Cada forma se conoce como una versión de política.

En una política de IAM que usa la versión 1, puede que algunas vinculaciones de funciones contengan la string withcond seguida de un valor de hash en el nombre de una función:

{
  "bindings": [
    {
      "members": [
        "user:dana@example.com"
      ],
      "role": "roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8"
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

Mediante este formato, se indica que la vinculación de la función es condicional. En otras palabras, la función se otorga solo si se cumplen condiciones específicas.

Las políticas de la versión 1 no muestran estas condiciones. Si ves la string withcond y un valor de hash, la vinculación de la función incluye una condición que no puedes ver.

Solución: Especifica la versión 3 de la política

Para asegurarte de que puedes ver y actualizar toda la política de IAM, incluidas sus condiciones, siempre debes especificar la versión 3 de la política en tus solicitudes. Para especificar la versión 3 de la política, debes completar las tareas de las siguientes secciones.

Actualiza la herramienta de gcloud

Si usas la herramienta de línea de comandos de gcloud, ejecuta gcloud version para verificar el número de la versión. En el resultado, se incluye una string similar a Google Cloud SDK 279.0.0.

Si el número de la versión es inferior a 263.0.0, ejecuta gcloud components update para actualizar la herramienta de gcloud. En la versión 263.0.0 y en las posteriores, la herramienta de gcloud especifica de forma automática una versión de la política que admite condiciones.

Actualiza las bibliotecas cliente

Si tu aplicación usa una biblioteca cliente, sigue estos pasos:

  1. Busca el nombre y el número de la versión de la biblioteca cliente y, luego, revisa la lista de bibliotecas cliente que admiten versiones de políticas.

    • Si ya usas una versión reciente de la biblioteca cliente que admite versiones de políticas, no necesitas actualizar tu biblioteca cliente. Avanza al siguiente paso.

    • Si usas una versión anterior de la biblioteca cliente y una versión posterior admite versiones de políticas, actualízala a la versión más reciente.

    • Si usas una biblioteca cliente que no admite versiones de políticas, puedes agregar otra biblioteca cliente que sí las admita en tu aplicación. Usa esa biblioteca cliente para trabajar con políticas de IAM. Como alternativa, puedes usar la API de REST de IAM directamente.

  2. Actualiza cualquier código de tu aplicación que obtenga y establezca políticas de IAM:

Actualiza las llamadas a la API de REST

Si tu aplicación usa directamente la API de REST de IAM, actualiza cualquier código que obtenga y establezca políticas de IAM:

Actualiza herramientas de administración para las políticas de IAM

Si guardas copias locales de tus políticas de IAM, por ejemplo, si las almacenas en un sistema de control de versión y las tratas como código, asegúrate de que todas las herramientas que uses cumplan con estos criterios:

  • Todas las solicitudes deben especificar la versión 3 de la política.
  • Todas las solicitudes que usas para actualizar una política deben incluir el campo etag en la solicitud.

Si una herramienta no cumple con estos criterios, verifica si existe una versión actualizada de la herramienta.

Además, asegúrate de que las herramientas de administración conserven las asignaciones de funciones condicionales, en lugar de agregar una asignación duplicada de funciones que no incluya una condición. Por ejemplo, considera la siguiente situación:

  1. Otorgas la función de creador de cuentas de servicio (roles/iam.serviceAccountCreator) al usuario vikram@example.com en la carpeta my-folder. La política de IAM para la carpeta es similar a este ejemplo:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator"
        }
      ],
      "etag": "BuFmmMhCsNY=",
      "version": 1
    }
  2. Usas una herramienta para recuperar la política de IAM y almacenarla en un sistema de control de versión.

  3. Agregas una condición para que vikram@example.com pueda crear cuentas de servicio solo durante la semana laboral normal, en función de la fecha y la hora de Berlín, Alemania. La política de IAM actualizada es similar al siguiente ejemplo:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator",
          "condition": {
            "title": "work_week_only",
            "expression": "request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5"
          }
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 3
    }
  4. Usas una herramienta para recuperar la política de IAM actualizada. La herramienta no especifica una versión de la política cuando la solicita, por lo que recibes una política de versión 1 con un nombre de función modificado:

    {
      "bindings": [
        {
          "members": [
            "user:vikram@example.com"
          ],
          "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
        }
      ],
      "etag": "BwWcR/B3tNk=",
      "version": 1
    }

En este punto, puede que la herramienta de administración decida que desapareció la vinculación de vikram@example.com a la función roles/iam.serviceAccountCreator y que se debería restablecer la vinculación de la función original a la política:

Evita las vinculaciones adicionales de las funciones sin condiciones.

{
  "bindings": [
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator_withcond_a75dc089e6fa084bd379"
    },
    {
      "members": [
        "user:vikram@example.com"
      ],
      "role": "roles/iam.serviceAccountCreator"
    }
  ],
  "etag": "BwWd3HjhKxE=",
  "version": 1
}

Este cambio no es correcto. Le otorga la función roles/iam.serviceAccountCreator a vikram@example.com sin importar el día de la semana. Como resultado, la condición de la primera vinculación de la función no tiene efecto.

Si tus herramientas de administración intentan realizar este tipo de cambio, no debes aprobarlo. En su lugar, debes actualizar tus herramientas de administración para especificar la versión 3 de la política en las solicitudes.

Próximos pasos