User Tools

Site Tools


doc:appunti:linux:sa:webdav

WebDAV

Configurazione standard, secondo questa guida: WebDAV on Apache2.

Per quanto riguarda la sicurezza bisognerebbe proteggere tramite crittografia la password di accesso e anche il contenuto dei file trasferiti. Utilizzando https si protegge entrambi in un colpo solo (eventualmente anche usando la semplice autenticazione AuthType Basic), ma non tutti i client supportano https, notabilmente Windows XP tramite il Connetti untià di rete.

Per questo motivo si potrebbe decidere di utilizzare http e proteggere solo la password tramite AuthType Digest.

Anzitutto è necessario abilitare due moduli Apache: dav e dav_fs (che implementano le funzioni WebDAV su filesystem). Il modulo dav_lock (per gestire il file locking) non è necessario perché dav_fs ha un suo meccanismo nativo più efficiente.

:!: La limitazione principale di questa configurazione è che il modulo gira a nome dell'utente Apache (www-data in Debian) e non è possibile adottare meccanismi tipo suEXEC per girare a nome di un utente arbitrario, suEXEC infatti funziona solo sull'esecuzione di CGI o FastCGI. Questo comporta la necessità che l'utente www-data abbia i permessi necessari sui file pubblicati.

Autenticazione Basic su https

Alias "/Documenti" /home/samba/documenti/
<Location "/Documenti">
    DAV On
    DirectorySlash Off
    AuthType Basic
    AuthName "WebDAV"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/htpasswd
    AuthGroupFile /etc/apache2/htgroup
    Require group smbdocumenti
</Location>

Autenticazione Digest su http

Alias "/Amministrazione" /home/samba/ammin
<Location "/Amministrazione">
    DAV On
    DirectorySlash Off
    AuthType Digest
    BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
    AuthName "WebDAV"
    AuthDigestDomain /ammin/
    AuthDigestProvider file
    AuthUserFile /etc/apache2/htdigest
    AuthGroupFile /etc/apache2/htgroup
    Require group smbammin
</Location>

Se possibile bisogna proteggere i file almeno a livello di gruppo, in questo modo:

  1. La directory condivisa appartiene al gruppo che ha facoltà di scrittura.
  2. La directory ha lo sticky bit di gruppo attivo (mode 0x2770), così che gli oggetti creati in essa appartengono al gruppo stesso.
  3. Gli utenti che si autenticano via WebDAV (su /etc/apache2/htpasswd oppure /etc/apache2/htdigest) sono elencati nel gruppo opportuno in /etc/apache2/htgroup, replicando le appartenenze di /etc/group.
  4. L'utente www-data appartiene al gruppo, così Apache ha permesso di scrittura nella directory.
  5. Apache ha una umask 007 (si può mettere in /etc/apache2/envvars), così che gli oggetti creati nella condivisione WebDAV non siano world-readable.

Per verificare il funzionamento della condivisione WebDAV si può utilizzare davfs da riga di comando GNU/Linux. Installare il pacchetto Debian davfs2 ed eseguire il comando:

mount -t davfs -o noexec https://davserver.rigacci.org/Documenti /mnt

Login e password vengono chieste interattivamente.

WebDAV CGI 0.8.3

L'implementazione WebDAV CGI è un server WebDAV realizzato in Perl, tramite un semplice wrapper con permessi SUID e SGID è in grado di eseguire a nome dell'utente autenticato. A causa del wrapper SUID/SGID non è necessario alcun suEXEC.

Oltre al server WebDAV comprende anche un file manager su interfaccia web, supporta vari tipi di storage per i file (filesystem, SMB/CIFS, …) e supporta diversi tipi di database (usato per ???).

Per il funzionamento non sono necessari i moduli Apache dav e dav_fs, è sufficiente lo script webdav.pl e le librerie da cui dipende. Ecco l'elenco dei pacchetti Debian necessari, come riportato dalla documentazione:

