Una solución alternativa con inotifywait en Linux:

Una solución alternativa con inotifywait en Linux:

Debería haber una carpeta TO en Samba-Share, donde todos puedan crear archivos, editarlos y eliminarlos. Pero a un usuario no se le debe permitir leer los archivos que otros han creado.

La idea principal es tener una carpeta donde los estudiantes puedan entregar exámenes y no leer lo que han escrito otros compañeros. No debe haber limitaciones innecesarias. A los estudiantes se les debe permitir crear directorios y copiar sus archivos. Simplemente deben estar separados entre sí y no leer/eliminar archivos de otros.

En Windows, dicha carpeta tendría una ACL similar a:

$ icacls TO
.\TO Everybody: (CI)(Rc,S,RD,WD,AD,X)

Un maestro/propietario tendría permisos de Modificación en dicha carpeta para recopilar todos los datos.

¿Cómo haría para replicar algo similar en Linux con ACL (setfacl, getfacl) o, si es posible, sin usar solo permisos estándar de Linux?

Respuesta1

Responderé mi propia pregunta. Si alguien puede mejorar esta respuesta o tiene algunas preguntas, entonces hágalo. Este problema en particular me ha molestado desde hace bastante tiempo.

Lo que pregunté parece no ser posible con las ACL POSIX según: Permiso Group+rx solo en directorios que usan ACLya que las ACL no pueden distinguir entre archivos y carpetas cuando se aplican derechos heredados.

Mirando más a fondo, se mencionaron dos posibles soluciones:

  • inotify (que usé aquí)
  • bindfs (si alguien intenta esto, publíquelo)

Una solución alternativa con inotifywait en Linux:

Permisos de carpeta

Como root, haga lo siguiente:

Crea la carpeta para compartir:

mkdir fld

Haga que el grupo de carpetas superiores sea el grupo de profesores. El grupo debe existir y ser el grupo principal de profesores.

chown :teach fld

Deje que el grupo sea heredado por todos los archivos/subcarpetas. Esto significa que el profesor debería poder leer/escribir/eliminar

chmod g+s fld 

No permita que otros sobrescriban o eliminen archivos (como los permisos /tmp)

chmod +t fld

Ahora las ACL se configurarán para heredar derechos mínimos en todos los archivos/subcarpetas creados en esta carpeta:

setfacl -m u::rwx,g::rwx,o::rwx,d:u::rwx,d:o::--- fld

La carpeta superior, que debería contener todas las subcarpetas/archivos creados por los estudiantes, debería verse así ahora:

getfacl fld

# file: fld
# owner: root
# group: teach
# flags: -st
user::rwx
group::rwx
other::rwx
default:user::rwx
default:group::rwx
default:other::---

Estos permisos por sí solos tienen algún mérito. Si el script que sigue a continuación no se ejecuta, los permisos de carpeta anteriores permitirán a los estudiantes crear/leer/editar/eliminar sus propios archivos y no hacer eso con los archivos de otros. La carpeta debe comportarse normalmente, es decir, se le permite ver/enumerar todos los archivos. La única limitación es que sólo funciona directamente en esta carpeta, no en subcarpetas. Esto debería ser suficiente para envíos simples de varios archivos por parte de los estudiantes.

Para todas las subcarpetas creadas por los estudiantes se aplica lo siguiente: Los estudiantes se agruparán dentro de "otros", por lo que lo importante es:

default:other::---

Esto significa que no se otorgarán derechos a "otros" sobre los archivos/carpetas de este recurso compartido. La idea es que las carpetas por sí solas deberían obtener rwx en "otros", los archivos no necesitan cambiar los permisos.

inotify-Script: envío_carpeta.sh

Este script debe ser ejecutado por root, el único argumento será esta carpeta, que se acaba de crear arriba. Como ejemplo de cómo ejecutarlo:

submission_folder.sh /path/to/fld

El archivo es ejecutable y tiene este contenido:

#!/bin/bash +x
dir=$1

if [[ -z $dir ]];
then
    echo "Enter path as argument"
    exit
fi
echo "WATCHING: $dir"

# run forever
while true; do

inotifywait -r -q --format %w%f -e create "$dir" | while read f; do 
    echo "- CREATED: $f"
    if [[ -d "${f}" ]] ; then
        echo "FOLDER: ${f}, adding read,write,execute permission"
        chmod o+rwx "${f}"
        stat "${f}"
    else
        echo "FILE: $f, doing noting"
    fi
done

done

Mientras el script se esté ejecutando, actualizará todas las subcarpetas para que obtengan rwx y, por lo tanto, puedan recorrerse y enumerarse.

advertencias:

  • Esto se probó localmente, todavía no en un recurso compartido de samba. Haré esto más tarde, pero debería funcionar ya que tengo la intención de no imponer ninguna restricción en el recurso compartido y dejar que todo sea manejado por el sistema de archivos.

  • Si las carpetas se crean con la carpeta/subcarpeta mkdir -p y ambas aún no existen, se crearán tan rápido que inotify no recibirá una notificación individual y, por lo tanto, no cambiará las carpetas a rwx. Para esas carpetas es como si el script no se estuviera ejecutando. Esto no es un problema per se, ya que los estudiantes tendrán menos derechos, no más, y no debería ser posible hacer trampa.

Notas personales

Creé uncuaderno-ipython(cuaderno de bash, no de Python) con algunas pruebas y funciones de utilidad, si alguien está interesado. Sin embargo, es en parte alemán, ya que me daba pereza volver a hacerlo todo en inglés.

información relacionada