Héberger les marques pages Firefox

Installation des dépendences

Utilisateur système firefox

sudo useradd firefox

Dépendences logiciels

sudo apt update && sudo apt install python-dev git-core python-virtualenv g++ sqlite

syncserver

sudo mkdir /srv/ff
sudo chown firefox.firefox -R /srv/ff
cd /srv/ff
sudo -u firefox git clone https://github.com/mozilla-services/syncserver 

Configuration de base

La configuration de Syncserver se trouve dans le fichier syncserver.ini.
Vous devez le modifier avant de compiler l'application sans quoi les paramètres ne seront pas pris en compte.
Dans le fichier syncserver.ini, vous pouvez modifier la section [server:main] si le besoin s’en fait sentir. La configuration de base est fonctionnelle pour cette partie là.
Afin de vous facilitez la vie, j’ai créé un fichier syncserver.ini presque bien configuré. Vous pouvez le trouver à cette adresse here (quelques modifications sont toujours nécessaires).

Le paramètre public_url.
Modifiez ce paramètre afin qu’il corresponde à l’url publique à travers laquelle sera accessible Syncserver même s’il s’agit d’une machine virtuelle ou un conteneur placé derrière un reverse proxy.

public_url = https://example.com

Le paramètre sqluri.
J’ai décidé d’utiliser une base de données de type Sqlite pour conserver les marques pages car il utilise un moteur de base de données facile à sauvegarder. Vous pouvez choisir la base de données avec le moteur que vous voulez. Attention, si vous n’en définissez aucun, les marques pages seront stockés en mémoire RAM et supprimer au redémarrage de la machine. Pour utiliser une base de données Sqlite, vous devez remplacer le paramètre sqluri = sqlite:////tmp/syncserver.db by :

sqluri = sqlite:////srv/ff/syncserver/syncserver_data.db
*//// signifie chemin absolu

Le paramètre secret.
Il est très vivement recommandé de générer une clé secrète. Cette clé est utilisé par les tokens d’authentification. Si vous ne le faites pas, Syncserver générera lui-même cette clé à chaque démarrage. Il peut arriver que la clé générée automatiquement soit faible, en cas de faible disponibilité de valeurs aléatoires. Pour générer une clé de façon solide, vous pouvez utiliser la commande suivante.

head -c 20 /dev/urandom | sha1sum

Le paramètre allowed_issuers.
Dans le cas où vous utilisez le système d’authentification par défaut, vous pouvez n’autoriser que celui de Firefox ou bien le votre si vous en avez un à disposition.

allowed_issuers = api.accounts.firefox.com

Le paramètre force_wsgi_environ.
J’ai configuré le serveur derrière un reverse proxy Apache2. J’ai fais quelques essais avec la valeur false mais cela ne fonctionnait pas. J’ai par conséquence créé une erreur sur le dépôt Github officiel du projet. On m’a alors conseillé de changer la valeur pour true, cela a fonctionne pour moi.

force_wsgi_environ = true 

Le fichier /srv/ff/syncserver/syncserver.ini

[server:main]                                                                                                                                
use = egg:gunicorn                                                                                                                           
host = 127.0.0.1
port = 5000                                                                                                                                  
workers = 2                                                                                                                                  
timeout = 60                                                                                                                                 
                                                                                                                                             
[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.cinay.pw

# This defines the database in which to store all server data.                                                                               
sqluri = sqlite:////srv/ff/syncserver/syncserver_data.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 = 6463da1839cb40744e1568d9d1f50fffa9d3904b
                                                                                                                                             
# Set this to "false" to disable new-user signups on the server.                                                                             
# Only request by existing accounts will be honoured.                                                                                        
allow_new_users = true                                                                                                                    

# 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

[browserid]                        
# Uncomment and edit the following to use a local BrowserID verifier  
# rather than posting assertions to the mozilla-hosted verifier.      
# Audiences should be set to your public_url without a trailing slash.                                                                       
#backend = tokenserver.verifiers.LocalVerifier                        
#audiences = https://localhost:5000                                   

# By default, syncserver will accept identity assertions issues by    
# any server. You can restrict this by setting the below to a list    
# of allowed issuer domains.       
allowed_issuers = api.accounts.firefox.com 

Compilation de l’application et démarrage de l’application

#sudo chown -R firefox:firefox /srv/ff/syncserver
cd /srv/ff/syncserver

Compilation

sudo -H -u firefox make build
[...]
Creating /srv/ff/syncserver/local/lib/python2.7/site-packages/syncserver.egg-link (link to .)
Adding syncserver 1.8.0 to easy-install.pth file

Installed /srv/ff/syncserver
Processing dependencies for syncserver==1.8.0
Finished processing dependencies for syncserver==1.8.0
touch ./local/COMPLETE

Compilation suite

sudo -H -u firefox make test 
[...]
Ran 60 tests in 23.893s

OK (skipped=6)

Après cela, si vous executez la commande suivante et vous devriez voir quelques lignes indiquant que Syncserver est correctement lancé et écoute sur le port par défaut.

sudo -u firefox make serve
./local/bin/gunicorn --paste ./syncserver.ini
[2018-09-11 18:18:44 +0000] [7936] [INFO] Starting gunicorn 19.6.0
[2018-09-11 18:18:44 +0000] [7936] [INFO] Listening at: http://193.70.43.101:5000 (7936)
[2018-09-11 18:18:44 +0000] [7936] [INFO] Using worker: sync
[2018-09-11 18:18:44 +0000] [7941] [INFO] Booting worker with pid: 7941

Pour information, vous ne verrez pas de texte si la synchronisation de vos marques pages fonctionne ou non.
Une fois que syncserver a bien collecté les marques-page de votre navigateur.
Vous pouvez modifier le fichier syncserver.ini et changer le paramètre allowed_issuers = api.accounts.firefox.com pour allowed_issuers = false afin d’être certain d’être le seul utilisateur du logiciel.

Mise-à-jour

Après avoir compilé l’application, vous devriez mainteant voir deux répertoires: syncserver.egg-info et local. Dans le cas où vous souhaitez mettre à jour Syncserver, vous devrez penser à bien les supprimer.

rm -r syncserver.egg-info
rm -r local

nginx proxy sync.cinay.pw

Créer une configuration /etc/nginx/conf.d/sync.cinay.pw.conf

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name sync.cinay.pw;

    include ssl_params;
    #include header_params;
    #add_header Strict-Transport-Security "max-age=31536000;";

    #include dh_param;


        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/;
                }

    access_log /var/log/nginx/sync.cinay.pw-access.log;
    error_log /var/log/nginx/sync.cinay.pw-error.log;
}

