Eigener Firefox Syncserver 1.5 auf Ubuntu 16.04 LTS

23.06.2016

Firefox Syncserver 1.5 und Accountserver - Neue, noch nicht komplette Installationsanleitung

Mein "alter" Syncserver auf Ubuntu 14.04 LTS ist weiterhin im Betrieb und arbeitet noch immer ohne Probleme. Eine Neuinstallation funktioniert so nicht mehr, da sich einiges in dieser Zeit geändert hat. Dazu gekommen ist ein OAuth Server und ein Profile Server. Ohne diese scheint der Contentserver nicht mehr richtig zu funktionieren. Der OAuth und der Profile Server fehlen noch in dieser Installationsanleitung. Das Problem dabei ist die Konfiguration, da es dazu keine richtige Dokumentation gibt. Wer möchte kann gerne mitmachen, um die Anleitung zu vervollständigen.

Es ist mir nicht möglich, Support zu leisten. Möchte man sich gegenseitig helfen, kann dies über das Forum geschehen. Wenn es die Zeit zulässt, werde ich mich daran beteiligen.

Hier geht es zum Forum.

Der Syncserver ist noch nicht komplett und besteht aus folgenden Komponenten:

• Accounts Authentication Server (fxa-auth-db-server)
• Accounts Server (fxa-auth-server)
• Accounts Contentserver (fxa-content-server)
• OAuth Server (fxa-oauth-server) ist noch nicht vorhanden!
• Profile Server (fxa-profile-server) ist noch nicht vorhanden!
• Syncserver
• Nginx Reverse Proxy

Die Beschreibung zu den jeweiligen Schritten ist wieder auf das Notwendigste beschränkt. Empfehlenswert ist die Installation in einer VM z.B. Virtualbox. Damit lässt sich das System ohne Neuinstallation leicht zurücksetzen.

Die Basis für die Installation ist ein Ubuntu Server 16.04 LTS mit aktuellem Stand. Daher nochmal das System aktualisieren.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo reboot

Für den Syncserver wird weiterhin Python 2.7 benötigt.

Paketquelle für Python 2.7 hinzufügen.

sudo add-apt-repository 'deb http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu xenial main'

Um die Paketquelle zu verwenden, sollte man den Signatur-Schlüssel einspielen.

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5BB92C09DB82666C

sudo apt-get update

Anschließend werden alle notwendigen Pakete installiert. Postfix ist stellvertretend und muss abschließen konfiguriert werden. Dazu gibt es im Wiki von Ubuntu eine Beschreibung Link. Bei der Installation von MySQL wird man aufgefordert, ein root Passwort zu vergeben. Dieses wird dann später für das Anlegen der Datenbanken benötigt.

Wichtig! Ubuntu Server 16.04 LTS verwendet für den Systemstart systemd statt Upstart. Durch die Installation der Pakete upstart und upstart-sysv wird wieder das "alte" Upstart aktiviert.

sudo apt-get install make gcc g++ upstart upstart-sysv curl python python-dev python-virtualenv mysql-server nginx postfix

Zusätzlich ist noch das aktuelle nodesjs notwendig, npm wird automatisch mit installiert. Das ist eigentlich mit der wichtigste Punkt bei der Installation. Diese Komponenten müssen so aktuell wie möglich sein.

curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -
sudo apt-get install nodejs

Erstellen eines Systembenutzer fxcloud.

sudo adduser --disabled-password --disabled-login fxcloud

Die Angaben zum User kann man mit der Entertaste überspringen.

Lege Benutzer »fxcloud« an ...
Lege neue Gruppe »fxcloud« (1001) an ...
Lege neuen Benutzer »fxcloud« (1001) mit Gruppe »fxcloud« an ...
Erstelle Home-Verzeichnis »/home/fxcloud« ...
Kopiere Dateien aus »/etc/skel« ...
Changing the user information for fxcloud
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Sind diese Informationen korrekt? [J/n] J


Auth-DB Server

Installation
Konfiguration MySQL

Mit dem, bei der Installation von MySQL vergebenen root Passwort anmelden.

mysql -u root -p

Die Datenbank fxacc für den Auth-DB Server anlegen und ein Passwort für diese Datenbank vergeben.

