Springe zum Hauptinhalt

Für die Synchronisierung meiner Browser-Lesezeichen zwischen verschiedenen Computern und Betriebssystemen habe ich bisher das Xmarks-Plugin für Firefox benutzt. Mir war schon immer nicht besonders wohl dabei, persönliche Daten auf einen fremden Server abzulegen, einerseits aus Gründen des Schutzes der Privatsphäre, andererseits weil ich wenn möglich Kontrolle über die Verfügbarkeit der Netzwerkdienste, die ich nutze, haben will. Man kann zwar Xmarks so konfigurieren, dass es die Daten auf einem eigenen Server über FTP oder WebDAV abgelegt, aber einen FTP-Server wollte ich auf meinem virtuellen Server nicht einrichten und die WebDAV-Konfiguration des von mir benutzen Webservers nginx war mir, ehrlich gesagt, bisher zu umständlich. Als Xmarks vorgestern ankündigte, ihren Service zum Anfang des Jahres 2011 einzustellen, war das für mich ein Anlass, endlich auf eine alternative Synchronisierungslösung umzusteigen.

Auftritt Firefox Sync. Die technischen Information darüber auf der Homepage sind etwas spärlich, aber durch ein wenig Recherche ist schnell herauszufinden, dass dahinter ein offenes Protokoll steht und sowohl Server als auch das Client-Plugin Open Source Software sind. Letzteres muss man in aktuellen Firefox-Versionen der 3.x Linie noch selbst installieren, ab Firefox 4.0 wird der Firefox Sync-Client dann fester Bestandteil des Browsers sein. Der Weave Server, mit dem der offizielle Firefox Sync Server betrieben wird, ist anscheinend auf größere Installationen mit tausenden Benutzern ausgelegt und dementsprechend etwas umständlich zu installieren und erfordert einen “richtigen” Datenbankserver. Mozilla.com empfiehlt deshalb selbst, wenn man einen eigenen Weave Server für kleinere Installationen aufsetzen will, den Minimal Server zu verwenden, zu dessen Betrieb nur ein Webserver mit PHP-Unterstützung und SQLite benötigt wird. Da beide Voraussetzungen auf meinem Server bereits gegeben waren, habe ich mich entschlossen, die entsprechenden PHP-Skripte testweise zu installieren und möchte euch hier eine kurze Anleitung dazu geben, die auf die Besonderheiten meines Setups (nginx mit PHP als FastCGI-Service) eingeht.

Ich gehe von einem debian-ähnlichen Serversystem aus. Auf diesem wird ein Webserver mit einem Virtual Host für die Domäne yourdomain.tld eingerichtet. Der Weave Server soll nur über HTTPS erreichbar sein.

Zuerst muss natürlich die notwendige Software installiert werden:

sudo apt-get install nginx php5-cgi php5-sqlite3

Dann wird ein Verzeichnis für den Virtualhost angelegt. Ich erstelle für jeden Virtual Host ein Verzeichnis unterhalb von /home/www, diese Verzeichnisse können aber an jedem beliebigen Ort im Dateisystem liegen, es müssen dann nur die Pfade in der unten aufgeführten Konfiguration angepasst werden.

sudo mkdir -p /home/www/yourdomain.tld/{etc,htdocs,log}
sudo chown -R root.www-data /home/www/yourdomain.tld
sudo chmod -R 750 /home/www/yourdomain.tld

Es folgt die nginx-Konfiguration für den Virtual Host, der den HTTPS Port (443) bedient. Diese wird unter /etc/nginx/sites-available/yourdomain.tld.conf abgelegt. Die Konfiguration für den normalen HTTP Server, der auf Port 80 lauscht, habe ich hier ausgelassen. Diese kommt normalerweise in die selbe Datei in einen eigenen server { ... } Block.

