2016/02/21

calibre-serverの認証をapacheのBasic認証で行う

calibreをサーバに導入してみた。
calibreとは(wikipedia参照)である。

calibre-server自身にも起動時の --username オプションと --password オプションによるBasic認証は有しているのですが、私のDebian 8.3(jessie)環境なぜか 正しいユーザ名とパスワードを入力すると HTTP error 500 (Internal Server Error)になってしまいました。間違ったパスワードを入力するとしっかり弾かれるので、全く機能していないわけではなさそうです。
私の秘密のライブラリをセキュリティなしに世界に向けて発信するわけにもいかないので、apacheと組み合わせてなんとかパスワードをかけた顛末です。

やったこと
  • https://MyServer/配下のコンテンツはapacheによりBasic認証を必要とさせる
  • apacheが https://MyServer/calibre/ に来たアクセスを http://localhost:8765/に転送し、クライアントとcalibre-server間のproxyになる
  • calibre-serverをport=8765で起動する
  • http://MyServer:8765/で直接外部からアクセスできないようにする

apacheのBasic認証

あちらこちらのblogやVPS構築指南に書かれている通り。ここではとりあえす省略。
.htaccess と .htpasswd を使った標準的なものです。


apacheのReverse Proxy設定

apacheのReverse Proxyモジュールを有効にする。
# a2enmod proxy
# a2enmod proxy_http
# a2enmod rewrite
# ls -l /etc/apache2/mods-enabled/ | grep proxy
lrwxrwxrwx 1 root root 28 Feb 13 19:58 proxy.conf -> ../mods-available/proxy.conf
 lrwxrwxrwx 1 root root 33 Feb 13 19:58 proxy_http.load -> ../mods-available/proxy_http.load
 lrwxrwxrwx 1 root root 28 Feb 13 19:58 proxy.load -> ../mods-available/proxy.load


virtual hostの設定ファイルに以下を追加。
<Location /calibre>
    AuthUserFile    /var/www/.htpasswd
    AuthName        "Enter Password"
    AuthType        Basic
    Require         user USERNAME
</Location>

RewriteEngine on
RewriteRule ^/calibre/(.*) http://localhost:8765/calibre/$1 [proxy]
RewriteRule ^/calibre http://localhost:8765 [proxy]
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1

apacheを再起動して設定を反映。
# /etc/init.d/apache2 restart

Proxyを使用する場合は Directory ディレクティブではなく、Location ディレクティブ を使用する必要があります。
また、指定した "/calibre" は calibre-serverの --url-prefixオプションと同じにしておかなければいけません。

calibre-server起動

実際にはスクリプトを書いてstop/start/restartさせていますが、startの部分だけを抜き出すとこんな感じになります。(複数行に見えても実際は1行で入力します)
/usr/bin/calibre-server --url-prefix /calibre --port=8765 --with-library=/home/user/calibre/calibre_library/ --daemonize

直接アクセスの禁止

apache(ssl)は443番ポート、calibre-serverは8765番ポートでそれぞれ待ち受けているので、http://MyServer:8765/ で直接アクセスされてしまうと認証なしにcalibre-serverに接続できてしまいます。
それを抑止するために、iptablesにて 外部からの8765番ポートへの接続は抑止し、8765番ポートは自分自身(localhost)からのアクセスだけを許可するようにします。

# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 8765 -j DROP
# iptables-save
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
         ACCEPT     all  --  anywhere             anywhere
            DROP       tcp  --  anywhere             anywhere             tcp dpt:8765
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
今回はサーバ自身でアクセス制御を行いましたが、ファイアウォールなどの(Amazon EC2であればセキュリティグループのような)NW機器があればそれを利用して不要な通信をブロックしても良いでしょう。

以上、calibre-server の認証を apacheの認証で行う、でした。
Have Fun!

参考にさせていただいたwebサイト
calibre package in Ubuntu: Calibre content server crashes
calibre本家: Integrating the calibre content server into other servers
リバースプロキシとBasic認証の併用時の注意点
さくらインターネット: iptablesの設定方法


赤星大好き


2016/02/14

ownCloudサーバ側で直接変更したファイルを反映させる

ownCloudサーバを運用していて、サーバ側で直接保存したり変更したファイルがクライアントに反映されないなーと思っていたら、Japan ownCloud Users Groupで同じような質問をされた方とその回答があり、非常に参考になりました。

質問:サーバ上で直接行ったファイル編集がクライアントに反映されない?

occ(cwnCloudConsole) ! そうか、そういうのもあるのか!

早速試してみたところ、
root@server:/# sudo -u www-data php /var/www/owncloud/occ
PHP is configured to populate raw post data. Since PHP 5.6 this will lead to PHP throwing notices for perfectly valid code.
To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini
あれ?

よくわかりませんが、php.ini を修正セヨ とのことなので、
/etc/php5/cli/php.ini の ";always_populate_raw_post_data = -1" のコメントアウトを外して有効にしてもう一度 occ を実行したらうまく動きました。

さらに、cronで20分おきに再スキャンするように設定しました。
*/20 * * * * sudo -u www-data /data/www/htdocs/owncloud/occ file:scan --all --quiet > /dev/null 2>&1

ちなみに、これまではクライアントのMac側で共有するすべてのディレクトリにダミーのファイルを touchするスクリプトを組んで、cronで定期的に実行してクライアント側から半ば強制的に同期をさせていました。スマートではなかったですね。