apt-get install libdbi-perl libdbd-sqlite3-perl libtimedate-perl \
                libuuid-tiny-perl libxml-simple-perl libquota-perl \
                libarchive-zip-perl libgraphics-magick-perl libmodule-load-perl \
                libfile-copy-link-perl

ATTENZIONE: in Debian Lenny non sono presenti i pacchetti libuuid-tiny-perl e libfile-copy-link-perl come fare?

Installazione

L'installazione qui descritta prevede:

  1. Installazione in /usr/local/share/webdavcgi/.
  2. Compilazione e installazione del wrapper nella DocumentRoot del VirtualHost.
  3. Autenticazione Basic su https (login/password su file).
  4. Un VirtualHost totalmente dedicato al servizio WebDAV.
  5. Un solo file di configurazione () per tutto il servizio WebDAV.

Potrebbe essere utile pubblicare più di una directory WebDAV, in tal caso si aggiunge una regola RewriteRule e un file di configurazione diverso per ognuna.

Questi i passaggi per l'installazione e la compilazione:

cd /usr/local/share
tar jxvf /usr/local/download/webdavcgi/webdavcgi-latest.tar.bz2
mv webdavcgi-0.8.3 webdavcgi
chown -R root:root webdavcgi
cd webdavcgi/helper/
gcc -o webdavwrapper webdavwrapper.c
strip webdavwrapper
cp webdavwrapper /var/www/webdav.rigacci.org/cgi-bin/
cd /var/www/webdav.rigacci.org/cgi-bin/
chown root:root webdavwrapper
chmod 6755 webdavwrapper
ln -s /usr/local/share/webdavcgi/cgi-bin/webdav.pl .
ln -s /usr/local/share/webdavcgi/cgi-bin/logout-dist logout
mkdir /var/lib/webdavcgi
chmod 1777 /var/lib/webdavcgi

Configurazione

Questo il file di configurazione per il VirtualHost /etc/apache2/sites-available/webdav.rigacci.org:

#---------------------------------------------------------------
# Private WebDAV access via HTTPS
# https://wabdav.rigacci.org/
#---------------------------------------------------------------
<VirtualHost *:443>
    SSLEngine on
    ServerName webdav.rigacci.org
    ServerAdmin webmaster@rigacci.org
    DocumentRoot /var/www/webdav.rigacci.org
    ErrorLog /var/log/apache2/webdav.rigacci.org/error.log
    CustomLog /var/log/apache2/webdav.rigacci.org/access.log combined

    ScriptAlias /cgi-bin/ /var/www/webdav.rigacci.org/cgi-bin/
    <Directory "/var/www/webdav.rigacci.org/cgi-bin/">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    RewriteEngine On
    RewriteRule /logout /cgi-bin/logout [PT,L]

    # With this the root WebDAV service is handled with just one configuration.
    #RewriteRule  ^/ /cgi-bin/webdavwrapper \
    #    [PT,E=WEBDAVCONF:/etc/apache2/webdavcgi/webdav.conf,E=PERLLIB:/usr/local/share/webdavcgi/lib/perl,L]
    
    # Instead of sharing at the root level, we can share several subdirectories,
    # the root level can be used as a plain HTML index in this case.
    # A WebDAV request for "/documenti" will serve the $DOCUMENT_ROOT specified in configuration file.
    # An HTTP request for "/documenti" will serve the web interface.

    # Add the trailing slash to directory request, to aviod "404 Not Found" error.
    RewriteRule ^/documenti$ /documenti/ [L,R=301]
    RewriteRule ^/documenti/ /cgi-bin/webdavwrapper \
        [PT,E=WEBDAVCONF:/etc/apache2/webdavcgi/documenti.conf,E=PERLLIB:/usr/local/share/webdavcgi/lib/perl,L]

</VirtualHost>

