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 de dispositivos 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.

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 bucket a otros usuarios o cuentas de servicio creando y aplicando RoleBindings con roles predefinidos.

Funciones predefinidas

  • project-bucket-object-viewer: Este rol permite que un usuario enumere todos los buckets del proyecto, enumere los objetos de esos buckets y lea los objetos y los metadatos de objetos. Este rol no te permite realizar operaciones de escritura en objetos, como subirlos, reemplazarlos o borrarlos.

  • project-bucket-object-admin: Este rol permite que un usuario enumere todos los buckets del proyecto y realice operaciones de lectura y escritura en objetos, como subir, reemplazar o borrar.

  • project-bucket-admin: Este rol permite a los usuarios administrar todos los buckets en el espacio de nombres determinado, así como todos los objetos en esos buckets.

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

Para obtener los permisos que necesitas para crear vinculaciones de roles del proyecto, pídele a tu administrador de IAM del proyecto que te otorgue el rol de administrador de IAM del proyecto (project-iam-admin).

A continuación, se muestra un ejemplo de cómo crear un objeto 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.

     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  # Could be bob or bob@example.com based on your organization settings.
       apiGroup: rbac.authorization.k8s.io
     ```
    
  2. Aplica el archivo YAML:

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

Obtén credenciales de acceso al bucket

Cuando otorgas acceso a un bucket, las credenciales de acceso se crean en un secreto.

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

  • Los valores de SUBJECT_TYPE son los siguientes:
    • user: El usuario
    • sa: Es el ServiceAccount.
  • SUBJECT_HASH es el hash SHA256 codificado en base32 del nombre del sujeto.

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

object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja

Accede al secreto del usuario

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

  1. Busca el nombre del secreto:

    kubectl auth can-i --list --namespace object-storage-access-keys | grep object-storage-key-std
    

    Obtendrás un resultado similar al siguiente:

    secrets        []        [object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja,object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja]        [get]
    
  2. Obtén el contenido del Secret correspondiente para acceder a los buckets:

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

    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 s3cmd con la información resultante.

Accede al secreto de 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. Para encontrar el nombre, ejecuta el siguiente comando:

  kubectl get --namespace NAMESPACE_NAME secrets -o=jsonpath=
  '{.items[?(@.metadata.annotations.object\.gdc\.goog/subject=="SA_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 (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables) o archivos (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod).

Permisos de roles predeterminados

Cuando trabajes con el almacenamiento de objetos, es posible que debas solicitar los siguientes roles.

Permisos de project-bucket-object-viewer

Este rol otorga permisos para obtener y enumerar objetos, y los metadatos de los objetos en el bucket.

La función project-bucket-object-viewer tiene los siguientes permisos:

  • Permisos de la API de Bucket:

    1. Obtener
    2. Lista
    3. Mirar
  • Permisos de almacenamiento de objetos de S3:

    1. GetObject
    2. GetObjectAcl
    3. GetObjectVersion
    4. ListBucket
    5. ListBucketVersions
    6. ListBucketMultipartUploads
    7. 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.

El rol project-bucket-object-admin tiene los siguientes permisos de almacenamiento de objetos:

  • Permisos de almacenamiento de objetos de S3:

    1. AbortMultipartUpload
    2. DeleteObject
    3. PutObject

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.

La función project-bucket-object-admin tiene los siguientes permisos:

  • Permisos de la API de Bucket:

    1. Crear
    2. Actualizar
    3. Borrar