Tenemos un entorno de unos pocos miles de usuarios que ejecutan aplicaciones en aproximadamente 40 clústeres que varían en tamaño desde 20 nodos de cómputo hasta 98,000 nodos de cómputo. Los usuarios de estos sistemas generan archivos masivos (a veces> 1PB) controlados por los permisos tradicionales de Unix (las ACL generalmente no están disponibles o son prácticas debido a la naturaleza especializada del sistema de archivos).
Actualmente tenemos un programa llamado "dar", que es un programa suid-root que permite a un usuario "dar" un archivo a otro usuario cuando los permisos de grupo son insuficientes. Entonces, un usuario escribiría algo como lo siguiente para dar un archivo a otro usuario:
> give username-to-give-to filename-to-give ...
El usuario receptor puede usar un comando llamado "take" (parte del programa give) para recibir el archivo:
> take filename-to-receive
Los permisos del archivo se transfieren efectivamente al usuario receptor.
Este programa ha existido durante años y nos gustaría revisar las cosas desde un punto de vista funcional y de seguridad.
Nuestro plan de acción actual es eliminar la putrefacción de bits en nuestra implementación actual de "dar" y empaquetarlo como una aplicación de código abierto antes de volver a implementarlo en producción.
¿Alguien tiene otro método que usan para transferir archivos extremadamente grandes entre usuarios cuando solo están disponibles los permisos tradicionales de Unix?
fuente
chown
debe hacerlo. Parece que también desea copiar el archivo, una vez que ambas partes involucradas hayan acordado.Respuestas:
Si el emisor está realmente dispuesto a entregar el archivo, puede usar un binario SUID que mueva el archivo a un directorio que todos puedan escribir y tenga el bit adhesivo (como
/tmp
), luego cambie la propiedad al nuevo propietario.chown(3)
ya se encarga de eliminar los bitsset-user-ID
yset-group-ID
para usted. De esta manera, el nuevo propietario puede hacer lo que quiera con el archivo, incluido moverlo.Este directorio que todos pueden escribir puede pertenecer al directorio de inicio del usuario, en caso de que desee utilizar varios sistemas de archivos para directorios de inicio y asegurarse de no cruzar los límites del sistema de archivos, ya que el rendimiento sería inmediatamente terrible. En este caso, probablemente querrá asegurarse de que el destinatario sepa cuándo se ofrece un nuevo archivo.
Los correos electrónicos harían el truco. Una solución más de Unixy sería una
/etc/profile
lista de sus archivos recién entregados. Bonificación adicional si ofrece esta función conpam_echo
( por ejemplofile=/tmp/deliveries/%u
, con , verpam_echo(8)
). Al igual que con cualquier cosa relacionada con PAM, querrá verificar que todas sus implementaciones ofrezcan dicho módulo primero.fuente
Podría usar un sistema con un directorio compartido (posiblemente sin permisos de ejecución), donde las cosas para un usuario determinado se archivan con una estructura de nombre de archivo específica (
to-$username_from-$username.tar
por ejemplo). Give hace el archivo ychowns
lo envía al usuario objetivo; tomar extrae el archivo y lo elimina.Si desea hacerlo como un movimiento real (es decir, cambiar la ubicación y los permisos del archivo; no se debe copiar debido al tamaño de archivo gigante), es posible que pueda moverse a un directorio compartido con permisos -x (para que nadie pueda lista de archivos allí), y el mismo
chown
método.mv
,chown
/mv
.fuente
Como dice xryl669, puede usar un directorio para compartir realmente los archivos. Debe tener un aspecto como este:
El comando dar se convierte
El comando take se parece a esto:
fuente
Sugeriría reescribir la aplicación para imitar un "dar" y "tomar", sino "empujar" y "tirar" de un directorio protegido. Su directorio solo puede ser accesible para la aplicación push / pull, que maneja los movimientos del archivo. Alternativamente, su aplicación / script puede crear un directorio temporal aleatorio con permisos establecidos solo para el remitente y el receptor.
¿Desea tener más seguridad? Puede encriptar / firmar PGP el archivo (usando la clave pública del receptor).
En términos de rehacerlo desde un "punto de vista funcional y de seguridad", sugiero encarecidamente no crear programas SUID. Si no elimina los privilegios de manera adecuada, puede acceder virtualmente a cualquier archivo en el sistema. Si su programa tiene errores (desbordamiento del búfer, etc.), se puede aprovechar esto para obtener acceso a la raíz en su sistema.
fuente
Probablemente no le sirva de nada, pero para referencia cp --reflink source target hace copias delgadas de archivos usando copy-on-write.
Esto significa que puede copiar el archivo directamente y solo se copiarán los bloques modificados. A diferencia de un enlace rígido, el nuevo archivo tiene su propio inodo y metadatos, lo que significa que puede proporcionar la copia del archivo al nuevo usuario utilizando material estándar.
Hasta donde sé, esta es una característica que solo está disponible en OCFS2 y btrfs actualmente. Supongo que eso resuelve su problema, pero dado que la disponibilidad no está muy extendida, probablemente no sea útil.
fuente