29 October 2014

Настройка своего сервера синхронизации Firefox Sync

FirefoxBrowsers
Sandbox
image

Firefox Sync, это служба, которая позволяет пользователям переносить полностью свою историю, пароли, закладки, открытые вкладки и даже дополнения между различными устройствами, на которых установлен браузер Firefox, как для десктопной версии, так и для Android.

Firefox Sync реализуется двумя сущностями — сервисом авторизации (Firefox account API) и сервером синхронизации (Firefox Sync).

Давно возникла идея настроить свой сервер для синхронизации паролей, закладок и прочих радостей жизни. По роду деятельности, не очень доверяю публичным сервисам, таким, как LastPass или Google Account. На мой взгляд, приватные данные должны храниться на своем сервере.

Ну да хватит лирики, приступим к настройке.


UPDATE:
Этот способ работает для firefox старше версии 29 и описывает конфигурирование сервера синхронизации версии 1.5.

Настройка предлагается для сервера под управлением ОС Debian.
Есть возможность реализации нескольких схем синхронизации:
1. Firefox account API + Firefox Sync Server
2. Firefox account API + свой Sync Server
3. Свой account API + свой Sync Server

Я остановился на втором варианте.

Предполагается, что на сервере уже стоит веб-сервер apache2 и сервер баз данных mysql. Последнее, впрочем, необязательно, поскольку я не нашел способа вменяемо подружить сервер синхронизации с БД mysql, и использовал sqlite. При использовании mysql коннектор периодически отваливался от базы данных.

Пусть наш сервер синхронизации будет доступен по адресу sync.domain.com.

Установим необходимые пакеты:

$ sudo apt-get install python-dev git-core python-virtualenv libapache2-mod-wsgi

Установку сервера синхронизации будем вести в директорию /var/www/

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

Произведем базовое конфигурирование сервера:

$ cat syncserver.ini