CREATE DATABASE fxacc;
CREATE USER 'fxacc'@'localhost' IDENTIFIED BY 'dein-passwort';
GRANT ALL PRIVILEGES ON fxacc.* TO 'fxacc'@'localhost';
FLUSH PRIVILEGES;
quit

Als Systembenutzer fxcloud einloggen.

sudo -i -u fxcloud

Installation des Auth-DB Server.

git clone https://github.com/mozilla/fxa-auth-db-mysql.git
cd fxa-auth-db-mysql
npm install

es dauert...

Konfiguration

fxcloud@ubuntu:~/fxa-auth-db-mysql$ vi config/prod.json

Die Konfigurationsdatei prod.json wird mit folgenden Inhalt neu angelegt:

{
"master": {
"user": "fxacc",
"password": "dein-passwort",
"database": "fxacc"
},
"slave": {
"user": "fxacc",
"password": "dein-passwort",
"database": "fxacc"
}
}

Anschließend das für die Datenbank fxacc vergebene Passwort eintragen und speichern.


Auth-Server

Installation

Wechsel in das Homeverzeichnis vom Systembenutzer fxcloud.

cd

Anschließend den Auth-Server installieren.

git clone git://github.com/mozilla/fxa-auth-server.git
cd fxa-auth-server
npm install

es dauert...

Test des Auth-Server:

npm test

Bei einem abschließenden Done, without errors. war die Installation erfolgreich.

Konfiguration

Die Konfigurationsdatei .env.dev mit folgenden Inhalt anlegen:

fxcloud@ubuntu:~/fxa-auth-server$ vi .env.dev

PUBLIC_URL=https://fxaccount-api.domain.tld
CONTENT_SERVER_URL=https://fxaccount.domain.tld
SMTP_HOST=smtp.domain.tld
SMTP_PORT=25
SMTP_SECURE=false
SMTP_SENDER=Firefox Accounts Server <fxacc@domain.tld>
SMTP_USER=fxacc@domain.tld
LOG_LEVEL=warn
VERIFIER_VERSION=0
CUSTOMS_SERVER_URL=none
RESEND_BLACKOUT_PERIOD=0
LOCKOUT_ENABLED=true
SNS_TOPIC_ARN=disabled
TRUSTED_JKUS=http://127.0.0.1:8080/.well-known/public-keys,http://127.0.0.1:10139/.well-known/public-keys

Die rot markierten Stellen entsprechend anpassen / hinzufügen.


Contentserver

Installation

Wechsel in das Homeverzeichnis vom Systembenutzer fxcloud.

cd

Anschließend den Contentserver installieren.

git clone https://github.com/mozilla/fxa-content-server.git

Mit Strg + D kurzzeitig für die grunt-cli Installation als User fxcloud ausloggen.

sudo npm install -g grunt-cli

Als Systembenutzer fxcloud einloggen.

sudo -i -u fxcloud

Installation des Contentserver.

cd fxa-content-server
npm install

es dauert...

Konfiguration

Unter server/config/local.json-dist befindet sich eine Konfigurationsdatei als Vorlage für den Contentserver. Diese wird für die weiteren Anpassungen kopieren und als local.json abgespeichert.

fxcloud@ubuntu:~/fxa-content-server$
cp server/config/local.json-dist server/config/local.json

fxcloud@ubuntu:~/fxa-content-server$ vi server/config/local.json

