Control de carpetas compartidas
Compartir una carpeta en una red LAN tiene múltiples beneficios. En primer lugar, permite que equipos con sistemas operativos diferentes puedan acceder y compartir archivos en un almacenamiento centralizado. Y para esto, Linux tiene la aplicación Samba, que ofrece un alto grado de flexibilidad, ya que cualquier carpeta puede compartirse con distintos niveles de permisos, dependiendo del usuario o grupo.
Samba es capaz de brindar control sobre quién puede acceder, leer o modificar los archivos en el recurso de almacenamiento, e incluso puede integrarse con redes existentes, que otros servicios, como Active Directory (AD), facilitando la administración centralizada de usuarios.
Entrando en materia, en muchas pequeñas y medianas empresas que usan grupos de trabajo (workgroups), es común tener una carpeta pública sin restricciones para compartir archivos, que suele llamarse “compartida”. Esto no es tan habitual en empresas que utilizan AD, ya que el acceso está condicionado por las políticas del dominio y la autenticación centralizada, lo que puede dificultar abrirla libremente.
Para configurar esta política, simplemente podemos agregarle a
smb.conf
de Samba lo siguiente:
[compartida] comment = compartida path = /home/user/compartida guest ok = yes guest only = yes browseable = yes writable = yes create mask = 0777 directory mask = 0777 public = yes force user = user vfs objects = full_audit
Sin embargo, supongamos que queremos llevar un monitoreo estricto de lo que ocurre dentro de esta carpeta. Para ello, Samba ofrece la opción
full_audit
, que permite registrar todas las acciones realizadas por los usuarios. Ya hemos hablado de esta funcionalidad en una publicación anterior -donde también explicamos cómo configurar una papelera de reciclaje para los archivos eliminados por los usuarios- y puede ser consultado AQUÍ.
No obstante, si no se impone cierto orden dentro de la carpeta compartida, cada usuario comenzará a guardar archivos en cualquier parte, generando un desorden que dificultará encontrar documentos específicos. Para evitar este caos, una solución práctica es clasificar los archivos creando subcarpetas por tipos o áreas de trabajo. Por ejemplo:
COMPARTIDA/ ├── DIRECCION/ │ ├── file1.txt │ ├── file2.ppt │ ├── FOO/ │ │ └── file3.mp4 │ └── BAR/ │ ├── file4.xlsx │ └── file5.pdf └── PROYECTOS/ ├── file6.csv └── FRED/ └── file7.docx
De esta manera, cada área gestionará su propia carpeta y, dentro de ella, cada usuario podrá crear su propia sub carpeta personal. Así, encontrar un archivo o carpeta será más fácil y rápido.
Ahora bien, aunque esta estructura suena ordenada y eficiente, no impide que un usuario, ya sea por error o con mala intención, elimine una carpeta importante. Si bien esta acción quedaría registrada en los logs de auditoría, el administrador del sistema podría tardar un tiempo indefinido en detectarla y revertir la situación.
En este orden de ideas, el camino más sensato es otorgar permisos específicos a las carpetas para prevenir este tipo de incidentes. Sin embargo, los permisos tradicionales de archivos en Linux, al aplicarse de forma global a nivel de usuario o grupo, no permiten establecer restricciones tan granulares como, por ejemplo, evitar que un usuario pueda eliminar o renombrar una carpeta sin impedirle modificar su contenido. Esta limitación representa un desafío cuando se busca un control más fino sobre las acciones permitidas dentro de una estructura compartida.
Otro problema que puede surgir con esta estructura es el del almacenamiento en disco. Una carpeta pública sin control de uso puede convertirse rápidamente en un riesgo: un solo usuario podría transferir archivos de gran tamaño y llenar el espacio disponible, dejando a los demás sin recursos para trabajar.
Para evitar este escenario, Linux ofrece varias soluciones. Una de ellas es el uso de cuotas de disco (
quota
), que permite asignar un límite de espacio por usuario o grupo, evitando así que alguien consuma más allá de lo permitido. Otra alternativa más controlada es crear imágenes de disco individuales por carpeta (por ejemplo, usando dd
o fallocate
) y montarlas como sistemas de archivos independientes. De este modo, cada área, grupo o usuario, tendría un volumen con un límite de espacio claramente definido, lo que facilita la gestión y protege al sistema principal de llenarse por completo.
Si bien las cuotas de disco y el uso de imágenes montadas son soluciones efectivas para controlar el almacenamiento, ambas presentan ciertas desventajas que deben tenerse en cuenta.
En el caso de las cuotas de disco, su configuración puede resultar compleja, especialmente en sistemas que ya están en producción. Requiere habilitar el soporte de cuotas en el sistema de archivos, editar archivos de configuración, y reiniciar servicios o incluso el sistema. Además, las cuotas están vinculadas a usuarios o grupos, no a carpetas específicas, lo que puede ser una limitación cuando se desea restringir el espacio por carpeta compartida sin importar quién escriba en ella.
Por otro lado, el uso de imágenes de disco montadas ofrece mayor control por carpeta, pero implica una administración más manual. Es necesario crear, formatear y montar cada imagen por separado, y monitorear que no se llenen completamente. Además, al estar montadas como volúmenes independientes, su ampliación no es tan flexible como aumentar un directorio común: hay que desmontar la imagen, redimensionarla y volver a montarla, lo cual puede requerir tiempos de inactividad, por no mencionar el riesgo que conlleva manipular imágenes que pueden corromperse, trayendo consigo la pérdida total de la información.
En resumen, ambas soluciones son válidas, pero su implementación y mantenimiento requieren planificación y una administración técnica más rigurosa e intervención manual.
Ante esto nos dimos a la tarea de buscar un punto medio a esta problemática, simple, automatizado y programable, y es la que traemos hoy.
Permisos
Asumiendo que ya tenemos nuestra carpeta pública compartida y correctamente configurada en Samba —incluyendo las opciones
full_audit
y recycle
, (con los permisos adecuados chmod 755
) así como la estructura de carpetas por áreas (con los permisos adecuados chmod 777
)—, el primer paso será asignar el control de estas carpetas al usuario root
y al grupo sambashare
. Para ello, ejecutamos el siguiente comando:
sudo find /home/user/COMPARTIDA -type d -exec chown root:sambashare {} +
Con esta acción, protegemos tanto la carpeta principal COMPARTIDA como las sub carpetas creadas por el administrador del sistema contra eliminaciones accidentales o malintencionadas por parte de los usuarios y se restringe su manipulación directa, manteniendo mayor control ciertos sobre elementos críticos dentro de la carpeta compartida, sin afectar lo que los usuarios puedan hacer dentro de esas sub carpetas.
Y asegúrese de que su usuario linux, donde corre Samba, pertenezca a este grupo:
sudo usermod -aG sambashare $USER
Concluido este primer paso, pasamos al segundo: bash script para automatizar el proceso.
Loop
Hemos creado el bash script
watchdir.sh
, que se controla con start|stop|status
, que puede ejecutarse o no con sudo
, y su propósito es controlar la asignación de espacios por carpetas y la acción a tomar si sobrepasa este límite.
Por ejemplo, si tenemos un almacenamiento (HDD|SSD) de 500 GB destinado para la unidad compartida, (un disco duro montado en
/home/$USER/compartida
), y dentro de esta tenemos 5 sub carpetas, podemos establecer inicialmente en la variable LIMIT
50 GB por carpeta (50% de su capacidad), dejando un remanente para la papelera de reciclaje y otras carpetas que más adelante querramos crear o ampliar la capacidad de las existentes. Ejemplo:
LIMIT=$((50*1024*1024*1024))
Tambien definimos las carpetas a vigilar:
# Carpetas a monitorear (sepárelas con espacios si son múltiples) WATCH_DIR="/home/user/COMPARTIDA/dir1 /home/user/COMPARTIDA/dir2"
Un caso real podría ser:
# To monitor subfolders inside a parent folder: MAINDIR="/home/user/COMPARTIDA" # Subfolder names (separate with spaces if multiple): SUBDIRS="IMAGENES PROYECTOS RECURSOS SOPORTE DIRECCION" WATCH_DIR="" for d in $SUBDIRS; do WATCH_DIR+="$MAINDIR/$d " done WATCH_DIR="${WATCH_DIR% }"
El script tiene una variable llamada
DELETE_DIR
, que, si no existe, lanzará un menú:
![]() |
Si no existe el path de la variable DELETE_DIR, el script preguntará |
- Eliminarlos definitivamente
- Enviarlos a la papelera de reciclaje
- Enviarlos a una carpeta (hay que escribir el path completo manualmente o establecerlo en la variable
DELETE_DIR
)
Nota:
Se recomienda que el path definido en
DELETE_DIR
esté en una ubicación diferent al path definido en WATCH_DIR
Finalmente, una vez iniciado, el script monitorea estas carpetas con inotifywait, un sencillo programa que monitoriza eventos del sistema de archivos y toma la acción establecida al llegar al límite, impidiendo de esta manera que los usuarios sigan escribiendo en la carpeta.
Y si tiene definidas las variables
WATCH_DIR
y DELETE_DIR
, y el path existe, entonces el menú interactivo no saldrá, por tanto puede programar el script en el cron
(programador de tareas de linux) para que inicie con el sistema.
@reboot /path_to/watchdir.sh start
Nota:
Si no desea aplicar la propiedad
root:sambashare
ni establecer permisos 755 a la carpeta compartida, pero aún quiere conservar ordenada la estructura que ha definido, puede programar la ejecución del siguiente script en cron
, cada minuto. Este script moverá automáticamente a la papelera cualquier archivo o carpeta no autorizada que los usuarios creen en la raíz de la carpeta compartida. Asegúrese de ajustar las rutas y nombres de las carpetas según su configuración:
#!/bin/bash # Detectar usuario local con sesión activa local_user=$(who | awk '/(:0)/ {print $1; exit} END {if (NR==0) print $1}') # Definir rutas SHAREDFOLDER="/home/$local_user/COMPARTIDA" # Esta carpeta debe ser creada automáticamente por Samba mediante el módulo VFS (vfs_recycle) y tener la línea "hide files = /recycle/" # consulte https://www.maravento.com/2021/12/samba-full-audit.html RECYCLEFOLDER="$SHAREDFOLDER/recycle" # Ir a la carpeta compartida cd "$SHAREDFOLDER" || exit 1 # Mover todo lo que no sea una carpeta estándar a la papelera find . -maxdepth 1 -mindepth 1 \ ! -name "IMAGENES" \ ! -name "PROYECTOS" \ ! -name "RECURSOS" \ ! -name "SOPORTE" \ ! -name "DIRECCION" \ ! -name "recycle" \ -exec mv -f --backup=numbered "{}" "$RECYCLEFOLDER/" \; # Volver al home cd ~
Post a Comment