[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 5000

[app:main]
use = egg:syncserver

[syncserver]
public_url = https://sync.domain.com/

sqluri = sqlite:////var/www/db.sql
secret = your_server_key


your_server_key может быть любой фразой, я ее сгенерировал так:

head /dev/urandom |md5sum

Создадим файл для базы данных:

$ touch /var/www/db.sql

Поправим права на директорию:

$ chown -R www-data:www-data /var/www/
$ chmod 600 /var/www/db.sql


ОБРАТИТЕ ВНИМАНИЕ!
В своей конфигурации я расположил файл db.sql в директории /var/www/, поскольку сервер используется только для синхронизации, и apache не смотрит на этот файл.

В случае, если в /var/www у вас смотрят другие виртхосты, поместите файл с БД куда-нибудь в другое место.

Обращаться к sync-серверу будем по HTTPS.
Для этого настроим apache.

$ cat /etc/apache2/sites-available/sync.domain.com.conf


<VirtualHost *:80>
ServerName sync.domain.com
Redirect permanent / https://sync.domain.com/
ErrorLog /var/log/apache2/sync/error.log
CustomLog /var/log/apache2/sync/access.log combined
</VirtualHost>
<VirtualHost *:443>
Servername sync.domain.com 
ServerAdmin webmaster@domain.com 
DocumentRoot /var/www/syncserver
WSGIProcessGroup sync.domain.com
WSGIDaemonProcess sync.domain.com user=www-data group=www-data processes=2 threads=25 python-path=/var/www/syncserver/local/lib/python2.7/site-packages
WSGIPassAuthorization On
WSGIScriptAlias / /var/www/syncserver/syncserver.wsgi

ErrorLog /var/log/apache2/sync/error-ssl.log
CustomLog /var/log/apache2/sync/access-ssl.log combined

SSLEngine on
SSLProtocol -ALL +SSLv3 +TLSv1
SSLHonorCipherOrder On
SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH
SSLCertificateFile /etc/apache2/ssl/sync.domain.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/sync.domain.com.key
<Directory /var/www/syncserver>
  Order deny,allow
  Allow from all
</Directory>
</VirtualHost>

Сгенерируем самоподписанные ключи:

$ cd /etc/apache2/ssl/
$ openssl genrsa -des3 -out server.key 1024
$ openssl req -new -key server.key -out server.csr
$ cp server.key sync.domain.com.key
$ openssl rsa -in sync.domain.com.key -out server.key
$ openssl x509 -req -days 365 -in server.csr  -signkey server.key -out server.crt
$ cp server.crt sync.domain.com.crt
$ cp server.key sync.domain.com.key

Создадим директорию для логов:
$ mkdir /var/log/apache2/sync/
$ touch /var/log/apache2/sync/error-ssl.log
$ touch /var/log/apache2/sync/access-ssl.log
$ touch /var/log/apache2/sync/error.log
$ touch /var/log/apache2/sync/access.log
$ chown -R www-data:www-data /var/log/apache2/sync/

Активируем новый виртхост:

$ a2ensite sync.domain.com


И перезапустим apache:

service apache2 restart

Если мы все сделали правильно, то при обращении к
https://sync.domain.com/token/1.0/sync/1.5 
веб-сервер отдаст нам нечто вроде:

{"status": "error", "errors": [{"location": "body", "name": "", "description": "Unauthorized"}]}

Обязательно добавьте свой сертификат в исключения браузера, иначе синхронизация не заработает!

Осталось настроить сам браузер.

Заходим в about:config, и меняем значение ключа services.sync.tokenServerURI на
https://sync.domain.com/token/1.0/sync/1.5

После этого авторизуемся в Меню -> Настройки -> Синхронизация, используя аккаунт Mozilla, и пользуемся.
Кстати, если мы отключимся от аккаунта синхронизации, то ключ services.sync.tokenServerURI примет значение по умолчанию.

P.S.
К сожалению, не удалось настроить синхронизацию с мобильным телефоном на Android, используя fxa-custom-server-addon, если у кого-то получится — отпишитесь, пожалуйста, в комментарии.

Всем спасибо за внимание.

UPDATE

По просьбе трудящихся товарища Godless выкладываю виртуалку с преднастроенным mozilla-sync-server
Скачать можно тут(457.7 MB).
Образ виртуалки в формате бекапа Proxmox, все что нужно — это развернуть его на вашем хосте.
Также нужно провести небольшой ряд правок в конфигах:
$ cat /home/syncserv/syncserver.ini

...
[syncserver]
public_url = https://ЗАМЕНИТЬ_НА_ВАШ_IP/  (или доменное имя)
...
secret = ПЕРЕГЕНЕРИРОВАТЬ_КЛЮЧ    (head /dev/urandom |md5sum)
...

Также обновил конфиг апача, новый вариант (с отключенным SSLv3 и SSLv2 — спасибо Anisotropic ):

<VirtualHost *:80>
ServerName sync.domain.com
Redirect permanent / https://sync.domain.com/
ErrorLog /var/log/apache2/sync/error.log
CustomLog /var/log/apache2/sync/access.log combined
</VirtualHost>
<VirtualHost *:443>
Servername sync.domain.com
ServerAdmin webmaster@domain.com
DocumentRoot /home/syncserv  
WSGIProcessGroup sync.domain.com
WSGIDaemonProcess sync.domain.com user=syncserv group=syncserv processes=2 threads=25 python-path=/home/syncserv/local/lib/python2.7/site-packages
WSGIPassAuthorization On
WSGIScriptAlias / /home/syncserv/syncserver.wsgi

ErrorLog /var/log/apache2/sync/error-ssl.log
CustomLog /var/log/apache2/sync/access-ssl.log combined

SSLEngine on
SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH
SSLCertificateFile /etc/apache2/ssl/sync.domain.com.crt
SSLCertificateKeyFile /etc/apache2/ssl/sync.domain.com.key
<Directory /home/syncserv>
  Order deny,allow
  Allow from all
</Directory>  
</VirtualHost>


SQLite база данных теперь лежит в /var/lib/sql/db.sql
Passphrase к SSL сертификатам, как и к root-паролю habr2014

Кому интересно — потестируйте, сообщите о багах, при необходимости поправлю.
Tags:firefoxбраузерсинхронизация
Hubs: Firefox Browsers
+30
37.8k 403
Comments 40
Top of the last 24 hours