Accés a carpetes personals via WebDav (samba, apache2, SSL, WebDAV, acl, mod_perl)

Objectiu:

Quan es disposen de carpetes personals sovint ens interessa que els usuaris hi puguin accedir des de fora de l’empresa. Utilitzar una VPN (Virtual Private Network) és la opció que molts recomanarien, i nosaltres també, sense dubte. Configurar una VPN, però, suposa problemes per a usuaris finals inexperts. Aquesta solució que presentem permetrà als usuaris accedir als seus arxius utilitzant un navegador Web o bé un client WebDAV estàndard.

Utilitzarem un sistema operatiu GNU/Linux Debian Lenny (5.0). Vegeu aquest tutorial per la instal·lació bàsica.

Adaptar el sistema operatiu:

Caldrà disposar d’una partició del disc que puguem utilitzar amb Access Control Lists (acl). En la instal·lació bàsica que es proposava del sistema operatiu es deixava part del disc lliure per a crear d’altres particions. En aquest cas podem utilitzar la resta del disc per muntar-la a /home amb acl activat. Veurem com fer-ho més endavant en aquesta entrada.

Instal·lació de Samba:

El primer que farem es instal·lar samba i configurar l’exportació de les carpetes personals. Aquesta configuració no és necessària, però permet als usuaris accedir als seus arxius des de la xarxa local, de manera tradicional, on el rendiment serà molt millor.

Instal·lar samba és senzill:

$ apt-get install samba

Modificarem l’arxiu /etc/samba/smb.conf per permetre la compartició de les carpetes dels usuaris (homes). La secció [homes] podria quedar així:

[homes]
    comment = Home Folders
    browseable = no
    read only = no
    create mask = 0700
    directory mask = 0700
    valid users = %S

Aquesta configuració és una mica paranoica però vàlida pels nostres proposits.

Ja podem recarregar el servei samba:

$ /etc/init.d/samba reload

Configurar ACL:

Instal·lem les eines de gestió de permisos extesos:

$ apt-get install acl

Modifiquem l’arxiu /etc/fstab per a activar l’acl de la partició on muntarem les homes. Aquí hi ha un exemple:

$ cat /etc/fstab
/dev/sda1    /         ext3     errors=remount-ro         0     0
/dev/sda3    /home     ext3     defaults,acl              0     1
proc         /proc     proc     rw,nodev,nosuid,noexec    0     0
/dev/sda2    none      swap     sw                        0     2

Es pot veure com la segona línia es munta a /home i te activada l’opció de muntatge acl.

Remuntem la partició:

$ mount -o remount /dev/sda3

La gestió dels permisos extesos es fa d’una manera força senzilla. Les comandes bàsiques són:

Assignar acl a un arxiu o carpeta:

$ setfacl -m [u,g,o]:nom_usuari:[r,w,x] arxiu

Treure acl d’un arxiu o carpeta:

$ setfacl -x [u,g,o]:nom_usuari arxiu

Consultar l’acl d’un arxiu o carpeta:

$ getfacl arxiu

Esborrar tots els atributs acl extesos:

$ setfacl -b arxiu

Assignar una acl per defecte que es propagarà a les noves entrades:

$ setfacl -d -m [u,g,o]:usuari:[r,w,x] arxiu

Configurar Apache2 amb WebDAV:

Per instal·lar apache2 fem:

$ apt-get install apache2

Un cop instal·lat habilitarem una sèrie de mòduls que ens faran falta més endavant. Ho deixem fet per guanyar temps.

$ a2enmod encoding
$ a2enmod headers
$ a2enmod dav
$ a2enmod dav_fs
$ a2enmod userdir
$ a2enmod ssl

Modifiquem l’arxiu /etc/apache2/mods-available/userdir.conf i ho deixem preparat per l’accés del usuaris. Hauria de quedar similar a aquest:

<IfModule mod_userdir.c>
    UserDir .
    UserDir disabled root

    <Directory /home/*>
        DAV On
        AllowOverride FileInfo AuthConfig Limit Indexes
        Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
        ForceType text/plain
    </Directory>
</IfModule>

Ja podem reiniciar l’apache2:

$ /etc/init.d/apache2 restart

Finalment hem de modificar els permisos de les carpetes d’usuari per a que l’apache2 pugui accedir als arxius.

NOTA: Alguns dirien que aquest procés és insegur i tenen raó. Si un atac a l’apache2 guanyés accés al sistema aquest tindria accés a tots els arxius dels usuaris. S’ha de tenir en compte.

Les comandes necessàries són:

$ setfacl -d -m user:usuari:rwx /home/usuari
$ setfacl -d -m user:www-data:rwx /home/usuari
$ setfacl -m user:usuari:rwx /home/usuari
$ setfacl -m user:www-data:rwx /home/usuari

Si tenim molts usuaris podem fer un petit script que permeti canviar tots els permisos de cop de totes les carpetes.

En aquest moment ja tenim l’accés via Web i/o WebDAV als nostres arxius. Per accedir-hi podem utilitzar un navegador web estàndard i anar a:

http://adreça_ip_servidor/~usuari

o a través d’un client WebDAV com ara cadaver. Aquest ens permetrà crear i esborrar arxius i carpetes.

$ apt-get install cadaver
$ cadaver http://adreça_ip_servidor/~usuari

De moment l’accés no té cap tipus de seguretat però funciona. Anem a solucionar el problema de l’accés segur en el pròxim punt.

Configurar SSL (opcional però altament recomanable)

Tot i que aquest pas és opcional, si no el configurem les contrasenyes i les dades dels nostres usuaris passaran per la xarxa visibles a tothom. Com que les dades aniran per la xarxa pública no ens interessa que puguin ser visibles. Es recomana configurar SSL al servidor.

Modificarem la configuració del host per defecte d’apache2. Per activar SSL sobre aquest site creem primer un certificat autosignat amb openssl:

$ mkdir /etc/apache2/ssl
$ openssl req -x509 -days 3650 -nodes -newkey rsa:2048 -keyout /etc/apache2/ssl/server.key -out /etc/apache2/ssl/server.crt
$ chown www-data:www-data /etc/apache2/ssl/server.key
$ chmod 0600 /etc/apache2/ssl/server.key

Aquesta comanda ens crearà, després d’emplenar les dades que se’ns demanin, dos arxius a /etc/apache2/ssl, un amb el certificat i l’altre amb la clau secreta.

Modifiquem l’arxiu /etc/apache2/sites-available/default i afegim:

<VirtualHost *:443>
    SSLCertificateFile /etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /etc/apache2/ssl/server.key
    SSLEngine On

    DocumentRoot /var/www/
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    CustomLog /var/log/apache2/access.log combined
    ErrorLog /var/log/apache2/error.log
    LogLevel warn
</VirtualHost>

Bàsicament és la còpia de l’original amb SSL activat pel port 443.

Ja podem reiniciar l’apache2:

$ /etc/init.d/apache2 restart

En aquest punt podem accedir a les carpetes dels usuaris utilitzant el protocol segur https. L’accés utilitzant certificats autosignats generarà advertències i demés. De moment les podem descartar.

Tot i tenir un accés segur al servidor per SSL, tots els usuaris encara poden accedir a totes les carpetes de tots els usuaris. Fa falta afegir autenticació a les carpetes per que nomès es pugui accedir a la carpeta de la que un n’és propietari.

Autenticació d’usuaris:

En aquest punt ens hem de plantejar com volem fer l’autenticació dels usuaris ja que existeixen moltes i diverses opcions. El principal detall a tenir en compte és com s’autentiquen els usuaris a la nostra empresa o xarxa. És comú tenir un servidor LDAP o Active Directory i ens interessarà que els usuaris puguin utilitzar les contrasenyes que tenen allà emmagatzemades per accedir a les carpetes.

Configurarem l’accés per PAM per ser més oberts a qualsevol configuració. D’altres opcions vàlides per autenticar els usuaris podrien ser:

  • Crear un arxiu .htaccess dins de cada directori d’usuari per a gestionar la seguretat. El problema és que l’usuari pot esborrar aquest arxiu, deixant l’accés sense control.
  • Crear un arxiu amb totes les configuracions per a cadascuna de les carpetes forà de l’accés dels usuaris. El problema és que per a molts usuaris, la gestió es pot fer feixuga.
  • Utilitzar el mòdul perl Apache::AuthzUserDir (adaptat a la versió 2). No massa simple.

L’accés per PAM permet triar (gairebé) cualsevol tipus d’autenticació d’usuari a nivell de sistema operatiu.

El primer que fa falta és instal·lar el mòdul perl per l’apache2:

$ apt-get install libapache2-mod-perl2

Instal·lem el modul perl Authen::PAM que ens farà falta pel mòdul Apache2-AuthPAMUserDir d’autenticació.

$ apt-get install libauthen-pam-perl

El mòdul que farem servir s’anomena Apache2::AuthPAMUserDir i és una adaptació del mòdul Apache2::AuthPAM per treballar amb UserDir.

Per instal·lar-lo farem:

$ wget http://www.osconfig.org/files/Apache2-AuthPAMUserDir-0.02.tar.gz
$ tar zxf Apache2-AuthPAMUserDir-0.02.tar.gz
$ cd Apache2-AuthPAMUserDir
$ perl Makefile.PL
$ make
$ make test
$ make install

Modifiquem l’arxiu /etc/apache2/mods-available/userdir.conf i afegim:

<Directory /home/*>
...

    PerlAuthenHandler Apache2::AuthPAMUserDir
    AuthType Basic
    AuthName "Carpetes d'usuari"
    PerlSetVar PAMservice userdir
    Require valid-user

...
</Directory>

Ja podem reiniciar l’apache2:

$ /etc/init.d/apache2 restart

Finalment creem un arxiu de servei PAM a /etc/pam.d/userdir amb el següent contingut:

@include common-auth
@include common-account

NOTA: La configuració del Debian Lenny utilitza l’autenticació local (pam_unix.so). Per que apache2 pugui auntenticar utilitzant aquest mòdul ha de ser membre del grup shadow.

$ adduser www-data shadow

Aquest pas no serà necessari si utilitzem altres mòduls PAM com winbind o ldap.

Accés des de Windows XP:

Windows posa problemes per accedir a servidors WebDAV si no permeten el tipus d’autenticació que Windows vol imposar. Aixó ho podem solucionar modificant una mica el servidor apache2.

Creem un nou arxiu amb:

$ pico /etc/apache2/conf.d/encoding

amb el següent contingut:

BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "Microsoft-WebDAV-MiniRedir/5.1.2600" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^WebDAVFS" redirect-carefully

<IfModule mod_headers.c>
    Header add MS-Author-Via "DAV"
</IfModule>

<IfModule mod_encoding.c>
    EncodingEngine on
    NormalizeUsername on
</IfModule>

Ja podem reiniciar l’apache2:

$ /etc/init.d/apache2 restart

Quan creem el nou “Lloc de Xarxa” a Windows haurem de posar el següent com a adreça remota:

https://adreça_ip_servidor/~usuari

i si no hem configurat SSL:

http://adreça_ip_servidor:80/~usuari

NOTA: Important forçar el port 80.

Conclusió:

En aquest punt ja tenim el servidor amb els serveis:

  • samba compartint les carpetes d’usuari mitjançant el protocol SMB/CIFS.
  • apache2 amb WebDAV compartint les carpetes d’usuari mitjançant el mòdul UserDir, amb seguretat SSL i autenticant usuaris amb el mòdul perl Apache2::AuthPAMUserDir.

Un usuari només té accés a la seva carpeta. L’intent d’accedir a una carpeta d’un altre usuari via WebDAV llençarà un error FORBIDDEN, que és el que cercavem.

Com sempre es recomana llegir les documentacions associades als programes instal·lats:

$ man httpd.conf
$ man smb.conf
$ man setfacl
$ man getfacl
$ man openssl