Eigenen Firefox Sync Server betreiben

Die Einstellungen, Browserchronik & Lesezeichen des Mozilla Firefox werden, sofern man sich mit einem Firefox Konto angemeldet hat, mittels „ Firefox Sync " synchronisiert. Man vertraut damit der Mozilla Foundation seine Daten an. Die Speicherung der Daten erfolgt dabei meist auf Servern in den USA.

Mozilla bietet einem aber die Möglichkeit einen eigenen Firefox Sync Server zu betreiben.

Hinweis: Der aktuelle Firefox Sync Server basiert auf Python 2. Python 2 ist seit Anfang 2020 End-of-Life. Es ist bereits eine Version des Firefox Sync Servers auf Basis von Rust in Arbeit. Da das für den Sync Server zuständige Entwicklerteam nach eigener Aussage sehr klein ist, dauert die Portierung/Umstellung noch eine Weile. Der aktuelle Zeitplan sieht vor Ende Q2/2020 den Betrieb des neuen Sync Servers aufzunehmen. Nähere Infos im GitHub Issue 189.

Ich betreibe den Firefox Sync Server unter Ubuntu 18.04 und Nginx aus dem von mir angebotenen Repo.

Benötigte Software installieren & Firefox Sync Server herunterladen:

sudo apt install make python-dev git-core python-virtualenv g+ nginx

cd /opt

sudo git clone https://github.com/mozilla-services/syncserver

cd syncserver

make build

Für die Konfiguration wird ein „Secret" benötigt. Dieses wird mit dem nachfolgendem Befehl generiert und muss anschließend in der Konfiguration hinterlegt werden.

head -c 20 /dev/urandom | sha1sum

Nun wird die Konfigurationsdatei bearbeitet

sudo nano /opt/syncserver/syncserver.ini

Ihr könnt die Konfiguration so wie

[server:main]
use = egg:gunicorn
host = 127.0.0.1
port = 5000
workers = 1
timeout = 30

[app:main]
use = egg:syncserver

[syncserver]
# This must be edited to point to the public URL of your server,
# i.e. the URL as seen by Firefox.
public_url = https://sync.domain.tld

# By default, syncserver will accept identity assertions issued by
# any BrowserID issuer. The line below restricts it to accept assertions
# from just the production Firefox Account servers. If you are hosting
# your own account server, put its public URL here instead.
identity_provider = https://accounts.firefox.com/

# This defines the database in which to store all server data.
sqluri = sqlite:////opt/syncserver/syncserver.db

# This is a secret key used for signing authentication tokens.
# It should be long and randomly-generated.
# The following command will give a suitable value on *nix systems:
#
# head -c 20 /dev/urandom | sha1sum
#
# If not specified then the server will generate a temporary one at startup.
secret = 4f4ae5cc8aa9b859d725cd0823954a47f4fc841e

# Set this to "false" to disable new-user signups on the server.
# Only requests by existing accounts will be honoured.
# allow_new_users = false

# Set this to "true" to work around a mismatch between public_url and
# the application URL as seen by python, which can happen in certain reverse-
# proxy hosting setups. It will overwrite the WSGI environ dict with the
# details from public_url. This could have security implications if e.g.
# you tell the app that it's on HTTPS but it's really on HTTP, so it should
# only be used as a last resort and after careful checking of server config.
force_wsgi_environ = true

Die rot markierten Einträge müssen von euch angepasst werden. Bei dem Eintrag „allow_new_users" wird die Raute (#) erst entfernt, wenn ihr bei allen euren Firefox Installationen den Syncserver auf euren eigenen geändert habt.

sudo nano /etc/nginx/conf.d/sync.domain.tld.conf

Nginx Konfiguration:

server {

        listen 80;
        listen [::]:80;
        server_name sync.domain.tld;
 
        root /var/www;
 
        #access_log /var/log/syncserver-access.log;
        #error_log /var/log/syncserver-error.log;

	location / {
		return 301 https://$host$request_uri;
	}


}
 
