Cuando veas una política de permisos, es posible que veas nombres de roles que incluyen la string withcond
, seguida de un valor de hash. Por ejemplo, es posible que veas el nombre de un rol como roles/iam.serviceAccountAdmin_withcond_2b17cc25d2cd9e2c54d8
.
En esta página, se explica cuándo y por qué podrías ver la string withcond
en una política de permisos. 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 permisos se puede representar de varias formas diferentes. Cada forma se conoce como una versión de la política de permisos.
En una política de permisos que usa la versión 1
, puede que algunas vinculaciones de roles contengan la string withcond
en un nombre de rol, seguida de un valor de hash:
{
"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 permisos 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 permisos, incluidas sus condiciones, siempre debes especificar la versión 3
cuando obtengas o establezcas una política de permisos. Para especificar la versión 3
, debes completar las tareas de las siguientes secciones.
Actualiza la herramienta de gcloud
Si usas Google Cloud CLI, ejecuta gcloud version
para verificar su número de versión. En el resultado, se incluye una string similar a Google Cloud CLI 279.0.0
.
Si el número de la versión es inferior a 263.0.0, ejecuta gcloud components update
para actualizar la CLI de gcloud. En la versión 263.0.0 y en las posteriores, la CLI de gcloud especifica de forma automática una versión de la política de permisos que admite condiciones.
Actualiza las bibliotecas cliente
Si tu aplicación usa una biblioteca cliente, sigue estos pasos:
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 de permisos.
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 de permisos, actualízala a la versión más reciente.
Si usas una biblioteca cliente que no admite versiones de políticas de permisos, puedes agregar otra biblioteca cliente que sí las admita en tu aplicación. Usa esa biblioteca cliente para trabajar con políticas de permisos. Como alternativa, puedes usar la API de REST de IAM directamente.
Actualiza cualquier código de tu aplicación que obtenga y establezca políticas de permisos:
- Cuando obtengas una política de permisos, siempre especifica la versión
3
en la solicitud. Cuando establezcas una política de permisos, siempre establece el campo
version
de la política de permisos como3
, y también incluye el campoetag
en tu solicitud.
- Cuando obtengas una política de permisos, siempre especifica la versión
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 permisos:
- Cuando obtengas una política de permisos, siempre especifica la versión
3
en la solicitud. Cuando establezcas una política de permisos, siempre establece el campo
version
de la política de permisos como3
, y también incluye el campoetag
en tu solicitud.
Actualiza herramientas de administración para las políticas
Si guardas copias locales de tus políticas de permisos, 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 para obtener o configurar una política de permisos especifican la versión
3
- Todas las solicitudes para establecer una política de permisos incluyen 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:
Otorgas la función de creador de cuentas de servicio (
roles/iam.serviceAccountCreator
) al usuariovikram@example.com
en la carpetamy-folder
. La política de permisos para la carpeta es similar a este ejemplo:{ "bindings": [ { "members": [ "user:vikram@example.com" ], "role": "roles/iam.serviceAccountCreator" } ], "etag": "BuFmmMhCsNY=", "version": 1 }
Usas una herramienta para recuperar la política de permisos y almacenarla en un sistema de control de versión.
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 permisos 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 }
Usas una herramienta para recuperar la política de permisos actualizada. La herramienta no especifica una versión de la política de permisos cuando la solicita, por lo que recibes una política de permisos de versión
1
con un nombre de rol 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
al rol roles/iam.serviceAccountCreator
y que se debería restablecer la vinculación de rol original a la política de permisos:
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
en las solicitudes.
¿Qué sigue?
- Obtén más información sobre las políticas de permisos.
- Descubre cómo especificar una versión de la política de permisos cuando obtienes una política de permisos o la estableces.
- Comprende cómo otorgar acceso de forma condicional mediante las Condiciones de IAM.