{
"public_url": "https://fxaccount.domain.tld",
"fxaccount_url": "https://fxaccount-api.domain.tld",

"oauth_client_id": "98e6508e88680e1a",
"oauth_url": "http://127.0.0.1:9010",
"profile_url": "http://127.0.0.1:1111",
"profile_images_url": "http://127.0.0.1:1112",
"client_sessions": {
"cookie_name": "session",
"secret": "selbst-gewähltes-secret",
"duration": 86400000
},
"env": "production",
"use_https": false,
"static_max_age" : 0,
"i18n": {
"supportedLanguages": ["af", "an", "ar", "as", "ast", "az", "be", "bg", "bn-BD", "bn-IN", "br", "bs", "ca", "cs", "cy", "da", "de", "dsb", "el", "en", "en-GB", "en-ZA", "eo", "es", "es-AR", "es-CL", "es-MX", "et", "eu", "fa", "ff", "fi", "fr", "fy", "fy-NL", "ga", "ga-IE", "gd", "gl", "gu", "gu-IN", "he", "hi-IN", "hr", "hsb", "ht", "hu", "hy-AM", "id", "is", "it", "it-CH", "ja", "kk", "km", "kn", "ko", "ku", "lij", "lt", "lv", "mai", "mk", "ml", "mr", "ms", "nb-NO", "ne-NP", "nl", "nn-NO", "or", "pa", "pa-IN", "pl", "pt", "pt-BR", "pt-PT", "rm", "ro", "ru", "si", "sk", "sl", "son", "sq", "sr", "sr-LATN", "sv", "sv-SE", "ta", "te", "th", "tr", "uk", "ur", "vi", "xh", "zh-CN", "zh-TW", "zu"]
},
"route_log_format": "dev_fxa",
"logging": {
"fmt": "pretty",
"level": "warn"
},
"static_directory": "app",
"allowed_parent_origins": ["http://127.0.0.1:8080"],
"csp": {
"enabled": true,
"reportUri": "/_/csp-violation"
}
}

Die rot markierten Stellen müssen entsprechend angepasst werden.


OAuth Server

Installation

Wechsel in das Homeverzeichnis vom Systembenutzer fxcloud.

cd

Installation des OAuth Server.

git clone https://github.com/mozilla/fxa-oauth-server.git
cd fxa-oauth-server
npm install

es dauert...

Konfiguration

...


Profile Server

Installation

Wechsel in das Homeverzeichnis vom Systembenutzer fxcloud.

cd

Installation des Profile Server.

git clone https://github.com/mozilla/fxa-profile-server.git
cd fxa-profile-server
npm install

es dauert...

Konfiguration

...


Syncserver

Installation

Wechsel in das Homeverzeichnis vom Systembenutzer fxcloud.

cd

Konfiguration MySQL

Mit dem, bei der Installation von MySQL vergebenen root Passwort anmelden.

mysql -u root -p

Die Datenbank fxsync für den Syncserver anlegen und ein Passwort für diese Datenbank vergeben.

CREATE DATABASE fxsync;
CREATE USER 'fxsync'@'localhost' IDENTIFIED BY 'dein-passwort';
GRANT ALL PRIVILEGES ON fxsync.* TO 'fxsync'@'localhost';
FLUSH PRIVILEGES;
quit

Danach erfolgt die Installation des Syncservers.

git clone https://github.com/mozilla-services/syncserver.git
cd syncserver
make build

es dauert...

Für eine bessere Performance des Syncservers noch den Gunicorn Python WSGI Server installieren.

fxcloud@ubuntu:~/syncserver$ ./local/bin/easy_install gunicorn

Konfiguration

fxcloud@ubuntu:~/syncserver$ vi syncserver.ini

[server:main]
use = egg:gunicorn
host = 127.0.0.1
port = 5000
workers = 2
timeout = 60

[app:main]
use = egg:syncserver

[syncserver]
public_url = https://fxsync.domain.tld/
sqluri = pymysql://fxsync:dein-passwort@127.0.0.1/fxsync
secret = aaa588f154f12f90a3457e7d5180dfd07cdeedca

[browserid]
backend = tokenserver.verifiers.LocalVerifier
audiences = https://fxsync.domain.tld

• Der Schrägstrich am Ende von public_url = https://fxsync.domain.tld/ muss vorhanden sein!
• Das für die Datenbank fxsync vergebene Passwort eintragen.
• Das secret kann mit folgendem Befehl erzeugt werden.

head -c 20 /dev/urandom | sha1sum

Zertifikat

Wichtig: Bei eigener CA das Root-Zertifikat in Python hinzufügen!

Das Root-Zertifikat im pem Format mit z.B. Notepad++ oder vi öffnen und den gesamten Inhalt kopieren.
Beispiel:

-----BEGIN CERTIFICATE-----
MIIE5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQ0FADAWMRQwEgYDVQQDEwtSb290
LVdlYi1DQTAeFw0xNDExMDgwMDAwMDBaFw00OTExMDcyMzU5NTlaMBYxFDASBgNV
...
CJU2N2c/uTkuQrtE0gO5yc+LO6OytSXkQ7QkymF1aNeHy0gMqaCGkPozeQW/i0Tb
CwXECxbROBN/IWXw7xvYL1tGOcW6uBI6pE70Cznz2Y5HJxNqrobtXGTS95rfaTqx
diUdy7y04KVyyw==
-----END CERTIFICATE-----

Anschließend folgende Datei editieren:

fxcloud@ubuntu:~/syncserver$
vi local/lib/python2.7/site-packages/requests/cacert.pem

Den Inhalt der Zwischenablage einfach am Anfang der Datei einfügen und speichern.

Mit Strg + D als User fxcloud ausloggen.


Nginx Reverse Proxy

Zertifikat
Wichtig: Das Serverzertifikat muss ein SAN (Multidomain-Zertifikat) sein und alle drei Adressen beinhalten!

Für einen Test würde auch ein normales Wildcard Zertifikat mit cn=*.domain.tld gehen.

DNS-Name: fxaccount.domain.tld
DNS-Name: fxaccount-api.domain.tld
DNS-Name: fxsync.domain.tld

Konfiguration

Die Konfigurationsdatei für https://fxaccount-api.domain.tld

sudo vi /etc/nginx/sites-available/fxaccount-api

server {
listen 443 ssl;
listen [::]:443 ssl;
server_name fxaccount-api.domain.tld;

ssl_certificate /etc/ssl/certs/server-cert.crt;
ssl_certificate_key /etc/ssl/private/server.key;

location / {
proxy_pass http://127.0.0.1:9000/;
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;
}
}

Die Konfigurationsdatei für https://fxaccount.domain.tld

sudo vi /etc/nginx/sites-available/fxaccount

server {
listen 443 ssl;
listen [::]:443 ssl;
server_name fxaccount.domain.tld;

ssl_certificate /etc/ssl/certs/server-cert.crt;
ssl_certificate_key /etc/ssl/private/server.key;

location / {
proxy_pass http://127.0.0.1:3030/;
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;
}
}

Die Konfigurationsdatei für https://fxsync.domain.tld

sudo vi /etc/nginx/sites-available/fxsync

server {
listen 443 ssl;
listen [::]:443 ssl;
server_name fxsync.domain.tld;

ssl_certificate /etc/ssl/certs/server-cert.crt;
ssl_certificate_key /etc/ssl/private/server.key;

location / {
proxy_pass http://127.0.0.1:5000/;
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;
}
}

Notwendig ist das Anpassen der rot markierten Stellen. Das Serverzertifikat muss im angegebenen Pfad vorhanden sein. Der Nginx Server unterstützt nur einen Pfad zum Serverzertifikat. Dadurch müssen in /etc/ssl/certs/server-cert.crt Root-CA und Serverzertifikat vorhanden sein.

Anschließend noch die jeweilige Konfiguration aktivieren.

cd /etc/nginx/sites-enabled/

sudo ln -s ../sites-available/fxaccount-api fxaccount-api
sudo ln -s ../sites-available/fxaccount fxaccount
sudo ln -s ../sites-available/fxsync fxsync


Upstart Scripte

fxa-auth-db-mysql.conf:

sudo vi /etc/init/fxa-auth-db-mysql.conf

# description "Start the fxa-auth-db-mysql"

start on runlevel [2345]
stop on runlevel [^2345]

console log
chdir /home/fxcloud/fxa-auth-db-mysql
setuid fxcloud
setgid fxcloud

env HOME=/home/fxcloud
#respawn
#respawn limit 20 5

exec npm start

fxa-auth-server.conf:

sudo vi /etc/init/fxa-auth-server.conf

# description "Start the fxa-auth-server"

start on runlevel [2345]
stop on runlevel [^2345]

console log
chdir /home/fxcloud/fxa-auth-server
setuid fxcloud
setgid fxcloud

env HOME=/home/fxcloud
respawn
respawn limit 20 5

exec npm start

fxa-content-server.conf:

sudo vi /etc/init/fxa-content-server.conf

# description "Start the fxa-content-server"

