Conceder y obtener acceso a segmentos de almacenamiento

En esta página se explica cómo gestionar el acceso a los contenedores de almacenamiento de los proyectos aislados de Google Distributed Cloud (GDC) para que las personas adecuadas tengan los permisos correctos. En él se explican los requisitos previos y los pasos para obtener y conceder acceso a usuarios y cuentas de servicio mediante vinculaciones de roles y roles predefinidos. Esta información te permite controlar de forma eficaz el acceso a tus recursos de almacenamiento y mantener tanto la seguridad como la eficiencia operativa.

Esta página está dirigida a audiencias como administradores de TI del grupo de operadores de infraestructuras o desarrolladores del grupo de operadores de aplicaciones que gestionan la configuración de acceso de los contenedores de almacenamiento en entornos aislados de GDC. Para obtener más información, consulta Audiencias de la documentación de GDC air-gapped.

Antes de empezar

Un espacio de nombres de proyecto gestiona los recursos de los contenedores en el servidor de la API Management. Debes tener un proyecto para trabajar con los contenedores y los objetos.

Conceder acceso al segmento

Puedes proporcionar acceso a un segmento a otros usuarios o cuentas de servicio creando y aplicando RoleBindings con roles predefinidos en el servidor de la API Management.

Funciones predefinidas

  • project-bucket-object-viewer: permite a un usuario enumerar todos los segmentos del proyecto, enumerar los objetos de esos segmentos y leer objetos y metadatos de objetos. No te permite escribir operaciones en objetos. Por ejemplo, subir, sobrescribir o eliminar. Tiene acceso de solo lectura a los segmentos de doble zona de la organización y sus proyectos, así como a los objetos de esos segmentos.

  • project-bucket-object-admin: permite a un usuario enumerar todos los segmentos del proyecto y realizar operaciones de lectura y escritura en objetos. Por ejemplo, subir, sobrescribir o eliminar. Tiene acceso de solo lectura a los segmentos de doble zona de la organización y sus proyectos, así como acceso de lectura y escritura a los objetos de esos segmentos.

  • project-bucket-admin: permite a los usuarios gestionar todos los contenedores del espacio de nombres dado, así como todos los objetos de esos contenedores. Tiene acceso de solo lectura a los segmentos de doble zona de la organización y sus proyectos, así como acceso de lectura y escritura a los objetos de esos segmentos.

Para ver una lista completa de los permisos concedidos para los roles anteriores, consulta la sección Permisos de roles predefinidos.

Pide al administrador de gestión de identidades y accesos de tu proyecto que te conceda permisos para crear RoleBindings. A continuación, se muestra un ejemplo de cómo crear un RoleBinding para conceder acceso a un usuario y a una cuenta de servicio:

  1. Crea un archivo YAML en tu sistema, como rolebinding-object-admin-all-buckets.yaml.

    # Example file name:
    # rolebinding-object-admin-all-buckets.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: NAMESPACE_NAME
      name: readwrite-all-buckets
    roleRef:
      kind: Role
      name: project-bucket-object-admin
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      namespace: NAMESPACE_NAME
      name: SA_NAME
    - kind: User
      namespace: NAMESPACE_NAME
      name: bob@example.com
      apiGroup: rbac.authorization.k8s.io
      # Could be bob or bob@example.com based on your organization settings.
    
  2. Aplica el archivo YAML:

    kubectl apply \
    -f rolebinding-object-admin-all-buckets.yaml
    

Obtener credenciales de acceso al segmento

Cuando concedas acceso a un segmento, se crearán las credenciales de acceso en un secreto.

El formato del nombre del secreto es object-storage-key-STORAGE_CLASS-SUBJECT_TYPE-SUBJECT_HASH.

  • Los valores de STORAGE_CLASS son los siguientes:
    • std para la clase de almacenamiento Standard.
  • Los valores de SUBJECT_TYPE son los siguientes:
    • user para User.
    • sa para ServiceAccount.
  • SUBJECT_HASH es el hash SHA256 codificado en base32 del nombre del asunto.

Por ejemplo, el usuario bob@foo.com tiene un secreto llamado:

object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama

Obtener credenciales de acceso de usuario

