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.
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>
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:
/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.
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?
L'installazione qui descritta prevede:
/usr/local/share/webdavcgi/
.VirtualHost
.VirtualHost
totalmente dedicato al servizio WebDAV.
) 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
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.
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.
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.
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/...
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.
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.
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 Computer ⇒ Connetti 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