mt.cfg は見えないように対策したが,何と mt.cfg 以外の管理用ファイルがすべて丸見えだった。アクセス制限について見直すことにした。
サイトの公開を始めてから,もう直ぐで1年。mt.cfg は見えないように対策したが,mt.cfg 以外が丸見えだった。まさに,「頭隠して尻隠さず」状態。「頭」の mt.cfg しか隠していなかったので,尻どころか体全部が丸裸だったことになる。余りに恥ずかしくて,しばらく口が利けなかった。アクセス制限について見直すことにした。
nlog(n): mt.cfg とデータベースを守る で行った設定は,.htaccess ファイルに次の内容を書いて,mt.cfg や mt.cgi のある管理用ディレクトリに置くものだった。
<Files *>
<Limit GET>
deny from all
</Limit>
</Files>
この設定は,本家 Movabletype.org の Installation Instructions に記載されており,日本語マニュアル にもそのまま翻訳されているものである。
一体どうなんでしょう さんからトラックバック を頂き,これでは安全でないことが分かった。感謝。
上記の設定は,Apache 1.3.27 では問題ないが,Apache 2.x では POST メソッドでアクセスできてしまうらしい。GET メソッドだけのアクセスを制限しているからである。<Limit> の危険 には,この危険性について紹介されている。さらに,Apache 1.3, 2.x ともに「不明なメソッド xxx」でもアクセスできてしまうというのだ。メソッドとして,本当に「xxx」と書いてアクセスしてみた。このサイトでは,Movable Type 管理スクリプトを opentype というディレクトリに置いている。
「501 Method Not Implemented」が返ってきたので,ひとまずは安心。しかし,Apache 2.x ではマズイというのだから,ここでも修正しておいた方がよい。問題は GET メソッドだけのアクセス制限であることなので,<Limit> を外し,全てのメソッドを対象にしてアクセス制限をするのが安全である。
しかし,このサイトの問題点はこれだけではなかった。管理スクリプト用のディレクトリ以下が丸見えだったのである。この問題の一つは,Options ディレクティブに Indexes を指定してあったことである。このため,index.html がないディレクトリはファイルの一覧が取得できてしまったのである。そこで,まず Options ディレクティブから Indexes を削除した。しかし,これだけでは弱い。Movable Type の管理用ディレクトリは,ディレクトリ構造が決まっているため,ファイルをピンポイントで指定するとアクセスできてしまうのである。そこで,管理用ディレクトリの .htaccess には次のように書くことにした。
まず,すべてのファイルにアクセスできないようにし,拡張子が cgi, css, gif のファイルだけを許可している。mt.cfg は,拡張子が cfg なのでアクセスできないようになっている。この指定はサブディレクトリにも適用される。管理用ディレクトリ以下にはマニュアルの HTML ドキュメントもあるので,もし使いたいのであれば,これに html を追加すればよい。プラグインディレクトリには,拡張子が pl のファイルがあるが,スクリプトから使用するだけなので追加する必要はない。Files ディレクティブでも同様の指定ができるが,Apache 1.3 以降であれば,FilesMatch の使用が推奨されている(Apache Core Features)。
これで大丈夫だろう。しかし,なーんか不安。以下は覚え書
Order ディレクティブは,Allow と Deny が評価される順番を指定する。通常,一部のホストからのアクセスを拒否したい場合は,「Order Allow,Deny」の順序で指定する。foo.org ドメインだけからのアクセスを拒否するのであれば,次のように指定する。
逆に,一部のホストだけからのアクセスを許可するのであれば,Order の順序を逆にして,次のように指定する。
Apache module mod_access には,Allow や Deny ディレクティブがなくても,Order だけでも意味があると説明されている。
だけを書いた場合,デフォルトは deny の状態になり,すべてのアクセスを拒否することになる。
さて,管理ディレクトリのファイルの拡張子はすべて小文字だが,一般的には大文字小文字が混じっている。しかし,大文字小文字のすべての組み合わせを書くのは大変。「cGi」なども含めるとすると,3文字の拡張子なら8通り書かなければならない。Apache 2.0 の解説では,Perl の正規表現で使える修飾子「?i:」を使って上手く記述する方法が示されている。上の例に適用すれば,次のように書けることになる。
しかし,VineLinux 2.6 の Apache 1.3.27 でこれを試してみたところ,小文字の cgi もアクセス拒否(Forbidden)になってしまった。次のように書けば,大文字小文字を区別しないようにできることが分かった。少々面倒だが,仕方ない。
蛇足1: allow は「アラウ」,deny は「デナイ」と発音する。
蛇足2: index の複数形は indices だが,最近は indexes も正しいものとして使われている。
Master Archive Index
Total Entry Count: 1957