User Tools

Site Tools


doc:appunti:linux:sa:webdav

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
doc:appunti:linux:sa:webdav [2018/11/09 09:38] – [WebDAV CGI 1.1.2 Beta] niccolodoc:appunti:linux:sa:webdav [2020/03/02 12:05] (current) – [Accesso da Windows 7 e successivi] niccolo
Line 16: Line 16:
 <Location "/Documenti"> <Location "/Documenti">
     DAV On     DAV On
 +    DirectorySlash Off
     AuthType Basic     AuthType Basic
     AuthName "WebDAV"     AuthName "WebDAV"
Line 31: Line 32:
 <Location "/Amministrazione"> <Location "/Amministrazione">
     DAV On     DAV On
 +    DirectorySlash Off
     AuthType Digest     AuthType Digest
     BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On     BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
Line 41: Line 43:
 </Location> </Location>
 </file> </file>
 +
 +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:
 +
 +<code>
 +mount -t davfs -o noexec https://davserver.rigacci.org/Documenti /mnt
 +</code>
 +
 +Login e password vengono chieste interattivamente.
 ====== WebDAV CGI 0.8.3 ====== ====== WebDAV CGI 0.8.3 ======
  
Line 190: Line 208:
  
 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. 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:
 +
 +<code>
 +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
 +</code>
 +
 +Purtroppo è necessario installare anche alcune **librerie non pacchettizzate Debian**, si possono installare tramite **[[wp>CPAN]]**:
 +
 +<code>
 +cpan install DateTime::Format::Human::Duration
 +cpan install IO::Compress::Brotli
 +</code>
 +
 +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**:
 +
 +<code>
 +/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/...
 +</code>
 +
 +===== 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**):
 +
 +<code>
 +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
 +</code>
 +
 +Al termine dell'operazione sarà stato creato il file **/var/lib/locales/supported.d/webdavcgi**.
 +
 +===== Installazione e configurazione di WebDAV CGI =====
 +
 +<code>
 +unzip webdavcgi-master.zip
 +mv webdavcgi-master webdavcgi
 +chown -R root.root webdavcgi
 +cd webdavcgi
 +bash install.sh
 +</code>
 +
 +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/**:
 +
 +<code>
 +cd ..
 +mv webdavcgi /usr/local/share/
 +</code>
 +
 +La configurazione va fatta in **/etc/webdav.conf** invece di modificare il file Perl. Ecco un esempio:
 +
 +<code perl>
 +## 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';
 +</code>
 +
 +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:
 +
 +<code>
 +mkdir /var/lib/webdavcgi/
 +chmo 1777 /var/lib/webdavcgi/
 +</code>
 +
 +**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:
 +
 +<code>
 +"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"
 +</code>
 +
 +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):
 +
 +<code>
 +net use Z: https://dav.server.org:443/MYSHARE /persistent:no /user:myuser
 +</code>
 +
 +Per disconnettere il disco è sufficiente:
 +
 +<code>
 +net use Z: /delete
 +</code>
 +
 +Il messaggio di errore di Windows nel caso in cui il server abbia un certificato auto-firmato è del tutto incomprensibile:
 +
 +<code>
 +Errore di sistema 1790.
 +Accesso alla rete non riuscito.
 +</code>
 +
 +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:
 +
 +<code>
 +Errore di sistema 59.
 +Errore di rete imprevisto.
 +</code>
 +
 +Per forzare Windows a tentare nuovamente la connessione è necessario riavviare il servizio WebClient, usando i permessi di Administrator:
 +
 +<code>
 +net stop WebClient
 +net start WebClient
 +</code>
doc/appunti/linux/sa/webdav.1541752713.txt.gz · Last modified: 2018/11/09 09:38 by niccolo