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

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 segmentos y objetos.

Conceder acceso al segmento

Puedes proporcionar acceso a un bucket a otros usuarios o cuentas de servicio creando y aplicando RoleBindings con roles predefinidos.

Funciones predefinidas

  • project-bucket-object-viewer: este rol permite a un usuario enumerar todos los segmentos del proyecto, enumerar los objetos de esos segmentos y leer objetos y metadatos de objetos. Este rol no te permite realizar operaciones de escritura en objetos, como subir, sobrescribir o eliminar.

  • project-bucket-object-admin: este rol permite a un usuario enumerar todos los segmentos del proyecto y realizar operaciones de lectura y escritura en objetos, como subir, sobrescribir o eliminar.

  • project-bucket-admin: este rol permite a los usuarios gestionar todos los contenedores del espacio de nombres indicado, así como todos los objetos de esos contenedores.

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

Para obtener los permisos que necesitas para crear enlaces de roles de proyecto, pide al administrador de gestión de identidades y accesos del proyecto que te conceda el rol Administrador de gestión de identidades y accesos de proyectos (project-iam-admin).

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.

     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
    

Obtener credenciales de acceso a un segmento

Cuando concedes 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: el ServiceAccount.
  • SUBJECT_HASH es el hash SHA256 codificado en base32 del nombre del asunto.

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

object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja

Acceder al secreto 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. Busca el nombre secreto:

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

    Recibirá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 secreto correspondiente para acceder a los contenedores:

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

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

Acceder al secreto de 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. 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}'

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 (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 rol predefinidos

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

Permisos project-bucket-object-viewer

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

El rol project-bucket-object-viewer tiene los siguientes permisos:

  • Permisos de la API de cubos:

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

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

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 project-bucket-admin

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

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

  • Permisos de la API de cubos:

    1. Crear
    2. Actualizar
    3. Eliminar