Archivos accesibles por varias vías …

… para facilitar la conexión desde múltiples dispositivos.

Todo comienza cuando me encuentro con un puñado de archivos y directorios que necesito compartir de unas máquinas a otras, algunas con acceso temporal a la red, y para los que veo un engorro tener que montar un sistema de identificación de usuarios.

Es como una zona salvaje, de tránsito, donde poder guardar y recuperar cosas, pero que tendrá acceso desde diferentes arquitecturas y programas. Por ello pretendo que exista una cuenta en el sistema que alojará el contenido con el menor privilegio posible y que todos los programas la empleen de alguna forma para no tener demasiados forcejeos cuando llegue el momento de usarla.

Con este enfoque me encuentro con que, dado que  en un sistema Linux básico los privilegios se asocian a un usuario y a su grupo, tendré que asegurarme de que todo el contenido que se creen en esta zona tenga siempre la misma propiedad y los mismos derechos.

De momento pretendo que el contenido sea accesible de las siguientes formas:

  • SMB/CIFS para redes Windows
  • rsync para el ejecutable del mismo nombre y programas similares de copia.
  • WebDAV para accesos desde clientes DAV o HTTP.
  • FTP anónimo de toda la vida.

Los archivos

Una vez que he elegido un punto raíz para los archivos (/srv/repositorios) necesito prepararlo para que el resto de los servicios accedan a él.

Primero creamos un usuario y un grupo a los que asignar la propiedad del contenido:

$ sudo addgroup archivos
$ sudo adduser --home /srv/repositorios --ingroup archivos archivos 
Introduzca la nueva contraseña de UNIX: 
Vuelva a escribir la nueva contraseña de UNIX: 
passwd: contraseña actualizada correctamente
Cambiando la información de usuario para archivos
Introduzca el nuevo valor, o pulse INTRO para usar el valor predeterminado
        Nombre completo []: Archivos
        Número de habitación []: 
        Teléfono del trabajo []: 
        Teléfono de casa []: 
        Otro []: 
¿Es correcta la información? [S/n] s

Después preparamos el directorio con los permisos suficientes para conservar la propiedad y los modos cuando se le añada contenido:

$ sudo install -d -o archivos -g archivos -m 6770 /srv/repositorios 
$ sudo -lda /srv/repositorios
drwsrws--- 2 archivos archivos 4096 mar  1 09:40 /srv/repositorios
$

Los bits SUID y SGID añadidos al directorio raíz se aplicarán a los directorios pero no a los archivos. O sí, pero estarán condicionados por el valor de umask que como valor predeterminado suele ser 0022. Necesitamos que quede en 0002 y para eso empleamos el módulo libpam-umask que en Debian viene incluído en el paquete libpam-modules, con la siguiente estrofa añadida al archivo /etc/pam.d/common-session:

# and here are more per-package modules (the "Additional" block)
...
session optional        pam_umask.so umask=0002
# end of pam-auth-update config

Hay otras posibilidades para definir este valor pero por el momento nos quedamos con ésta.

SMB/CIFS

O lo que viene siendo los recursos de red compartidos de las redes Windows, que en Linux están representado por el paquete Samba.

Para que podamos tener acceso a este recurso vamos a definir un share en el archivo de configuración /etc/samba/smb.conf de la siguiente forma:

[public]
        comment = Programas y documentos públicos
        path = /srv/repositorios/public
        force user = archivos
        force group = archivos
        read only = No
        force create mode = 0660
        force directory mode = 0770
        guest ok = Yes

rsync

El protocolo rsync es útil y sólido. Admite accesos directos al servidor o indirectos vía SSH lo que le hace muy versátil. Es también la base de muchos programas de copias de seguridad, el protocolo de sincronización quiero decir, así que termina siendo un recurso muy útil.

La configuración mínima en mi caso sería un archivo /etc/rsyncd.conf como el siguiente:

uid = archivos
gid = archivos
use chroot = yes

[public]
        path = /srv/repositorios/public
        comment = Archivos públicos 
        list = yes

 

WebDAV

Esta parte es más delicada y, como explico más adelante, casi anecdótica puesto que un acceso vía web sin protección llega a ser bastante peligroso en un servidor. Por eso la configuración que describo a continuación es adecuada para uso interno y no debe entenderse como segura ni por asomo. Es más, posiblemente sólo sirva para salir de un apuro porque el servidor web donde voy a hacerlo funcionar lo hace bajo un único usuario y éste suele ser de muy baja acreditación. Hacer que lea los archivos es sencillo, que escriba no tanto.

El servidor web Apache dispone de módulos que permiten convertirlo en un servidor DAV y que son bastante sencillos de configurar; los pasos a seguir son los siguientes:

  1. Activar los módulos dav y dav_fs (uno depende de otro).
  2. Configurar una localización sobre la que tienen que funcionar.
  3. Situar al usuario del servidor web en el grupo correspondiente para que tenga acceso de escritura.

Los aspectos negativos son los siguientes:

  1. No se puede indicar los permisos de creación de archivos ni directorios.
  2. No se puede limitar el acceso a subdirectorios concretos.

La configuración mínima es la siguiente:

<VirtualHost *:443>
        ServerName      backups.empresa.net
        ServerAdmin     root@empresa.net

        DavLockDB       /var/www/DavLock

        Alias /webdav   /srv/repositorios/public

        <Directory /srv/repositorios/public>
                Require all granted
                DAV     On
        </Directory>

        <Location /webdav>
                Require all granted
                # make it Browser readonly
                # https://www.d7031.de/content/apache-webdav-read-write-permissions/
                Options +Indexes
                IndexIgnore ..
                IndexOptions -IconsAreLinks NameWidth=* FancyIndexing SuppressLastModified FoldersFirst
                IndexOrderDefault Ascending Name
        </Location>
        ...
</VirtualHost> 

FTP

El acceso FTP anónimo es un mecanismo antiguo y muy fiable. Para darle servicio he elegido el programa vsftpd porque es bastante sencillo de configurar para lo que pretendo.

De hecho la configuración básica está en el archivo /etc/vsftpd.conf y la que me sirve es:

# Directivas obligatorias
listen=yes
anonymous_enable=yes
anon_root=/srv/repositorios/public
write_enable=YES
local_umask=002
anon_upload_enable=YES
anon_mkdir_write_enable=YES
nopriv_user=archivos
chroot_local_user=YES

# Directivas opcionales 
anon_max_rate=2048000
xferlog_enable=YES

 

Enlaces y referencias