Cómo otorgar y obtener acceso al bucket de almacenamiento

En esta página, se explica cómo administrar el acceso a los buckets de almacenamiento en los proyectos aislados de Google Distributed Cloud (GDC), de modo que las personas adecuadas tengan los permisos correctos. En esta guía, se explican los requisitos previos y los pasos para obtener y otorgar acceso a cuentas de usuario y de servicio con vinculaciones de roles y roles predefinidos. Esta información te permite controlar de manera eficaz el acceso a tus recursos de almacenamiento y mantener la seguridad y la eficiencia operativa.

Esta página está destinada a públicos como los administradores de TI dentro del grupo de operadores de infraestructura o los desarrolladores dentro del grupo de operadores de aplicaciones que administran la configuración de acceso para los buckets de almacenamiento en entornos aislados de GDC. Para obtener más información, consulta Audiences for GDC air-gapped documentation (Públicos para la documentación de GDC aislada del aire).

Antes de comenzar

Un espacio de nombres del proyecto administra los recursos del bucket en el servidor de la API de Management. Debes tener un proyecto para trabajar con buckets y objetos.

Cómo otorgar acceso al bucket

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

Funciones predefinidas

  • project-bucket-object-viewer: Permite que un usuario enumere todos los buckets del proyecto, enumere los objetos de esos buckets y lea los objetos y los metadatos de los objetos. No te permite escribir operaciones en objetos. Por ejemplo, subir, borrar o reemplazar archivos Tiene acceso de solo lectura a los buckets de doble zona dentro de la organización y sus proyectos, así como acceso de solo lectura a los objetos de esos buckets.

  • project-bucket-object-admin: Permite que un usuario cree una lista de todos los buckets del proyecto y realice operaciones de lectura y escritura en los objetos. Por ejemplo, subir, borrar o reemplazar archivos Tiene acceso de solo lectura a los buckets de doble zona dentro de la organización y sus proyectos, así como acceso de lectura y escritura a los objetos de esos buckets.

  • project-bucket-admin: Permite a los usuarios administrar todos los buckets en el espacio de nombres determinado, así como todos los objetos en esos buckets. Tiene acceso de solo lectura a los buckets de doble zona dentro de la organización y sus proyectos, así como acceso de lectura y escritura a los objetos de esos buckets.

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

Pídele al administrador de IAM del proyecto que te otorgue permisos para crear RoleBindings. A continuación, se muestra un ejemplo de cómo crear un RoleBinding para otorgar 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
    

Obtén credenciales de acceso al bucket

Una vez que otorgas acceso a un bucket, se crean las credenciales de acceso en un Secret.

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 el usuario.
    • sa para ServiceAccount.
  • SUBJECT_HASH es el hash SHA256 codificado en base32 del nombre del sujeto.

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

object-storage-key-std-user-l74gbpyrsbmwy4mivocr3nur6dzrnhcfhe3otyplul42i732aama

Obtén credenciales de acceso del usuario

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

  1. Ejecuta el siguiente comando para enumerar los recursos de 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 de Secret o suplantar la identidad de otros usuarios, puedes ejecutar uno de los siguientes comandos para encontrar el nombre de los Secrets de un usuario específico:

      Enumera todos los Secrets que pertenecen a un usuario especificado:

      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'
      

      Para suplantar la identidad de un usuario y ver qué Secrets puede ver, haz lo siguiente:

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

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

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

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

    Obtendrá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
    

    Obtendrás un resultado similar al siguiente:

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

Obtén acceso a la cuenta de servicio

En el caso de un sujeto de cuenta de servicio (SA), 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 de Secret en el espacio de nombres. Si no es así, comunícate con tu administrador:

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

Para encontrar el nombre del Secret, 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'

Obtendrás un resultado similar al siguiente:

object-storage-key-std-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq

Puedes hacer referencia al Secret en tu Pod como variables de entorno o archivos.

Permisos de roles predeterminados

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

Permisos de project-bucket-object-viewer

Este rol otorga permisos para obtener y enumerar objetos y sus metadatos en el bucket.

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

  • Permisos de la API de Bucket:

    1. get
    2. list
    3. watch
  • 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 de administrador de objetos y bucket del proyecto

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

A continuación, se incluye una lista de todos los permisos adicionales de almacenamiento de objetos que otorga 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 de administrador de bucket del proyecto

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

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

  • Permisos de la API de Bucket:

    1. Crear
    2. Actualizar
    3. Borrar