Firefox Sync 用に独自サーバーを構築 の履歴(No.1)
更新概要†
Firefox Sync を安心して利用するため、 自宅の Deiban マシンに独自サーバーを建てました。
Firefox Sync とは†
Firefox の様々な設定を、PC 内部ではなくインターネット上のサーバーに保存することで、 異なる PC にインストールした Firefox 間で情報を共有することを 目的とした機能だそうです。
http://mozilla.jp/firefox/sync/
- Bookmark
- History
- Passwords
- Preferences
- Tabs
が共有されるそうです。
この機能、 Firefox 4 からは標準装備になるそうですが、 Firefox 3 については add-on として同等の機能が提供されています。
以下は [Firefox 3.6.11] + [Firefox Sync 1.5] で試した結果です。
データ保管サーバについて†
情報を保存するためのサーバーは Mozilla Project が提供してくれているので、 何も気にしなければ無料でアカウントを取って、すぐに利用することができます。
セキュリティーについて†
ただ、Firefox には頻繁に訪れるサイトのアカウント情報なども 保存されていたりするので、その内容を見ず知らずのサーバーに アップロードするのはセキュリティ上どうなの?
という不安に駆られます。
この点について、 Firefox Sync ではすべての情報をローカルで暗号化してからサーバーに送り、 サーバーから送られてきたデータをローカルで復号する形になっているため、 サーバー運営者であっても暗号化する前の情報を読むことはできないそうです。
独自サーバー†
それでもやはり見ず知らずのサーバーに送るのは気持ちが悪い。
という人は、自分でサーバーを立ち上げて、 そこにデータを保管することもできるそうです。
プロトコルは http あるいは https ベースなので、 自分の管理する Web サーバーに php で書かれた スクリプトをインストールするだけで簡単にサーバーを建てられます。
ということで†
自分でサーバーを建てよう、とやってみたのが以下の内容です。
サーバーとなる php スクリプトをダウンロード†
サーバースクリプトは、
http://tobyelliott.wordpress.com/2010/01/29/weave-server-1-0-official-release/
を参考に、
http://people.mozilla.org/~telliott/weave_minimal.tgz
を落としてきました。
Firefox Sync は以前 Weave Sync と呼ばれていたそうで、 その名残がサーバースクリプト名として残っています。
LANG:console ~$ wget http://people.mozilla.org/~telliott/weave_minimal.tgz ~$ tar fxz http://people.mozilla.org/~telliott/weave_minimal.tgz ~$ ls weave_minimal weave_minimal.tgz ~$ mv weave_minimal weave ~$ cd weave ~/weave$ ls README index.php weave_storage.php create_user weave_basic_object.php ~/weave$ cat README SERVER SETUP Add the following line to your apache config: Alias /weave /<path to this folder>/index.php Restart your apache server. Point your browser at https://localhost/weave/1.0/blah/info/collection. Enter "blah" for the username and garbage for the pwd. Auth will fail, but it will create the db (you can cancel the subsequent request for auth). You should now see a file called weave_db in the directory. You can create and delete users by running the create_user script. CLIENT SETUP in about.config, set extensions.weave.serverURL to https://<your servername>/weave/ You can run it under http, but this is insecure and not recommended.
weave フォルダを /var/www へ移動†
自分で管理しているサーバーなので、ルートに持ってっちゃいます。
その際 owner を www-data にするのを忘れると、 http://blog.zuzara.com/2008/02/15/248/ のようなエラーに悩まされるので注意が必要です。
LANG:console ~weave/$ cd ~$ sudo mv weave /var/www ~$ cd /var/www /var/www$ sudo chown -R www-data:www-data weave
apache に alias を設定†
weave_minimal の README にあったとおり、
http://server-name.jp/weave/foo/bar へのアクセスを
http://server-name.jp/weave/index.php/foo/bar と解釈するための alias
を設定し、apache2 を再起動します。
LANG:console /var/www$ sudo jed /etc/apache2/site-enabled/default ... Alias /weave /var/www/weave/index.php ... /var/www$ /etc/init.d/apache2 restart
アクセスしてみる†
weave_minimal の README にあったとおり (s/collection/collections/ が必要ですが)、
エラーになることを前提に、https://localhost/weave/1.0/blah/info/collections へアクセスしてみると、weave_db というファイルが生成されるはず。
だめな場合は、weave フォルダへの書き込み権限がないか、 apache2, php, json, sqlite3 等のパッケージが足りないかのどちらかだと思います。
前者については、weave フォルダが www-data の所有になっていて、 なおかつ書き込み可能であることを確認すれば OK です。
後者は・・・私の環境ではすでに入っていたので、正確に何と何が必要かはよくわかりません。悪しからず。
LANG:console /var/www$ wget http://localhost/weave/1.0/blah/info/collections localhost をDNSに問いあわせています... 127.0.0.1, ::1 localhost|127.0.0.1|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 401 Unauthorized 認証に失敗しました。 /var/www$ ls weave README index.php weave_db create_user weave_basic_object.php weave_storage.php
ユーザーを登録する†
weave フォルダの create_user スクリプトを使います。
登録したら、http://localhost/weave/1.0/blah/info/collections へ問い合わせると、ちゃんと空の配列が返るはずです。
LANG:console /var/www$ cd weave /var/www/weave$ sudo php ./create_user (c)reate, (d)elete or change (p)assword: c Please enter username: osamu Please enter password: osamu created /var/www/weave$ wget -q -O - \ --auth-no-challenge \ --http-user=osamu \ --http-password=**** \ http://localhost/weave/1.0/osamu/info/collections []
Firefox で動作確認†
[ツール(T)]-[オプション(O)] で出てくるダイアログに [Sync] という項目があり、 これを選ぶと [Set Up Firefox Sync(S)] のボタンが現れます。
これを押して、[I Have a Firefox Sync Account] から、
[Server] を [Use a custom server] として、
サーバー名として http://server-name.jp/weave/ を入れ、
先に登録したユーザー名&パスワードを入力します。
次に聞かれる Sync Key は、サーバーに送る前にデータを 暗号化する際に用いる秘密鍵なので、サーバーへのログイン用 パスワードとは異なるものを別途指定します。
これで、Sync が可能なはずです。
public_html 下で動かす場合†
自分で管理しているサーバーでない場合には、 フォルダをドキュメントルートに置いたり、 apache に Alias を設定するわけにいかないので、 自分のホームディレクトリの下の public_html でスクリプトを動作させることになります。
注意点としては、
- http デーモンが weave ディレクトリと weave_db の両方に書き込み権限を持っていなければならないこと
- weave_db を http デーモンに作成されてしまうと自分の権限で書き換えられなくなってしまうので、weave_db は自分のアカウントで作らなければならないこと
が挙げられます。
このせいで、セキュリティ的にはガタガタになります。 覚悟の上で使うより、あきらめて Mozzila のサーバーを使うのが吉かもしれません。
手順は以下のようになります。
LANG:console ~$ wget http://people.mozilla.org/~telliott/weave_minimal.tgz ~$ tar fxz http://people.mozilla.org/~telliott/weave_minimal.tgz ~$ mv weave_minimal weave ~$ cd weave ~/weave$ ls README index.php weave_storage.php create_user weave_basic_object.php
この時点で、ユーザーを登録するとともに weave_db を作成してしまいます。
上でしたように httpd に weave_db を作らせると 所有権が www-data:www-data になるため、 後から自分でいじれなくなってしまいます。 それを回避するのがこの手順です。
LANG:console ~/weave$ php create_user (c)reate, (d)elete or change (p)assword: c Please enter username: osamu Please enter password: osamu created
そして、public_html に移動してパーミッションを調整します。
LANG:console ~/weave$ cd ~$ mv weave public_html/ ~$ cd public_html ~public_html$ chmod a+w weave ~public_html$ cd weave ~public_html/weave$ chmod a+w weave_db
繰り返しになりますが、php から sqlite を使う場合、 weave_db だけでなく、 weave_db のあるディレクトリにも書き込み権限が必要なため、 このような形にせざるを得ません。
お気づきの通り、これだとサーバーにアカウントを持つ人なら誰でも weave ディレクトリのファイルを書き換えることができてしまうので、 同じサーバーに信用のおけないユーザーがいる場合には (たとえばレンタルサーバーを使うような場合には) セキュリティ的に非常に危険です。
悪意を持ったユーザーがいた場合、 Sync Key を盗むことはどうやってもできないものの、 index.php を書き換えてユーザー名とパスワードを盗むことは かなり容易に行えます。index.php に書き込み権限が無くても、 一旦消去して、再度生成すれば書き換えが可能であることに 注意してください。まぁ、それだと誰が書き換えたかは一目瞭然になって しまうので、いたずら半分でやられることは少なそうですが・・・
根本的な解決にはなりませんが、 weave/weave_db を weave/db/weave_db に移して、 weave/ ではなく weave/db/ のみに書き込み権限を与えるくらいは した方が良いかもしれません。
その場合には、weave_storage.php の
$db_name = 'weave_db';
の行を
$db_name = 'db/weave_db';
と変えることになります。
こうすることで、php ファイルを書き換えることができなくなり、 多少は安全だと思います。 少なくとも簡単にパスワードを抜かれる心配は無くなります。
もちろん wave_db は読み書きし放題なわけで、 セキュリティ的には大きな不満が残ります。 まあ、Sync Key が抜かれない限り最悪でもデータを失うだけなので、、、 その場合にはあきらめるしかないですね。
で、weave ディレクトリのパーミッションが適切に設定できたら、
http://localhost/~osamu/weave/index.php/1.0/osamu/info/collections
へアクセスして、スクリプトが正しく動くことを確認します。
LANG:console ~$ wget -q -O - \ --auth-no-challenge \ --http-user=osamu \ --http-password=**** \ http://localhost/~osamu/weave/index.php/1.0/osamu/info/collections []
/~osamu/weave の後ろに index.php/ を入れなければならないことに注意してください。 これが alias あるいは rewrite を使えないことの代償です。
もしサーバーの設定で rewrite が使えるようになっていれば .htaccess による設定で URL を適切に書き換えることで、アクセスする際の index.php を省略することもできるそうです。
http://rabenau.org/blog/posts/creating-your-own-firefox-sync-server/42
その場合には index.php 中の $path を求める部分で REQUEST_URI 環境変数から上手に切り出す必要があります。
ただ、上記ページの rewrite 設定はあまりうまくないようで、実際には
public_html/weave/.htaccess を
RewriteEngine On RewriteBase /~osamu/weave/ RewriteRule .* index.php
などとした上で、index.php に
LANG:php else if (!empty($_SERVER['REQUEST_URI'])) { $path = substr($_SERVER['REQUEST_URI'], 13); }
を追加することでうまく動作しました。
このマジックナンバー 13 は、'/~osamu/weave' の文字数です。
Firefox Sync の設定では、rewrite を使わない場合には、
http://localhost/~osamu/weave/index.php/ を、
rewrite を使う場合には、
http://localhost/~osamu/weave/ を、
指定します。
変わるのはここだけなので、個人的には苦労してまで rewrite する必要はないと思います。
https 接続にする†
どうせ内容が暗号化されているので http 接続でも良いという話もあるのですが、 念のため https で繋ぐにはどうするかを調べました。
Debian で apache2 に https 接続をさせるには、 apache2 の ssl というモジュールを有効にすれば良いみたいです。
apache2 のモジュールを有効にするには a2enmod を使います。
LANG:console /etc/apache2$ sudo a2enmod ssl Enabling module ssl. See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates. Run '/etc/init.d/apache2 restart' to activate new configuration! /etc/apache2$ gunzip -c /usr/share/doc/apache2.2-common/README.Debian.gz | less SSL === Enabling SSL ------------ To enable SSL, type (as user root): a2ensite default-ssl a2enmod ssl If you want to use self-signed certificates, you should install the ssl-cert package (see below). Otherwise, just adjust the SSLCertificateFile and SSLCertificateKeyFile directives in /etc/apache2/sites-available/default-ssl to point to your SSL certificate. Then restart apache: /etc/init.d/apache2 restart Creating self-signed certificates --------------------------------- If you install the ssl-cert package, a self-signed certificate will be automatically created using the hostname currently configured on your computer. You can recreate that certificate (e.g. after you have changed /etc/hosts or DNS to give the correct hostname) as user root with: make-ssl-cert generate-default-snakeoil --force-overwrite To create more certificates with different host names, you can use make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /path/to/cert-file.crt This will ask you for the hostname and place both SSL key and certificate in the file /path/to/cert-file.crt . Use this file with the SSLCertificateFile directive in the apache config (you don't need the SSLCertificateKeyFile in this case). SSL workaround for MSIE ----------------------- The SSL workaround for MS Internet Explorer needs to be added to your SSL VirtualHost section (it was previously in ssl.conf but caused keepalive to be disabled even for non-SSL connections): SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 The default SSL virtual host in /etc/apache2/sites-available/default-ssl already contains this workaround.
かなり親切にやり方が書いてあるので、この通り サイト設定 default-ssl を有効にして、apache を再起動したところ、 エラーが出ました。
どうやら、/etc/ssl/private/ssl-cert-snakeoil.key が無いようです。
LANG:console /etc/apache2$ sudo a2ensite default-ssl Enabling site default-ssl. Run '/etc/init.d/apache2 reload' to activate new configuration! /etc/apache2$ /etc/init.d/apache2 reload Syntax error on line 52 of /etc/apache2/sites-enabled/default-ssl: SSLCertificateKeyFile: file '/etc/ssl/private/ssl-cert-snakeoil.key' does not exist or is empty failed! /etc/apache2$ head -52 /etc/apache2/sites-enabled/default-ssl ... SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
上の README によれば、ssl-cert パッケージが入っていれば自動で作成される はずなのですが、なぜかできてません。
仕方がないので、README の言うとおりに手動で作成したところ、 ちゃんと apache2 が立ちあがりました。
LANG:console /etc/apache2$ sudo aptitude show ssl-cert パッケージ: ssl-cert 状態: インストール済み 自動的にインストールされた: yes バージョン: 1.0.23 優先度: 任意 セクション: utils メンテナ: Debian Apache Maintainers <debian-apache@lists.debian.org> 展開サイズ: 98.3k 依存: debconf (>= 0.5) | debconf-2.0, openssl (>= 0.9.8g-9), adduser, openssl-blacklist 説明: simple debconf wrapper for OpenSSL This package enables unattended installs of packages that need to create SSL certificates. It is a simple wrapper for OpenSSL's certificate request utility that feeds it with the correct user variables. /etc/apache2$ sudo make-ssl-cert generate-default-snakeoil /etc/apache2$ sudo ls /etc/ssl/private/ ssl-cert-snakeoil.key /etc/apache2$ sudo /etc/init.d/apache2 restart
あとは、default-ssl にも上記と同様の Alias 設定をして、 Firefox Sync の設定でサーバー名を http から https に書き換えれば、 サーバーとの間を安全に通信することができるようになります。