User Tools

Site Tools


Sidebar

No ai soldati italiani all'estero

Indice

Eventi

Energia

Rigacci.Org usa energia elettrica da fonti rinnovabili, grazie al gruppo di acquisto Merci Dolci.

Merci Dolci - Energia Rinnovabile

Software libero!

Petizione contro i brevetti software

Faunalia: Soluzioni GIS professionali

Debian

www.gnu.org www.kernel.org

Altre libertà

MoVimento 5 Stelle Campi Bisenzio

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
    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
    AuthType Digest
    BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
    AuthName "WebDAV"
    AuthDigestDomain /ammin/
    AuthDigestProvider file
    AuthUserFile /etc/apache2/htdigest
    AuthGroupFile /etc/apache2/htgroup
    Require group smbammin
</Location>

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.

doc/appunti/linux/sa/webdav.txt · Last modified: 2018/11/09 16:23 by niccolo