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

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

Кому интересно — потестируйте, сообщите о багах, при необходимости поправлю.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 40

    0
    1. нет команды запуска самого сервера (eg $ local/bin/pserve syncserver.ini )
    2. Также указать надо, что данный сервер будет работать только с браузером Firefox 29+
    ( по мотивам офф документации на Mozilla)
    Было здорово еще и настройку под nginx описать сразу. Она там тоже есть.

    Так же можно использовать ssl сетрификаты от StartSSL, чтобы по феншую.

    А так, спасибо.
      +1
      1. нет команды запуска самого сервера (eg $ local/bin/pserve syncserver.ini )

      Ее и не должно быть. Мы же работаем через mod_wsgi апача
      2. Также указать надо, что данный сервер будет работать только с браузером Firefox 29+

      Спасибо, поправлю.
        0
        Ее и не должно быть. Мы же работаем через mod_wsgi апача

        Ой, да, чтото немножко пропустил этот момент :) Тогда нормально. Но про nginx Было бы интересно, не хочется ради этого апач ставить.
          0
          Ну, в принципе, в официальной документации есть пример конфига для nginx.
            0
            Раз там WSGI, будет спокойно работать с nginx + uWSGI / gunicorn / сервер по вкусу.
        +4
        И забаньте ssl3 :)
          +2
          $ chmod 777 /var/www/db.sql
          
          я что-то упустил, или так на душе будет спокойнее:

          # chmod 600 /var/www/db.sql
          
            0
            Вообще, по хорошему, и файл бы неплохо переложить в другую директорию, но так как сервер у меня исключительно под синхронизацию настраивался — то и так жить будет. Но поправку внесу, хотя, на мой взгляд
            # chmod 700 /var/www/db.sql
            

            будет правильнее.
              +1
              # chmod 700 /var/www/db.sql

              будет правильнее.

              а зачем sql-файлу execution-бит?
                –1
                И впрямь. Пофиксил.
            0
            Некоторое время назад я бы порекомендовал посмотреть на firefox_sync в owncloud (там реализация firefox synx 1.1).
            Там используется более простой и каноничный набор ПО (nginx+php+mysql).
            Но с выходом firefox sync 1.5 (как раз в ff 29), новые версии firefox заработают с ним только с напильником.
            Будем надеяться, что там реализуют firefox sync 1.5 и у нас опять появится ещё один способ поднять свой ff sync сервер.
              0
              Стоит сказать, что «напильник» заключается лишь в правке одного параметра в about:config.
              Не так уж и сложно, на мой взгляд. Что касается owncloud, то стоит ли плодить лишние сущности?
                0
                Напильник там посерьезнее.
                Я для себя сохранил такую инструкцию:
                gist.github.com/mariussturm/061b9f4861ef1292aa60

                В разных случаях разные сущности являются лишними)
                Если уже есть сервер с nginx+php+mysql, лишних сущностей не добавляется.
                Я про python+wsgi+apache+sqlite.
                Это может быть актуально на небольшой виртуалке, чтобы не тратить оперативку.

                Ещё, как я понял, вы оставляете Firefox account API серверам mozilla.
                firefox_sync от owncloud поддерживает авторизацию у себя.
                Это дает возможность удобно управлять правами — создаете столько пользователей, сколько вам нужно.
                  0
                  Как я и писал,
                  Есть возможность реализации нескольких схем синхронизации:
                  1. Firefox account API + Firefox Sync Server
                  2. Firefox account API + свой Sync Server
                  3. Свой account API + свой Sync Server
                  Я остановился на втором варианте.


                  Можно, конечно, настроить свой account API, на офсайте Mozilla есть необходимые инструкции, но их сервер авторизации требует nodejs, а для моей задачи это уже немного перебор.

                  Касаемо mysql — постоянно получал ошибку Mysql server has gone away, так и не понял, с чем это связано, потому использовал sqlite.
                    0
                    Да, я про это и говорю — вы решили оставлять Firefox account API серверам mozilla.
                    Т.е. в полной установке sync сервер от mozilla хочет python, node и странно работает с mysql.
                    owncloud в этом свете выглядит альтернативой.
                      0
                      Но, увы, как вы ранее написали, это было актуально лишь до 29-й версии firefox.
                        0
                        Да, остается ждать, когда в owncloud реализуют новый функционал.
              0
              как-то пробовал поставить Sync Server 1.1, вроде бы всё работало с виду нормально, а на деле закладки/расширения синхронизировались постоянно не полностью. с новым уже нет таких проблем?
              и поясните кто-нибудь про андройд — можно настроить на свой сервер или всё-таки не работает?
                0
                закладки/расширения синхронизировались постоянно не полностью. с новым уже нет таких проблем?

                Расширения не синхронизируются by design, с закладками проблем нет.
                и поясните кто-нибудь про андройд — можно настроить на свой сервер или всё-таки не работает?

                Касаемо андроида — есть дополнение fxa-custom-server-addon для заведения аккаунта синхронизации на мобильном firefox с блекджеком со своими серверами, но сколько я его не крутил, синхронизация не завелась.
                То есть аккаунт создается, в нем указано что он настроен на мой сервер синхронизации, при попытке синхронизировать, пишет что все ОК, но по факту даже исходящих пакетов с телефона на мой сервер нет, и в логах пусто, то есть телефон даже не делает попыток подключиться.
                  0
                  Расширения не синхронизируются by design

                  разве не должно сихронизировать список расширений (естественно не сами xpi-файлы), которые затем скачиваются с addons.mozilla.org? точно не уверен, но вроде бы старый сервер так мог.

                  а по поводу ведра — оч печально. значит пока не вижу смысла настраивать это всё
                    0
                    Если не ошибаюсь, то и старый сервер не умел тоже.
                      0
                      Я, конечно, могу ошибаться, но Вы не правы. Старый мог — там была для этого специальная галочка даже. В новом тоже есть: в Настройки->Синхронизация->Дополнения.
                      В старом это работало замечательно, как в новом — не знаю — уже давно новых дополнений не ставил.
                        0
                        Посмотрел сейчас настройки Firefox — да, есть галочка синхронизации дополнений. По идее, должно поддерживать.
                          0
                          Поддерживает. Еще с первой версии.
                0
                новая синхронизация нормально работает? десктоп/телефон можно уже подружить? Что с надежностью?
                  0
                  субъективно
                  Штатная работает норм. Синкает все что галочками отмечено со всех компов и телефонов. У меня работает уже со времени выхода 30й (или 31й) версии ФФ.
                  И бонусов: по сравнению со старой версией, синкаются даже настройки расширений. Оч удобно.
                  Из косяков: после отрубания клиента от старой версии, при подключении к новой остались артефакты от зомби-установок ФФ (это FF в системах, которые были убиты не отключая FF от синка) — хз откуда они там. Видимо засинкались с клиента
                  Субъективно — работает лучше чем предыдущая. Не разу не падала, не замечал чтобы что-то не синкалось...


                  десктоп/телефон можно уже подружить?

                  и да и нет
                  Если с офф сервером Mozilla — то можно, у мну воркает норм.
                  Если со своим (в варианте как в статье или со своими Sync && Account серверами) — то проблемы, был/есть какой-то баг в самом ФФ для эндрю. Инфа на момент 31й версии, сейчас хз.


                  Месяца 3 назад хотел настроить сие чудо дома полностью с аккаунт сервером, но почитав немного про траблы, решил подождать.
                  А потом так вышло что без синка закладок жить дальше нельзя, пришлось на все девайсы подключить родную…
                  А сейчас чего-то времени нету.

                  ЗЫ: Вот бы кто выложил готовую виртуалочку или скриптец… ^_^
                    +1
                    Кстати, хорошая мысль. Может, сегодня выложу. И то, и то)
                      0
                      Акк + Синк? =) Огромнейшей нечеловеческое и человеческое спасибо вам будет, когда выложите =)
                        0
                        Только синк, уже выложил, смотрите update поста.
                          0
                          Спасибо, дома проверим. Только у меня KVM хост, но думаю разберемся…
                            0
                            У меня proxmox как раз KVM использует.
                  0
                  Кстати, а почему firefox не синхронизирует зашифрованную версию паролей?
                    0
                    Что вы имеете в виду?
                      0
                      Есть база паролей плюс мастер-ключ. Если база без шифрования, то он её синхронизировать может. А если мастер-пароль, то везде изолированные базы почему-то. Хотя мог бы просто шифрованную базу с хешем мастер-пароля синхронизировать.
                        +1
                        Затрудняюсь на ваш вопрос ответить.
                          0
                          Вы логины-пароли в открытом виде хранителем? Если нет, то как синхронизацию проводите?
                      0
                      Баг пофиксили только в 34 версии
                      bugzilla.mozilla.org/show_bug.cgi?id=995268

                      Версия 39 ESR работает синхронизация с мастер-паролем
                        0
                        О. Спасибо.
                      0
                      Класс!!!
                      А теперь ещё про собственный сервер для обновлений FF напишите и цены Вашим статьям не будет!
                        +1
                        По-моему, Mozilla обещала, что при синхронизации используется end-to-end шифрование, т.е. личные данные хранятся на сервере в зашифрованном виде ключом, известным только пользователю.

                        Only users with full accounts can post comments. Log in, please.