server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name sync.domain.tld;
 
        ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/chain.pem;

        #ssl_protocols TLSv1.3 TLSv1.2; # Für TLS 1.3 wird mindestens Nginx 1.13 benötigt
        #ssl_prefer_server_ciphers on;
        #ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384';

        #ssl_ecdh_curve secp521r1:secp384r1;
        #ssl_dhparam /etc/nginx/dhparams-4096.pem; # Muss generiert werden mit: openssl dhparam -out /etc/nginx/dhparams-4096.pem 4096
 
        #ssl_stapling on;
        #ssl_stapling_verify on;

        #ssl_session_timeout 24h;
        #ssl_session_cache shared:SSL:50m;
        #ssl_session_tickets off;

        #access_log /var/log/syncserver-access.log;
        #error_log /var/log/syncserver-error.log;
 
        location / {
		proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_redirect off;
                proxy_read_timeout 120;
                proxy_connect_timeout 10;
                proxy_pass http://127.0.0.1:5000/;
        }


}

Die rot markierten Einträge müssen von euch angepasst werden.

Hinweis: In meinen Nginx Konfigurationen setze ich einige zusätzliche SSL Optionen. Diese habe in der Konfiguration auskommentiert. Wenn ihr diese übernehmen möchtet, einfach die Raute (#) entfernen.

Eigenen User & systemd Service für Firefox Sync anlegen:

sudo useradd firefox-sync -s /bin/false --no-create-home

sudo chown -R firefox-sync:firefox-sync /opt/syncserver

sudo nano /etc/systemd/system/firefox-sync.service

Dort einfügen:

[Unit]
Description=Firefox Sync Server
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=simple
User=firefox-sync
Group=firefox-sync
Umask=007
Restart=on-abort
ExecStart=/opt/syncserver/local/bin/gunicorn --paste /opt/syncserver/syncserver.ini
 
[Install]
WantedBy=multi-user.target

Nun noch den systemd Service für den automatischen Start aktivieren und starten mit:

sudo systemctl enable --now firefox-sync

Firefox konfigurieren:

Wenn ihr im Firefox mit eurem Firefox Konto angemeldet seid, meldet euch ab.

Gebt in der Adresszeile about:config ein und bestätigt die Warnung.

In der Suche nach identity.sync.tokenserver.uri suchen.

Ändert den Wert mit einem Doppelklick auf https://sync.domain.tld/token/1.0/sync/1.5

Nachdem der neue Sync Server hinterlegt ist, den Firefox neustarten (Also beenden und wieder öffnen).

Ihr könnt nun euer Firefox Konto wieder anmelden.

Beim Firefox für Android funktioniert die Vorgehensweise analog zum Firefox auf dem Desktop. Bei „Firefox Preview" für Android ist es derzeit nicht möglich einen anderen Sync Server zu hinterlegen.

Eigenen Firefox Sync Server betreiben

Sync Server auf bekannte Accounts beschränken:

Der Sync Server ist mit dieser Konfiguration für jeden nutzbar. Wer dies nicht möchte kann den Sync Server auf bekannte Accounts beschränken.

Hierzu

sudo nano /opt/syncserver/syncserver.ini

Dort die Raute (#) vor „allow_new_users = false" entfernen und die Datei speichern.

Nun noch den Sync Server neustarten mit

sudo systemctl restart firefox-sync

Fazit:

Mit etwas Erfahrung ist es meiner Meinung nach relativ einfach einen eigenen Firefox Sync Server aufzusetzen. Hierzu eignet sich auch ein per DynDNS erreichbarer Raspberry Pi.

Ich betreibe den Firefox Sync Server bereits seit einer Weile auf meinem V-Server.


wallpaper-1019588
[Comic] Batman: City of Madness
wallpaper-1019588
Hyakushō Kizoku: Anime erhält eine dritte Staffel
wallpaper-1019588
Arcanadea: Figuren-Franchise erhält einen TV-Anime
wallpaper-1019588
Gintama: Neuer Teaser zum Spin-Off-Anime veröffentlicht