Resolución de problemas de acceso de usuarios que no son root a archivos en IBM Cloud

Resuelve los problemas de acceso de usuarios que no sean root a los archivos subidos a IBM Cloud cuando utilices en runAsUser la implementación de tu aplicación, incluidos los permisos.

Nube privada virtual Infraestructura clásica

Ha subido archivos a la instancia de servicio de IBM Cloud Object Storage utilizando la consola o la API REST. Cuando intenta acceder a estos archivos con un usuario no root que ha definido con runAsUser en el despliegue de la app, se deniega el acceso a los archivos.

En Linux, un archivo o un directorio tienen tres grupos de acceso: Owner, Group y Other. Cuando sube un archivo a IBM Cloud Object Storage mediante la consola o la API REST, se eliminan los permisos de Owner, Group y Other. El permiso de cada archivo tiene el aspecto siguiente:

d--------- 1 root root 0 Jan 1 1970 <file_name>

Cuando carga un archivo utilizando el plugin de IBM Cloud Object Storage, los permisos para el archivo se conservan y no se modifican.

Para acceder al archivo con un usuario no root, el usuario no root debe tener permisos de lectura y escritura en el archivo. Para cambiar el permiso de un archivo como parte del despliegue de pod, es necesaria una operación de grabación. IBM Cloud Object Storage no está diseñado para cargas de trabajo de grabación.

La actualización de permisos durante el despliegue de pod puede impedir que el pod pase a un estado Running.

Para resolver este problema, antes de montar la PVC en el pod de la app, cree otro pod para establecer el permiso correcto para el usuario no root.

  1. Para comprobar los permisos de los archivos del grupo, cree un archivo de configuración para el pod test-permission y asigne un nombre al archivo test-permission.yaml.

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-permission
    spec:
      containers:
      - name: test-permission
         image: nginx
         volumeMounts:
         - name: cos-vol
         mountPath: /test
      volumes:
      - name: cos-vol
         persistentVolumeClaim:
         claimName: <pvc_name>
    
  2. Cree el pod test-permission.

    oc apply -f test-permission.yaml
    
  3. Inicie una sesión en el pod.

    oc exec test-permission -it bash
    
  4. Vaya a la vía de acceso de montaje y liste los permisos de los archivos.

    cd test && ls -al
    

    Salida de ejemplo

    d--------- 1 root root 0 Jan 1 1970 <file_name>
    
  5. Suprima el pod.

    oc delete pod test-permission
    
  6. Cree un archivo de configuración para el pod que utilice para corregir los permisos de los archivos y denomínelo fix-permission.yaml.

    apiVersion: v1
    kind: Pod
    metadata:
      name: fix-permission
      namespace: <namespace>
    spec:
      containers:
      - name: fix-permission
        image: busybox
        command: ['sh', '-c']
        args: ['chown -R <nonroot_userID> <mount_path>/*; find <mount_path>/ -type d -print -exec chmod u=+rwx,g=+rx {} \;']
        volumeMounts:
        - mountPath: "<mount_path>"
          name: cos-volume
      volumes:
      - name: cos-volume
        persistentVolumeClaim:
          claimName: <pvc_name>
    
  7. Cree el pod fix-permission.

    oc apply -f fix-permission.yaml
    
  8. Espere a que el pod pase al estado Completed.

    oc get pod fix-permission
    
  9. Suprima el pod fix-permission.

    oc delete pod fix-permission
    
  10. Vuelva a crear el pod test-permission que ha utilizado anteriormente para comprobar los permisos.

    oc apply -f test-permission.yaml
    

Verificar que se han actualizado los permisos de los archivos

  1. Inicie una sesión en el pod.

    oc exec test-permission -it bash
    
  2. Vaya a la vía de acceso de montaje y liste los permisos de los archivos.

    cd test && ls -al
    

    Salida de ejemplo

    -rwxrwx--- 1 <nonroot_userID> root 6193 Aug 21 17:06 <file_name>
    
  3. Suprima el pod test-permission.

    oc delete pod test-permission
    
  4. Monte la PVC en la app con el usuario no root.

Establezca runAsUser y fsGroup en los mismos valores en el YAML de despliegue.

Después de establecer los permisos de archivo correctos en la instancia de servicio de IBM Cloud Object Storage, no suba archivos utilizando la consola o la API REST. Utilice el plugin de IBM Cloud Object Storage para añadir archivos a la instancia de servicio.