# Directory is protected using Basic authetication. Do it outside VirtualHost
# to enforce it also for other misconfigured VirtualHost(s).
<Directory /var/www/webdav.rigacci.org>
    SSLRequireSSL
    AuthType Basic
    AuthName "WebDAV space"
    AuthUserFile /etc/apache2/htpasswd
    Require valid-user
</Directory>

Infine il file di configurazione del CGI (/etc/apache2/webdavcgi/documenti.conf):

## the install base is needed to find webdav-ui.* and locale files 
## (don't forget the trailing slash):
$INSTALL_BASE = '/usr/local/share/webdavcgi/';

## the backend module (supported: FS, AFS, GFS, SMB, DBB):
$BACKEND = 'FS';

## this must be the same as the left part of RewriteRule:
$VIRTUAL_BASE = '/documenti/';

## the WebDAV shared directory:
$DOCUMENT_ROOT = '/home/samba/documenti/';

$UMASK = 0077;

$DBI_SRC='dbi:SQLite:dbname=/var/lib/webdavcgi/webdav.'.$ENV{REMOTE_USER}.'.db';
$DBI_USER='';
$DBI_PASS='';
$CREATE_DB = !-e '/var/lib/webdavcgi/webdav.'.$ENV{REMOTE_USER}.'.db';

$LOGFILE='/tmp/webdavcgi.log';
#$DEBUG = 1;

## add the logout link into the web interface:
$HEADER = '<div class="header">WebDAV CGI - Web interface: You are logged in as <span title="'.`id -a`.'">'
    .$ENV{REMOTE_USER}.'</span> (<a href="/logout">Logout</a>).</div>';

#$ENABLE_THUMBNAIL = 0;
#$ENABLE_COMPRESSION = 0;
#$ALLOW_SEARCH = 0;

Tale configurazione abilita anche il logout dall'interfaccia web: viene aggiunto nella directory CGI-BIN un link allo script logout-dist chiamato logout, aggiunge una RewriteRule nella configurazione di Apache e definisce uno header personalizzato per l'interfaccia web.

Attivando il $DEBUG vengono scritte diverse informazioni nell'error.log del VirtualHost.

Il cgi-bin fornisce anche un'interfaccia sfogliabile con un normale browser, basta puntarlo all'URL soggetto alla RewriteRule.

Vengono creati dei file durante le normali operazioni: dei database SQLite (in /var/lib/webdavcgi/) per ogni utente che si connette via WebDAV (non via interfaccia web) e delle miniature (in /tmp/) per ogni documento sfogliato. I bookmark vengono creati e salvati lato client tramite cookie.

WebDAV CGI 1.1.2 Beta

La nuova versione WebDAV CGI è sostanzialmente diversa, tanto per dire richiede un database di backend. In considerazione dell'uso personale che se ne vuole fare, si è optato per SQLite3, ma sarebbe supportato anche PostgreSQL.

FIXME La documentazione fa riferimento al pacchetto speedy-cgi-perl che sarebbe da installare prima di WebDAV CGI. Si tratta di una implementazione CGI Perl persistente, cioè gli script CGI Perl verrebbero eseguiti da una istanza Perl permanente in memoria, piuttosto che lanciare una nuova istanza ad ogni richiesta HTTP. Tale pacchetto non esiste in Debian (almeno in Stretch), esiste piuttosto libcgi-fast-perl, ma bisognerebbe capire cosa cambia. Per il momento non si attiva l'opzione Speedy.

Installazione librerie necessarie

Anzitutto sono necessari alcuni pacchetti Debian, questa dovrebbe essere la lista minima:

apt-get install \
    libdbi-perl libdbd-sqlite3-perl sqlite3 libtimedate-perl \
    libuuid-tiny-perl libxml-simple-perl libquota-perl \
    libarchive-zip-perl libgraphics-magick-perl \
    libfile-copy-link-perl libjson-perl libdatetime-perl \
    libnet-ldap-perl libimage-exiftool-perl \
    liblist-moreutils-perl libcgi-session-perl libwww-csrf-perl