start on runlevel [2345]
stop on runlevel [^2345]

console log
chdir /home/fxcloud/fxa-content-server
setuid fxcloud
setgid fxcloud

env HOME=/home/fxcloud
respawn
respawn limit 20 5

exec npm start

fx-sync-server.conf:

sudo vi /etc/init/fx-sync-server.conf

# description "Start the fx-sync-server"

start on runlevel [2345]
stop on runlevel [^2345]

console log
chdir /home/fxcloud/syncserver
setuid fxcloud
setgid fxcloud

env HOME=/home/fxcloud
respawn
respawn limit 20 5

exec make serve

Serverstart

sudo start fxa-auth-db-mysql
sudo start fxa-auth-server
sudo start fxa-content-server
sudo start fx-sync-server

Das war es wieder mit dem Schnelldurchlauf, nun müssen noch die Adressen im Firefox angepasst werden. Dazu in der Adressleiste vom Firefox about:config eingeben. Nach den folgenden Einträgen suchen und den Wert entsprechend anpassen. Bei einer eigenen CA muss das Root-Zertifikat im Firefox importiert werden.

identity.fxaccounts.auth.uri
https://fxaccount-api.domain.tld/v1

identity.fxaccounts.remote.force_auth.uri
https://fxaccount.domain.tld/force_auth?service=sync&context=fx_desktop_v1

identity.fxaccounts.remote.signin.uri
https://fxaccount.domain.tld/signin?service=sync&context=fx_desktop_v1

identity.fxaccounts.remote.signup.uri
https://fxaccount.domain.tld/signup?service=sync&context=fx_desktop_v1

identity.fxaccounts.settings.uri
https://fxaccount.domain.tld/settings

identity.sync.tokenserver.uri
https://fxsync.domain.tld/token/1.0/sync/1.5


Ergänzung

Einrichten des Sync unter Firefox für Android

Das Ändern der Einstellungen für die eigenen Adressen funktioniert unter Firefox für Android nicht wie bei der Desktop Version.

Notwendig dazu ist das Fxa Custom Server Addon. In diesem werden die Adressen für den Auth-Server (https://fxaccount-api.domain.tld/v1) und den Sync-Server (https://fxsync.domain.tld/token/1.0/sync/1.5) hinterlegt.

Leider ist auch dieses Addon nicht mehr verfügbar. Der Entwickler hat es gelöscht, da man nun die eigenen Adressen so ähnlich wie bei der Desktop Variante unter about:config einrichten kann. Dieser Weg hat aber bei mir nicht funktioniert. Das könnte an dem Custom Port liegen, da ich nicht den Standard Port 443 für HTTPS verwende. Auf GitHub habe ich die letzte Entwickler Version gefunden und zu einem xpi Paket gewandelt.

Rechtsklick auf den Link und "Ziel speichern unter ..."

Fxa Custom Server Addon
sha256-Prüfsumme: 6c8006ba3f1b0090a5c794562c0df0cf79b60de6b6e065e9363090bdb03fe510

Firefox 40.0.3 Download (externer Link zur Dropbox)
sha256-Prüfsumme: 656a8f34f6cada407c8dd0de1e7a3e8d015b6814c6517d0f80fbc65ce2b7bf8b

Die Installation des Fxa Custom Server Addon funktioniert nur direkt über die Adresszeile vom Firefox. Das zuvor auf der Speicherkarte des Smartphone abgelegte Addon im Firefox aufrufen, z.B. file:///storage/emulated/0/fxa-custom-server-addon.xpi und installieren. Bei einer eigenen CA muss auch das Root-Zertifikat auf diesen Weg importiert werden. Danach die Adressen für den Auth-Server (https://fxaccount-api.domain.tld/v1) und den Sync-Server (https://fxsync.domain.tld/token/1.0/sync/1.5) im Addon eintragen.

Zu beachten ist, dass dieses Paket nicht von Mozilla signiert wurde. Trotzdem funktioniert es bei mir problemlos mit der aktuellen Firefox Version zusammen. Es ist aber zwingend erforderlich, erst die Firefox Version 40.0.3 zu installieren und anschließend nach Einrichten des Sync auf die aktuelle Version zu Updaten.