====== WebDAV ====== Configurazione standard, secondo questa guida: **[[http://www.debian-administration.org/articles/285|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 [[wp>suEXEC]] per girare a nome di un utente arbitrario, suEXEC infatti funziona solo sull'esecuzione di [[wp>Common Gateway Interface|CGI]] o [[wp>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/ DAV On DirectorySlash Off AuthType Basic AuthName "WebDAV" AuthBasicProvider file AuthUserFile /etc/apache2/htpasswd AuthGroupFile /etc/apache2/htgroup Require group smbdocumenti ===== Autenticazione Digest su http ===== Alias "/Amministrazione" /home/samba/ammin 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 Se possibile bisogna proteggere i file almeno a livello di gruppo, in questo modo: - La directory condivisa **appartiene al gruppo** che ha facoltà di scrittura. - La directory ha lo **sticky bit di gruppo attivo** (mode 0x2770), così che gli oggetti creati in essa appartengono al gruppo stesso. - 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**. - L'utente **www-data** appartiene al gruppo, così Apache ha permesso di scrittura nella directory. - 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 **[[http://webdavcgi.sourceforge.net/|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: - Installazione in **''/usr/local/share/webdavcgi/''**. - Compilazione e installazione del wrapper nella DocumentRoot del ''VirtualHost''. - Autenticazione Basic su https (login/password su file). - Un ''VirtualHost'' totalmente dedicato al servizio WebDAV. - 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/ #--------------------------------------------------------------- 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/ AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all 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] # Directory is protected using Basic authetication. Do it outside VirtualHost # to enforce it also for other misconfigured VirtualHost(s). SSLRequireSSL AuthType Basic AuthName "WebDAV space" AuthUserFile /etc/apache2/htpasswd Require valid-user 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 = '
WebDAV CGI - Web interface: You are logged in as ' .$ENV{REMOTE_USER}.' (Logout).
'; #$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 **[[https://danrohde.github.io/webdavcgi/index.html|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 **[[wp>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 è **[[https://doc.owncloud.org/server/9.0/user_manual/files/access_webdav.html#accessing-files-using-microsoft-windows|Accessing Files Using Microsoft Windows]]** pubblicata su sito di //Owncloud// e **[[https://support.microsoft.com/en-gb/help/2673544/windows-7-cannot-automatically-reconnect-a-dav-share-when-basic-authen|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