Purtroppo è necessario installare anche alcune librerie non pacchettizzate Debian, si possono installare tramite CPAN:

cpan install DateTime::Format::Human::Duration
cpan install IO::Compress::Brotli

Vengono installati alcuni file e directory, in particolare nelle directory indicate qui sotto cercare file o subdirectory con nome del tipo DateTime, File, IO, PerlIO, Sub, Test, auto:

/usr/local/share/perl/5.24.1/...
/usr/local/bin/bro-perl
/usr/local/man/man3/...
/usr/local/lib/x86_64-linux-gnu/perl/5.24.1/...

Preparazione localizzazioni

Bisogna creare un file con l'elenco dei locale supportati da WebDAV CGI e compilare i locale installati nella distribuzione (dovrebbe già essere stato fatto con dpkg-reconfigure locales):

mkdir -p /var/lib/locales/supported.d
cp /dev/null /var/lib/locales/supported.d/webdavcgi
for l in de_DE en_US fr_FR it_IT hu_HU ; do
        fgrep $l /usr/share/i18n/SUPPORTED >> /var/lib/locales/supported.d/webdavcgi
done
locale-gen

Al termine dell'operazione sarà stato creato il file /var/lib/locales/supported.d/webdavcgi.

Installazione e configurazione di WebDAV CGI

unzip webdavcgi-master.zip
mv webdavcgi-master webdavcgi
chown -R root.root webdavcgi
cd webdavcgi
bash install.sh

La procedura install.sh controlla la presenza delle librerie necessarie e opzionali: controllare attentamente l'output e verificare se sono installati tutti i requisiti. Inoltre la procedura sistema i permessi dei file e compila i wrapper i cui sorgenti sono in ./helper/. Gli eseguibili compilati vengono copiati in ./cgi-bin/ con gli opportuni permessi suid root.

Il wrapper più importante è ./cgi-bin/webdavwrapper; questo si incarica di cambiare utente con le credenziali dell'autenticazione HTTP, in modo tale che l'accesso ai file viene fatto non dall'utente www-data, ma con i permessi effettivi dell'utente remoto.

Al termine dell'installazione si sposta la directory nella sua posizione definitiva /usr/local/share/webdavcgi/:

cd ..
mv webdavcgi /usr/local/share/

La configurazione va fatta in /etc/webdav.conf invece di modificare il file Perl. Ecco un esempio:

## the install base is needed to find webdav-ui.* and locale files 
## (don't forget the trailing slash):
$INSTALL_BASE = '/usr/local/share/webdavcgi/';
 
## the backend module (supported: FS, AFS, GFS, SMB, DBB, RCS, GIT):
$BACKEND = 'FS';
 
## this is an example if a user starts with home dir (http://mywebdavserver/ -> user home):
$VIRTUAL_BASE = '/';
$DOCUMENT_ROOT = '/home/'.$ENV{REMOTE_USER}.'/';
## if you use a complex home folder structure, try this:
# $DOCUMENT_ROOT=(getpwnam($ENV{REMOTE_USER}))[7].'/';
 
$DBI_SRC='dbi:SQLite:dbname=/var/lib/webdavcgi/webdav.'.$ENV{REMOTE_USER}.'.db';
$DBI_USER='';
$DBI_PASS=''; 
$CREATE_DB = !-e '/var/lib/webdavcgi/webdav.'.$ENV{REMOTE_USER}.'.db';

I database SQLite3 di supporto verranno creati in /var/lib/webdavcgi/. La directory deve essere creata e deve essere scrivibile da tutti gli utenti che faranno accesso al WebDAV:

mkdir /var/lib/webdavcgi/
chmo 1777 /var/lib/webdavcgi/

ATTENZIONE Con la configurazione mostrata sopra per ogni REMOTE_USER che accede, viene creato un database SQLite3 diverso. Se tuttavia si vuole accedere contemporaneamente agli stessi file con utenti diversi, bisogna che il database sia unico e scrivibile da tutti, altrimenti il meccanismo di lock non funziona.