Vérifier

sudo nginx -t

Recharger nginx

sudo systemctl reload nginx

service syncserver systemd

Créer un service syncserver pour un démarrage automatique

sudo nano /etc/systemd/system/syncserver.service
[Unit]
Description=Syncserver
Documentation=https://github.com/mozilla-services/syncserver
After=network.target

[Service]
Type=oneshot
User=firefox
Group=firefox
WorkingDirectory=/srv/ff/syncserver
ExecStart=/srv/ff/syncserver/local/bin/gunicorn --daemon --paste /srv/ff/syncserver/syncserver.ini
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Lancer le service syncserver :

sudo systemctl daemon-reload
sudo systemctl start syncserver

#Vérifier:

sudo systemctl status syncserver
● syncserver.service - Syncserver
   Loaded: loaded (/etc/systemd/system/syncserver.service; disabled; vendor preset: enabled)
   Active: active (exited) since Tue 2018-09-11 18:35:31 CEST; 9s ago
     Docs: https://github.com/mozilla-services/syncserver
  Process: 10345 ExecStart=/srv/ff/syncserver/local/bin/gunicorn --daemon --paste /srv/ff/syncserver/syn
cserver.ini (code=exited, status=0/SUCCESS)
 Main PID: 10345 (code=exited, status=0/SUCCESS)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/syncserver.service
           ├─10347 /srv/ff/syncserver/local/bin/python2 /srv/ff/syncserver/local/bin/gunicorn --daemon -
-paste /srv/ff/syncserver/syncserver.ini
           └─10351 /srv/ff/syncserver/local/bin/python2 /srv/ff/syncserver/local/bin/gunicorn --daemon -
-paste /srv/ff/syncserver/syncserver.ini

sept. 11 18:35:31 cinay.pw systemd[1]: Starting Syncserver...
sept. 11 18:35:31 cinay.pw systemd[1]: Started Syncserver.

Activer le service si ok

sudo systemctl enable syncserver

Configuration du navigateur

La procédure varie un petit peu selon que vous utilisiez Firefox sur mobile ou ordinateur de bureau. Cela peut également ne pas fonctionner pour les versions très anciennes du navigateur. Je vais uniquement présenté le processus pour la version bureau. Plus d’informations pour la configuration des autres versions accessibles ici

  1. Saisir about:config dans le champs url de votre navigateur (si écran d’avertissement, confirmation du choix)
  2. Rechercher la clé qui porte le nom identity.sync.tokenserver.uri
  3. Double cliquer sur la ligne et remplacer la valeur attribuée à cette clé par la valeur
    La syntaxe de la valeur doit être la suivante https://sync.cinay.pw/token/1.0/sync/1.5
    Bien que la version actuelle soit la version 1.8, le chemin vers le fichier est resté avec la valeur token/1.0/sync/1.5 …
    en cas de soucis, la valeur originale de votre navigateur est https://token.services.mozilla.com/1.0/sync/1.5

Déconnectez vous de votre compte Firefox puis redémarrez Mozilla Firefox afin que les modifications soient prises en compte.
Une fois que la navigateur a redémarré, reconnectez-vous à votre compte firefox.

Durcissement de la configuration et nettoyage

Verrouillage de Syncserver

Comme vous pouvez le voir, vous pouvez désormais enregistrer vos marques-pages sur le Syncserver de votre choix. Il est probable que vous souhaitiez limité l’accès à Syncserver à vous-même. Pour éviter qu’une autre personne puisse enregistrer ses données sur votre Syncserver, vous devez modifier le fichier syncserver.ini

  1. en modifiant le paramètre allow_new_users = false (si accès pour un seul utilisateur)
  2. supprimer les deux répetoires syncserver.egg-info et local
  3. **compiler une nouvelle fois l'application**.
cd /srv/ff/syncserver
sudo nano syncserver.ini
sudo systemctl stop syncserver
sudo rm -r syncserver.egg-info
sudo rm -r local
sudo -u firefox make build
#sudo -u firefox make test
sudo systemctl start syncserver

Nettoyage

Si vous avez installé le programme make et g++ pour compiler l’application, vous pouvez désormais le supprimer.

sudo apt purge make g++

Bien sur, configurer le pare-feu correctement

Arrêter syncserver

sudo mv /etc/nginx/conf.d/sync.cinay.pw.conf /etc/nginx/conf.d/sync.cinay.pw.conf.sav
sudo systemctl reload nginx
sudo systemctl stop syncserver
sudo systemctl disable syncserver

Sources