Database Password Everywhere!

wp-config.php
wp-config.php

世界中のウェブの 17% が Wordpress でできていると言われているように、 Wordpress は世界中で使われています。これは本当にすごいことです。私も先日まで Wordpress を使用していましたし、今でも仕事の1つは Wordpress を使用しています。サクッとインストールする際に重宝しています。得に管理画面もすごく洗練されていて、管理画面だけでも使いたいと思うようなインタフェースだと思っています。

そんな素晴らしい Wordpress ですが、実際の運用されている Wordpress にはちょっと問題となっていることもあるようです。それは、 wp-config.php の情報が見えてしまっているという報告があることです。1年半前のスライドですが、約 1% もの Wordpress のサイトで、 wp-config.php の中身が読まれてしまっているという調査がありました。おそらく今でもこの状態になっている人は多いのではないか、と思います。

wp-config.php の中にはご存知のようにデータベースの接続情報などが書かれていますね。例えば、以下のような内容です。

<?php
define('DB_NAME', 'mywordpress');
define('DB_USER', 'username_here');
define('DB_PASSWORD', 'password_here');
define('DB_HOST', 'localhost');
?>

何が問題なの?

Wordpress では、wp-config.php のあるディレクトリが DocumentRoot であることがほとんどだと思います。デフォルトがそうですしね。もちろん拡張子が php の場合には PHP が実行され、中身が見られてしまうことはないのですが、バックアップファイルの場合は違います。例えば、次のようなファイルです。

  • wp-config.php~ # Vim, Gedit
  • #wp-config.php# # Emacs
  • wp-config.php.save # Nano
  • wp-config.php.swp # Vim (swap file)
  • wp-config.php.swo # Vim (swap file)

サーバのファイルを直接いじることができる人は Vim や Emacs を使う人が多いと思います。これらのエディタを使うとバックアップファイルをそこに作成してしまうことがあるんですね。そして、これがウェブから見えてしまうことがあるのです。そして、先ほどのスライドにあったように、2011年11月ですが、これを調査してみたところ約1%(0.77%)のWordpressブログのwp-config.php の内容が見えてしまっていた、という調査になっています。

Wordpressでは、wp-config.php ですが、config.php(phpBB), configuration.php(Joomla) LocalSettings.php(MediaWiki), mt-config.cgi(MovableType), settings.php(Drupal) なども同様にバックアップファイルが作成されていた場合には、読まれてしまう可能性があります。

対応手段

設定ファイルはサーバで編集しない

設定ファイルはサーバでは編集せずに、rsyncで反映したり、ローカルで編集した後にscopy などで持っていくと良いでしょう。もちろん、デプロイツールがあったらなお良いですが、Wordpress では、あまり使っているという話は聞かないですね。

MySQLなどのサーバはローカルホストからしか接続できないようにする

Webサーバ兼DBサーバの際には、ほとんどローカルホストからの接続でしているケースがありますが、WebサーバとDBサーバを分けている際には、IP制限などをかけるべきです。もしかしてユーザ名とパスワードがバレてしまっても、とりあえずはローカルホストに入って来られない限り大丈夫なはずです。それでも、見せない方がいいですが。。。

htaccess 等でバックアップファイル等を制御する

チルダで終わるファイルや.bakや.oldなどの拡張子をアクセスできないようにしましょう。しかし、そもそも.bak や .old は使わない方がいいでしょう。15年前じゃないんだから。。。。しかし、それでもやっぱり設定ファイルはサーバで編集しない方がいいでしょう。

<Files ~ "(^#.*#|~|\.sw[op]|\.bak|\.old)$">
Order allow,deny
Deny from all
</Files>

DocumentRootにこれらのファイルを置かない

私は普段はSymfonyを使用しているのですが、Symfonyでは、DocumentRoot には設定ファイルは置きません。他のフレームワークもだいたい設定ファイルをDocumentRoot下には置くことはありません。DocumentRootには、ウェブフロントコントローラのみを置いて、そこからディスパッチすることが多いです。ここまで流行ってしまっているWordpressもフロントコントローラ方式になった方がいいと思います。

なお、この問題はずっと昔から指摘されているのですが、なかなか改善される兆しがありません。おそらく今でもwp-config.php~ などが読み取られてしまう可能性のあるブログもたくさんあるのでしょう。気をつけて運営したいですね。

comments powered by Disqus