En el caso de un usuario, el secreto se encuentra en el espacio de nombres object-storage-access-keys del servidor de la API Management.

  1. Ejecuta el siguiente comando para enumerar los recursos Secret que tienes permiso para ver en el espacio de nombres object-storage-access-keys:

    kubectl auth can-i --list --namespace object-storage-access-keys
    
    • NOTA: Si eres administrador y tienes permiso para ver todos los recursos Secret o suplantar la identidad de otros usuarios, puedes ejecutar uno de los siguientes comandos para encontrar el nombre de los secretos de un usuario específico:

      Lista todos los secretos que pertenecen a un usuario específico:

      export USER_NAME=bob@example.com
      kubectl get secrets --namespace object-storage-access-keys -o json | jq  -r --arg USER_NAME "${USER_NAME:?}" '.items[] | select( (.metadata.annotations."object.gdc.goog/subject"==$USER_NAME)) | .metadata.name'
      

      Suplantar la identidad de un usuario para ver qué secretos puede ver:

      export USER_NAME=bob@example.com
      kubectl auth can-i --list --namespace object-storage-access-keys --as "${USER_NAME:?}"
      

    Si puedes ver algún secreto en este espacio de nombres, deberías ver un resultado que contenga un nombre de secreto similar al siguiente:

    object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama
    
  2. Obtén el contenido del secreto correspondiente:

    kubectl get -o yaml --namespace object-storage-access-keys secret object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama
    

    Recibirás un resultado similar al siguiente:

    data:
      access-key-id: MEhYM08wWUMySjcyMkVKTFBKRU8=
      create-time: MjAyMi0wNy0yMiAwMTowODo1OS40MTQyMTE3MDMgKzAwMDAgVVRDIG09KzE5OTAuMzQ3OTE2MTc3
      secret-access-key: Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==
    
  3. Decodifica el ID de clave de acceso y el secreto:

    echo "MEhYM08wWUMySjcyMkVKTFBKRU8=" | base64 -d \
        && echo \
        && echo "Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==" | base64 -d
    

    Recibirás un resultado similar al siguiente:

    0HX3O0YC2J722EJLPJEO
    Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
    
  4. Sigue las instrucciones de la sección Configurar gcloud CLI con la información resultante.

Obtener acceso a la cuenta de servicio

En el caso de un asunto de cuenta de servicio, el secreto se crea en el mismo espacio de nombres que la cuenta de servicio.

Ejecuta el siguiente comando para verificar que puedes obtener y enumerar recursos Secret en el espacio de nombres. Si no es así, ponte en contacto con tu administrador:

export SA_NAMESPACE=NAMESPACE_NAME
kubectl auth can-i --list --namespace $SA_NAMESPACE

Para encontrar el nombre del secreto, ejecuta el siguiente comando:

export SA_NAME=SA_NAME
kubectl get secrets --namespace $SA_NAMESPACE  -o json | jq  -r --arg USER_NAME "${SA_NAME:?}" '.items[] | select( (.metadata.annotations."object.gdc.goog/subject"==$USER_NAME)) | .metadata.name'

Recibirás un resultado similar al siguiente:

object-storage-key-std-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq

Puedes hacer referencia al secreto en tu pod como variables de entorno o archivos.

Permisos de rol predefinidos

Ten en cuenta que también hay roles predefinidos disponibles en el servidor de la API global para el acceso administrativo y operativo a los contenedores de doble zona.

Permisos project-bucket-object-viewer

Este rol concede permisos para obtener y enumerar objetos y metadatos de objetos en el segmento.

A continuación, se muestra una lista de todos los permisos de almacenamiento de objetos que concede el verbo project-bucket-object-viewer:

  • Permisos de la API de cubos:

    1. get
    2. list
    3. ver
  • Permisos de almacenamiento de objetos de S3:

    1. GetBucketVersioning
    2. GetObject
    3. GetObjectAcl
    4. GetObjectLegalHold
    5. GetObjectRetention
    6. GetObjectTagging
    7. GetObjectVersion
    8. GetObjectVersionTagging
    9. ListBucket
    10. ListBucketVersions
    11. ListBucketMultipartUploads
    12. ListMultipartUploadParts

Permisos project-bucket-object-admin

Este rol concede permisos para colocar y eliminar objetos, versiones de objetos y etiquetas en el segmento. Además, también concede todos los permisos de project-bucket-object-viewer.

A continuación, se muestra una lista de todos los permisos de almacenamiento de objetos adicionales que concede el rol:

  • Permisos de almacenamiento de objetos de S3:

    1. AbortMultipartUpload
    2. DeleteObject
    3. DeleteObjectTagging
    4. DeleteObjectVersion
    5. DeleteObjectVersionTagging
    6. PutObject
    7. PutObjectTagging
    8. PutObjectVersionTagging
    9. PutOverwriteObject
    10. RestoreObject

Permisos project-bucket-admin

Este rol otorga permisos para crear, actualizar o eliminar recursos de segmento en el espacio de nombres del proyecto. Además, también otorga todos los permisos de project-bucket-object-admin.

A continuación, se incluye una lista de permisos adicionales que concede el rol:

  • Permisos de la API de cubos:

    1. Crear
    2. Actualizar
    3. Eliminar