server {
    listen 443;
    server_name yourdomain.tld www.yourdomain.tld;
    ssl  on;
    ssl_certificate /home/www/yourdomain.tld/etc/ssl-cert.pem;
    ssl_certificate_key /home/www/yourdomain.tld/etc/ssl-key.pem;
    ssl_session_timeout  5m;
    access_log /home/www/yourdomain.tld/log/access-ssl.log;
    error_log /home/www/yourdomain.tld/log/error-ssl.log;

    # redirect server error pages to the static page /50x.html
    error_page 500 502 503 504  /50x.html;
    location = /50x.html {
        root /var/www/nginx-default;
    }
    location / {
        root /home/www/yourdomain.tld/htdocs;
        index index.html index.htm;
        autoindex off;
    }

    # Configuration for the PHP minimal weave server
    # (aka Firefox Sync)
    # Pass configured PHP scripts to FastCGI server
    # listening on 127.0.0.1:9000
    location /weave {
         index index.php;
         fastcgi_pass  127.0.0.1:9000;
         fastcgi_index index.php;
         fastcgi_param SCRIPT_FILENAME
             /home/www/yourdomain.tld/weave/index.php;
         fastcgi_param SCRIPT_NAME
            /home/www/yourdomain.tld/weave/index.php;
         include /etc/nginx/fastcgi_params.conf;

         if ( $request_uri ~ "/weave/([^?]*)" ) {
              set $path_info  /$1;
         }

         fastcgi_param PATH_INFO $path_info;
     }
}

Und hier noch der Inhalt der Datei /etc/nginx/fastcgi_params.conf, die in der Konfiguration oben über die include-Direktive eingelesen wird. Diese wird in eine eigene Datei ausgelagert, weil diese Parameter von allen Virtual Host-Konfigurationen, die einen FastCGI-Server nutzen wollen, benötigt werden.

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
# fastcgi_param  REDIRECT_STATUS    200;

Jetzt müssen noch das SSL-Zertifikat und der zugehörige Key für den Server erstellt und installiert werden. Ich habe mir ein freies, von CACert signiertes Zertifikat besorgt, man kann aber natürlich auch ein selbst signiertes Zertifikat verwenden, man muss dann nur mit den entsprechenden Sicherheitswarnhinweisen der Browser leben. Auf die Zertifikatserstellung einzugehen, würde hier zu weit vom Thema wegführen. Anleitungen dazu gibt es zuhauf im Netz, ich verweise beispielhaft auf den entsprechenden Abschnitt im Ubuntu Server Guide. Das Zertifikat und der Key werden an die Orte, die in der Konfiguration oben angegeben sind - /home/www/yourdomain.tld/etc/ssl-cert.pem und /home/www/yourdomain.tld/etc/ssl-key.pem - kopiert, wobei darauf zu achten ist, dass sie für den User, unter dem der nginx-Server läuft (www-data) lesbar sind und für sonst niemand (außer natürlich root).

Als nächstes muss dafür gesorgt werden, dass PHP als FastCGI-Server gestartet werden kann. Ich benutze dazu das Init-Skript aus diesem Blogartikel. Der Einfachheit halber stelle ich das Init-Skript und die zugehörige Konfigurationsdatei, die in /etc/default kopiert wird, auf meinem Webserver zum Download zur Verfügung. Hier folgen die Schritte, um beide herunterzuladen und zu installieren:

wget http://chrisarndt.de/projects/weave/php-fastcgi.init
wget http://chrisarndt.de/projects/weave/php-fastcgi.default
sudo install php-fastcgi.init /etc/init.d/php-fastcgi
sudo install -m 644 php-fastcgi.default /etc/default/php-fastcgi
sudo update-rc.d php-fastcgi defaults

Zuletzt muss die Virtual Host Konfiguration noch aktiviert werden. Dann können der Webserver und der PHP FastCGI Server (neu) gestartet werden:

sudo ln -s ../sites-available/yourdomain.tld.conf /etc/nginx/sites-enabled
sudo invoke-rc.d php-fastcgi restart
sudo invoke-rc.d nginx restart

Damit ist die Konfiguration des Webservers und von PHP abgeschlossen und der Weave Server kann installiert werden:

wget http://people.mozilla.org/~telliott/weave_minimal.tgz
tar -xzf weave_minimal.tgz
sudo cp -r weave_minimal /home/www/yourdomain.tld/weave
sudo chown -R root.www-data /home/www/yourdomain.tld/weave
sudo chmod 2770 /home/www/yourdomain.tld/weave

Durch das Setzen des Benutzers, der Gruppe und der Rechte auf das Verzeichnis /home/www/yourdomain.tld/weave wird erreicht, dass nur root und Benutzer der Gruppe www-data dieses Verzeichnis lesen und darin schreiben können. Außerdem werden alle Dateien, die darin angelegt werden, der Gruppe www-data zugewiesen. Der letzte Punkt wird im nächsten Schritt wichtig, denn der Weave Server legt seine SQLite-Datenbank automatisch an, sobald er das erste mal aufgerufen wird. Dazu wird z.B. folgende URL benutzt:

https://yourdomain.tld/weave/1.0/<foo>/info/collections

Anstelle von <foo> kann ein beliebiger Benutzername eingesetzt werden. Der Browser sollte beim Aufruf der URL einen Dialog zur Abfrage des Benutzernamens und Passworts für die HTTP-Authentifizierung anzeigen. Dieser kann in diesem Fall mit “Abbrechen” geschlossen werden. Falls man ein selbst signiertes Zertifikat verwendet hat, muss man vorher noch eine Sicherheitsausnahmeregel hinzufügen, damit der Browser das Zertifikat akzeptiert. Jetzt sollte im Verzeichnis des Servers eine neue Datei weave_db angelegt worden sein. Jetzt kann mit dem mitgeliefertem Skript ‘create_user` ein Benutzer hinzugefügt werden:

cd /home/www/yourdomain.tld/weave
sudo php create_user
(c)reate, (d)elete or change (p)assword: c
Please enter username: joe
Please enter password: secret
joe created

Zu guter letzt sollte man noch mal sicherstellen, dass die Datenbankdatei auch wirklich (nur) vom Webserver/PHP gelesen und geschrieben werden kann:

sudo chmod 660 weave_db

Damit ist die Installation des Weave Servers komplett und jetzt müssen nur noch die Clients (Browser) auf allen Systemen, die an der Synchronisierung Teilnehmen sollen, installiert und eingerichtet werden. Wenn Firefox nach der Installation des Firefox Sync Plugins neu startet, wird der Dialog zur Konfiguration des Plugins direkt angezeigt. Hier wählt gibt man an, dass man bereits einen Sync-Account hat (“Ich nutze Sync bereits auf einem anderen Computer”) und wählt dann aus, dass man einen eigen Sync-Server benutzen will. Als URL des Servers gibt man an:

https://yourdomain.tld/weave/

Wichtig ist der abschließende Schrägstrich! Bei Benutzername und Passwort trägt man die Daten des Benutzers ein, den man in der Datenbank des Weave Servers angelegt hat. Die E-Mailadresse ist für den Minimal Server nicht von Belang, hier kann eine beliebige Adresse eingetragen werden. Nach Eingabe einer Passphrase für die Verschlüsselung der Daten auf dem Weave Server sollte die Erstsynchronisierung ohne weiteres funktionieren. Beim ersten Gerät ist es ratsam, die Option “Überschreiben aller anderen Geräte mit den lokalen Daten” zu wählen, bei weiteren Clients sollte man die Option “Zusammenführen der Daten auf diesem Computer mit Ihren Sync-Daten” wählen.

Wer will, kann sich auf dem Server vergewissern, dass die SQLite-Datenbankdatei des Weave Servers nach dem ersten Synchronisierungsvorgang auf einige Megabyte (je nach Anzahl der Lesezeichen und anderer synchronisierter Daten) angeschwollen ist und sich die Struktur der Daten mit dem sqlite3 Kommandozeilentool anschauen. Die eigentlichen Daten sind jedoch verschlüsselt und nur mit der beim Einrichten des Clients eingegebenen Passphrase zu entziffern. Selbst wenn der eigene Server gehackt werden sollte, sind die Daten also vor dem Zugriff Anderer sicher.

Fröhliches Synchronisieren wünscht

Chris