Las condiciones de Gestión de Identidades y Accesos (IAM) te permiten definir políticas de IAM con concesiones condicionales. Las condiciones se especifican en las vinculaciones de roles de la política de gestión de identidades y accesos de un recurso. Si existe una condición, el rol solo se concede cuando la expresión de la condición se evalúa como true
. Cada expresión de condición es un conjunto de instrucciones lógicas que te permiten especificar uno o varios atributos. Para obtener más información, consulta la referencia de atributos de las condiciones de gestión de identidades y accesos.
Cuando se usan con Cloud Load Balancing, las condiciones de IAM te permiten conceder roles predefinidos (como el de administrador del balanceador de carga o el de administrador de la red) o roles personalizados de forma condicional.
Las condiciones de IAM admiten una expresión de condición para comprobar el esquema de balanceo de carga de una regla de reenvío. Por ejemplo, puedes conceder a un principal de gestión de identidades y accesos la capacidad de crear balanceadores de carga internos, pero no externos. Si esa entidad de seguridad de IAM intenta crear una regla de reenvío para un balanceador de carga externo,Google Cloud deniega la acción y devuelve un error como el siguiente:
ERROR: (gcloud.compute.forwarding-rules.create) Could not fetch resource: - Required 'compute.forwardingRules.create' permission for 'projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE_NAME'
Usar condiciones de gestión de identidades y accesos en balanceadores de carga Google Cloud
El esquema de balanceo de carga de una regla de reenvío determina qué tipo o tipos de balanceador de carga pueden usar la regla de reenvío. En otras palabras, el esquema de balanceo de carga corresponde al tipo de balanceador de carga, tal como se muestra en la siguiente tabla.
Esquema de balanceo de carga | Descripción |
---|---|
EXTERNO |
Balanceador de carga de aplicación clásico Balanceador de carga de red de proxy clásico Balanceador de carga de red de paso a través externo |
EXTERNAL_MANAGED |
Balanceador de carga de aplicación externo global Balanceador de carga de red con proxy externo global Balanceador de carga de aplicación externo regional Balanceador de carga de red con proxy externo regional |
INTERNAL | Balanceador de carga de red de paso a través interno |
INTERNAL_MANAGED | Balanceador de carga de aplicación interno regional Balanceador de carga de red con proxy interno regional Balanceador de carga de aplicación interno entre regiones Balanceador de carga de red con proxy interno entre regiones |
INTERNAL_SELF_MANAGED | Cloud Service Mesh |
El campo loadBalancingScheme
se especifica al crear el balanceador de carga.
Si compruebas el campo loadBalancingScheme
de una condición de gestión de identidades y accesos, puedes conceder a las principales la capacidad de crear determinados tipos de balanceadores de carga.
Especificar condiciones de gestión de identidades y accesos
Puedes definir enlaces de roles condicionales con el mismo método setIamPolicy
que usas para configurar cualquier otro enlace de roles. Para definir una vinculación de rol con una condición en un proyecto, puedes usar la API REST, la herramienta de línea de comandos gcloud
o la página IAM de la consola Google Cloud .
Para obtener más información, consulta el artículo Gestionar políticas condicionales.
Ejemplos de expresiones de condición para el balanceo de carga
La siguiente expresión de condición, que se puede usar en una política de IAM, permite una solicitud de API solo si se cumple una de las siguientes condiciones:
- La solicitud no implica la creación de una regla de reenvío.
La solicitud es para crear una regla de reenvío que tenga uno de los esquemas de balanceo de carga internos.
!compute.isForwardingRuleCreationOperation() || ( compute.isForwardingRuleCreationOperation() && compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED']) )
Se omite el esquema de balanceo de carga EXTERNAL
.
Si una entidad intenta crear una regla de reenvío con el esquema de balanceo de carga EXTERNAL
, aparece un mensaje de error de permisos.
Política de ejemplo
En este ejemplo de política de gestión de identidades y accesos de un proyecto, se concede al principal de gestión de identidades y accesos jane@example.com
el rol predefinido de administrador de balanceadores de carga, pero no se le permite crear balanceadores de carga externos (porque se omite el esquema de balanceo de carga EXTERNAL
). jane@example.com
Puede crear balanceadores de carga internos, así como gestionar, modificar y eliminar cualquier balanceador de carga.
{
"bindings": [
{
"role": "roles/compute.loadBalancerAdmin",
"members": ["user:jane@example.com"],
"condition": {
"title": "only_internal_lb_schemes",
"description": "Internal LB creation only permitted",
"expression": "
!compute.isForwardingRuleCreationOperation() || (
compute.isForwardingRuleCreationOperation() &&
compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED'])
)
"
}
}
]
}
Conceder permisos de cuenta de servicio de GKE para tipos específicos de reglas de reenvío
También puedes usar condiciones de gestión de identidades y accesos para limitar el acceso a la cuenta de servicio de GKE y crear solo tipos específicos de reglas de reenvío.
En este ejemplo de JSON se muestra una política de gestión de identidades y accesos completa para conceder el rol Agente de servicio de Kubernetes Engine a la cuenta de servicio de GKE (service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com
). Este rol permite a la cuenta de servicio crear, modificar y eliminar componentes de balanceadores de carga, excepto reglas de reenvío externas.
Con esta concesión condicional, la cuenta de servicio de GKE solo puede crear nuevas reglas de reenvío internas, pero puede gestionar todas las reglas de reenvío que ya existan.
{
"bindings": [
{
"role": "roles/container.serviceAgent",
"members": ["serviceAccount:service-<var>PROJECT_ID</var>@container-engine-robot.iam.gserviceaccount.com"],
"condition": {
"title": "only_internal_lb_schemes",
"description": "Internal LB Creation Only Permitted",
"expression": "(
compute.isForwardingRuleCreationOperation()
&&
compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED'])
)
||
!compute.isForwardingRuleCreationOperation()
"
}
}
]
}
Si no se han concedido otros permisos, al intentar crear un servicio de GKE de tipo LoadBalancer sin la anotación de un balanceador de carga de red de transferencia interno, se mostrará un mensaje de error como el siguiente:
Error creating load balancer (will retry): failed to ensure load balancer for service default/SERVICE-NAME: failed to create forwarding rule for load balancer (a01d427111c7011ea96e142010a80006(default/SERVICE-NAME)): googleapi: Error 403: Required 'compute.forwardingRules.create' permission for 'projects/PROJECT_ID/regions/[region]/forwardingRules/FORWARDING_RULE_NAME', forbidden
Además, si no se conceden otros permisos, al intentar crear un objeto Ingress, se muestra un mensaje de error similar porque el controlador de Ingress de Cloud Load Balancing necesita crear un balanceador de carga de aplicaciones externo.
Los mensajes de error de GKE están disponibles mediante los comandos kubectl describe
y kubectl get events -w
.
Siguientes pasos
- Obtén más información sobre la gestión de identidades y accesos.
- Asigna roles de gestión de identidades y accesos.