印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
LinuxMovableType mt.cfg 「以外」が丸見え

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 というディレクトリに置いている。

$ telnet nlogn.ath.cx 80
Trying 192.168.0.199...
Connected to nlogn.ath.cx.
Escape character is '^]'.
xxx /opentype/mt.cfg HTTP/1.0

HTTP/1.1 501 Method Not Implemented
Date: Sat, 22 Jan 2005 11:07:32 GMT
Server: Apache/1.3.27 (Unix)  (Vine/Linux) mod_ssl/2.8.14 OpenSSL/0.9.6m PHP/4.2.3 mod_perl/1.26
Allow: GET, HEAD, OPTIONS, TRACE
Connection: close
Content-Type: text/html; charset=iso-8859-1
...

「501 Method Not Implemented」が返ってきたので,ひとまずは安心。しかし,Apache 2.x ではマズイというのだから,ここでも修正しておいた方がよい。問題は GET メソッドだけのアクセス制限であることなので,<Limit> を外し,全てのメソッドを対象にしてアクセス制限をするのが安全である。

しかし,このサイトの問題点はこれだけではなかった。管理スクリプト用のディレクトリ以下が丸見えだったのである。この問題の一つは,Options ディレクティブに Indexes を指定してあったことである。このため,index.html がないディレクトリはファイルの一覧が取得できてしまったのである。そこで,まず Options ディレクティブから Indexes を削除した。しかし,これだけでは弱い。Movable Type の管理用ディレクトリは,ディレクトリ構造が決まっているため,ファイルをピンポイントで指定するとアクセスできてしまうのである。そこで,管理用ディレクトリの .htaccess には次のように書くことにした。

<Files *>
  Order Allow,Deny
  Deny from all
</Files>
<FilesMatch \.(cgi|css|gif)$>
  Order Allow,Deny
  Allow from all
</FilesMatch>

まず,すべてのファイルにアクセスできないようにし,拡張子が 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 Allow,Deny
Allow from all
Deny foo.org

逆に,一部のホストだけからのアクセスを許可するのであれば,Order の順序を逆にして,次のように指定する。

Order Deny,Allow
Deny from all
Allow nlogn.ath.cx

Apache module mod_access には,Allow や Deny ディレクティブがなくても,Order だけでも意味があると説明されている。

Order Allow,Deny

だけを書いた場合,デフォルトは deny の状態になり,すべてのアクセスを拒否することになる。

さて,管理ディレクトリのファイルの拡張子はすべて小文字だが,一般的には大文字小文字が混じっている。しかし,大文字小文字のすべての組み合わせを書くのは大変。「cGi」なども含めるとすると,3文字の拡張子なら8通り書かなければならない。Apache 2.0 の解説では,Perl の正規表現で使える修飾子「?i:」を使って上手く記述する方法が示されている。上の例に適用すれば,次のように書けることになる。

<FilesMatch \.(?i:cgi|css|gif)$>
  Order Allow,Deny
  Allow from all
</FilesMatch>

しかし,VineLinux 2.6 の Apache 1.3.27 でこれを試してみたところ,小文字の cgi もアクセス拒否(Forbidden)になってしまった。次のように書けば,大文字小文字を区別しないようにできることが分かった。少々面倒だが,仕方ない。

<FilesMatch \.((c|C)(g|G)(i|)|(c|C)(s|S)(s|S)|(g|G)(i|I)(f|F))$>
  Order Allow,Deny
  Allow from all
</FilesMatch>

蛇足1: allow は「アラウ」,deny は「デナイ」と発音する。
蛇足2: index の複数形は indices だが,最近は indexes も正しいものとして使われている。

Posted by n at 2005-01-22 23:59 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?