非公開ディレクトリの変更

一部のサーバでは .htaccess が無効になっており、本来ネット上からアクセスできない __cache/ ディレクトリや data/ ディレクトリにネット上からアクセスできてしまうことがあります。その状態で運用するとセキュリティホールとなるため、ここではその対策を述べます。

もしwebサーバの設定が変更可能ならば、そちらで対応しても構いません。

非公開ディレクトリの場所を変更する

# http://example.com/<uid>/adiary/adiary.cgi
+ public_html
  + adiary
     + __chche/
     + data/
     + info/
     + js/
     + lib/
     + plugin/
     + pub/
     + pub-dist/
     + skel/
     + skel.local/
     + theme/
     - adiary.cgi
     - adiary.conf.cgi
     - (略)

このようなディレクトリ構成のとき、http://example.com/<uid>/adiary/data/index.html がアクセス可能であると、致命的なセキュリティホールとなります。

この場合、public_htmlの外に __cahce/, data/ ディレクトリを移動します。

+ public_html
  + adiary
     + __chche/
     - (略)
+ __cache/
+ data/

移動後に、元の場所(public_html/adiary/)に __cache/ ディレクトリを再度作成し、Apacheから書き込めるようパーミッションを設定してください。

adiary.conf.cgi を開き、次の設定を変更します*1。公開ディレクトリと異なり、絶対パスで指定しても構いません。

# 非公開のデータディレクトリ
<$constant(data_dir) = '../../data/'>

adiary.env.cgi を adiary.env.cgi.sample から作り次を設定します。

# キャッシュディレクトリの変更
<$__cache_dir = get_filepath('../../__cache/')>

この状態で動作を確認します。

問題なく動作したら、public_html/adiary/__cache/ ディレクトリを消さずに中にあるファイルをすべて削除してください。ディレクトリを消してはいけません。このディレクトリは書き込み可能なまま残してください。

補足

一連の作業は shell上ならば次のように行います。chmodは必要な環境でのみ実行してください。

$ cd public_html/adiary/
$ chmod 777 __cache/ data/
$ mv __cache/ data/ ../../
$ mkdir __cahce/
$ chmod 777 __cahce/
$ vi adiary.conf.cgi
$ cp adiary.env.cgi.sample adiary.conf.cgi
$ vi adiary.env.cgi
(ここで動作確認)
$ cd __cache/
$ rm -f *

*1 : info/やskel/ディレクトリ等も移動しても構いませんが、アップデート作業がとても面倒になります。

解説

dataディレクトリにはユーザー情報などあらゆるデータが入るので秘匿する必要性は分かるかと思います。

__cache/ には、スケルトンをコンパイルしたキャッシュが入ります。この中には、adiary.conf.cgiのコンパイル結果が含まれます。外部DB接続を行っていた場合、IPや接続パスワードが漏れることになりますので、__cache/ ディレクトリは公開すべきではありません。

__cache/ ディレクトリは環境変数で簡単に変更することができますが、そもそも .htaccess が無効な環境では、環境変数が任意に設定可能だとは思えません。

adiary.env.cgiは、adiary(Satsuki-system)が環境を初期化する前に解析・実行するスケルトンファイルです。.conf.cgiよりも前に処理されるため、このファイルでキャッシュディレクトリを変更することでadiary.env.cgi以外のキャッシュファイルを外部に置くことが可能になります。

しかし、adiary.env.cgi実行時点ではキャッシュディレクトリは変更されていませんので、このファイルのキャッシュ置き場として、元々の __cache/ ディレクトリは残す必要があります。