Accesso da Windows 7 e successivi

Windows ha un client nativo per WebDAV, ma è risaputo che soffra di numerose limitazioni e difetti, inoltre il comportamento di tale client non è consistente nelle varie versioni di Windows. Esistono numerose ricette di compatibilità che prevedono l'inserimento di chiavi particolari nel registry, a seconda della versione di Windows in uso, ma in generale non funzionano.

Una lettura interessante è Accessing Files Using Microsoft Windows pubblicata su sito di Owncloud e Windows 7 cannot automatically reconnect a DAV share when Basic Authentication is used pubblicata su Microsoft Support.

L'accesso ad una risorsa WebDAV andrebbe fatta da ComputerConnetti unità di rete. Si specifica la lettera del disco (ad esempio Z:), si lascia in bianco il percorso Cartella, si attiva la spunta Riconnetti all'avvio e Connetti con credenziali diverse. Cliccando su Connessione a un sito Web per l'archiviazione di documenti e immagini viene chiesto il percorso di rete e appunto le credenziali.

Il percorso di rete è qualcosa del genere: https://dav.server.org:443/MYSHARE (si usa https altrimenti l'autenticazione Basic farebbe transitare la password in chiaro),

L'accesso fallisce, come si vede dai log di Apache l'errore è 401 Unauthorized, in effetti l'autenticazione non è mai avvenuta:

"OPTIONS /MYSHARE HTTP/1.1" 401 3519 "-" "Microsoft-WebDAV-MiniRedir/6.1.7601"
"OPTIONS /MYSHARE HTTP/1.1" 401 3519 "-" "Microsoft-WebDAV-MiniRedir/6.1.7601"
"OPTIONS / HTTP/1.1" 200 2970 "-" "Microsoft-WebDAV-MiniRedir/6.1.7601"
"PROPFIND / HTTP/1.1" 405 650 "-" "Microsoft-WebDAV-MiniRedir/6.1.7601"

Le soluzioni che prevedono di modificare o aggiungere chiavi nel nodo HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\ del registry non hanno funzionato. Né l'aggiunta della chiave UseBasicAuth impostata a 1, né la modifica di BasicAuthLevel da 1 a 2 ha avuto esito.

Da quanto scritto nella knowledge base Microsoft sembra che il problema sia l'incompatibilità del Credential Manager (a partire da Windows 7) con la Basic Authentication, in particolare con la memorizzazione delle password.

La soluzione è connettere l'unità di rete dal prompt dei comandi ad ogni avvio di Windows, digitando la password tutte le volte.

Un'altra difficoltà è dovuta al fatto che Windows 7 non accetta certificati autofirmati per HTTPS, è necessario installare sul server web un certificato HTTPS firmato da una C.A. riconosciuta.

Ecco la riga di comando necessaria a connettere il disco di rete Z: (il comando non necessita dei permessi di amministratore, ma richiede l'inserimento della password):

net use Z: https://dav.server.org:443/MYSHARE /persistent:no /user:myuser

Per disconnettere il disco è sufficiente:

net use Z: /delete

Il messaggio di errore di Windows nel caso in cui il server abbia un certificato auto-firmato è del tutto incomprensibile:

Errore di sistema 1790.
Accesso alla rete non riuscito.

Al primo errore di autenticazione Windows entra in stato confusionale e non proverà più a connettersi. Un secondo tentativo infatti produce un messaggio di errore diverso, ancora più incomprensibile:

Errore di sistema 59.
Errore di rete imprevisto.

Per forzare Windows a tentare nuovamente la connessione è necessario riavviare il servizio WebClient, usando i permessi di Administrator:

net stop WebClient
net start WebClient
doc/appunti/linux/sa/webdav.txt · Last modified: 2020/03/02 12:05 by niccolo