En esta página se describen los límites de acceso a credenciales, que puedes usar para downscope o restringir los permisos de Gestión de Identidades y Accesos (IAM) que puede usar una credencial de corta duración.
Puedes usar límites de acceso de credenciales para generar tokens de acceso de OAuth 2.0 que representen una cuenta de servicio, pero que tengan menos permisos que la cuenta de servicio. Por ejemplo, si uno de tus clientes necesita acceder a datos de Cloud Storage que controlas, puedes hacer lo siguiente:
- Crea una cuenta de servicio que pueda acceder a todos los segmentos de Cloud Storage que tengas.
- Genera un token de acceso OAuth 2.0 para la cuenta de servicio.
- Aplica un límite de acceso de credenciales que solo permita acceder al contenedor que contiene los datos de tus clientes.
Cómo funcionan los límites de acceso de credenciales
Para restringir los permisos, define un límite de acceso a credenciales que especifique a qué recursos puede acceder la credencial de corta duración, así como un límite superior de los permisos disponibles en cada recurso. Después, puedes crear una credencial de corta duración y, a continuación, cambiarla por una nueva que respete el límite de acceso de la credencial.
Si necesitas dar a las entidades un conjunto de permisos distinto para cada sesión, usar límites de acceso de credenciales puede ser más eficiente que crear muchas cuentas de servicio diferentes y conceder a cada cuenta de servicio un conjunto de roles diferente.
Componentes de un límite de acceso de credenciales
Un límite de acceso de credenciales es un objeto que contiene una lista de reglas de límite de acceso. Cada regla contiene la siguiente información:
- El recurso al que se aplica la regla.
- Límite superior de los permisos disponibles en ese recurso.
- Opcional: una condición que restrinja aún más los permisos. Una condición incluye lo siguiente:
- Una expresión de condición que da como resultado
true
ofalse
. Si el resultado estrue
, se permite el acceso; de lo contrario, se deniega. - Opcional: título que identifica la condición.
- Opcional: una descripción con más información sobre la condición.
- Una expresión de condición que da como resultado
Si aplicas un límite de acceso de credenciales a una credencial de corta duración, la credencial solo podrá acceder a los recursos del límite de acceso de credenciales. No hay permisos disponibles en otros recursos.
Un límite de acceso de credenciales puede contener hasta 10 reglas de límite de acceso. Solo puedes aplicar un límite de acceso a credenciales a cada credencial de corta duración.
Cuando se representa como un objeto JSON, un límite de acceso de credenciales contiene los siguientes campos:
Campos | |
---|---|
accessBoundary |
Contenedor del límite de acceso de credenciales. |
accessBoundary.accessBoundaryRules[] |
Lista de reglas de límite de acceso que se aplicarán a una credencial de corta duración. |
accessBoundary.accessBoundaryRules[].availablePermissions[] |
Lista que define el límite superior de los permisos disponibles para el recurso.
Cada valor es el identificador de un rol predefinido o un rol personalizado de gestión de identidades y accesos, con el prefijo |
accessBoundary.accessBoundaryRules[].availableResource |
Nombre completo del recurso del segmento de Cloud Storage al que se aplica la regla. Utiliza el formato
|
accessBoundary.accessBoundaryRules[].availabilityCondition |
Opcional. Condición que restringe la disponibilidad de permisos a objetos de Cloud Storage específicos. Usa este campo si quieres que los permisos estén disponibles para objetos específicos, en lugar de para todos los objetos de un segmento de Cloud Storage. |
accessBoundary.accessBoundaryRules[].availabilityCondition.expression |
Una expresión de condición que especifica los objetos de Cloud Storage en los que hay permisos disponibles.
Para saber cómo hacer referencia a objetos específicos en una expresión de condición, consulta los atributos
|
accessBoundary.accessBoundaryRules[].availabilityCondition.title |
Opcional. Cadena corta que identifica el propósito de la condición. |
accessBoundary.accessBoundaryRules[].availabilityCondition.description |
Opcional. Detalles sobre el propósito de la condición. |
Para ver ejemplos en formato JSON, consulta la sección Ejemplos de límites de acceso a credenciales de esta página.
Ejemplos de límites de acceso a credenciales
En las siguientes secciones se muestran ejemplos de límites de acceso a credenciales para casos prácticos habituales. Utilizas el límite de acceso de credenciales cuando intercambias un token de acceso de OAuth 2.0 por un token con permisos limitados.
Limitar los permisos de un segmento
En el siguiente ejemplo se muestra un límite de acceso a credenciales sencillo. Se aplica al segmento de Cloud Storage example-bucket
y establece el límite superior de los permisos incluidos en el rol Lector de objetos de Storage (roles/storage.objectViewer
):
{
"accessBoundary": {
"accessBoundaryRules": [
{
"availablePermissions": [
"inRole:roles/storage.objectViewer"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket"
}
]
}
}
Limitar los permisos de varios segmentos
En el siguiente ejemplo se muestra un límite de acceso de credenciales que incluye reglas para varios contenedores:
- Segmento de Cloud Storage
example-bucket-1
: en este segmento, solo están disponibles los permisos del rol Lector de objetos de Storage (roles/storage.objectViewer
). - Segmento de Cloud Storage
example-bucket-2
: en este segmento, solo están disponibles los permisos del rol Creador de objetos de Storage (roles/storage.objectCreator
).
{
"accessBoundary": {
"accessBoundaryRules": [
{
"availablePermissions": [
"inRole:roles/storage.objectViewer"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-1"
},
{
"availablePermissions": [
"inRole:roles/storage.objectCreator"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-2"
}
]
}
}
Limitar los permisos de objetos específicos
También puedes usar condiciones de gestión de identidades y accesos para especificar a qué objetos de Cloud Storage puede acceder una principal. Por ejemplo, puedes añadir una condición que haga que los permisos estén disponibles para los objetos cuyo nombre empiece por customer-a
:
{ "accessBoundary": { "accessBoundaryRules": [ { "availablePermissions": [ "inRole:roles/storage.objectViewer" ], "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket", "availabilityCondition": { "expression" : "resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a')" } } ] } }
Limitar los permisos al enumerar objetos
Cuando muestras los objetos de un segmento de Cloud Storage, llamas a un método en un recurso de segmento, no en un recurso de objeto. Por lo tanto, si se evalúa una condición para una solicitud de lista y la condición hace referencia al nombre del recurso, el nombre del recurso identifica el contenedor, no un objeto dentro del contenedor. Por ejemplo, cuando enumeras objetos en example-bucket
, el nombre del recurso es projects/_/buckets/example-bucket
.
Esta convención de nomenclatura puede provocar un comportamiento inesperado al enumerar objetos.
Por ejemplo, supongamos que quieres un límite de acceso a credenciales que permita el acceso de lectura a los objetos de example-bucket
con el prefijo customer-a/invoices/
.
Puedes probar a usar la siguiente condición en el límite de acceso de credenciales:
Incompleta: condición que comprueba solo el nombre del recurso
resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/')
Esta condición funciona para leer objetos, pero no para enumerarlos:
- Cuando una entidad intenta leer un objeto en
example-bucket
con el prefijocustomer-a/invoices/
, la condición se evalúa comotrue
. - Cuando una entidad intenta enumerar objetos con ese prefijo, la condición se evalúa como
false
. El valor deresource.name
esprojects/_/buckets/example-bucket
, que no empieza porprojects/_/buckets/example-bucket/objects/customer-a/invoices/
.
Para evitar este problema, además de usar resource.name.startsWith()
, tu condición puede comprobar un atributo de API llamado storage.googleapis.com/objectListPrefix
. Este atributo contiene el valor del parámetro prefix
que se ha usado para filtrar la lista de objetos. Por lo tanto, puede escribir una condición que haga referencia al valor del parámetro prefix
.
En el siguiente ejemplo se muestra cómo usar el atributo de API en una condición. Permite leer y mostrar objetos en example-bucket
con el prefijo customer-a/invoices/
:
Completa: condición que comprueba el nombre del recurso y el prefijo
resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/') || api.getAttribute('storage.googleapis.com/objectListPrefix', '') .startsWith('customer-a/invoices/')
Ahora puede usar esta condición en un límite de acceso de credenciales:
{
"accessBoundary": {
"accessBoundaryRules": [
{
"availablePermissions": [
"inRole:roles/storage.objectViewer"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket",
"availabilityCondition": {
"expression":
"resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/') || api.getAttribute('storage.googleapis.com/objectListPrefix', '').startsWith('customer-a/invoices/')"
}
}
]
}
}
Siguientes pasos
- Consulta cómo crear una credencial de corta duración con permisos limitados.
- Consulta información sobre el control de acceso de Cloud Storage.
- Consulta los permisos de cada rol predefinido.
- Consulta información sobre los roles personalizados.