(ヽ´ω`) < 助けてほしいマン

わからないことを助けてほしいマンが書くブログ

(ヽ'ω`) < Wordpressを共有サーバでSQLiteを使って動かそうとして断念

(ヽ´ω`) < まず最初に

これは失敗の記録です。ノウハウ的な文章では無いので、読み進めていって

(ヽ´ω`) < 舐めとんのか

ってなる可能性がありますので、あらかじめご承知おきください。

(ヽ´ω`) < MySQLがないんよ…

Wordpressの動作環境としてPHP+MySQLが必要となるのだが、MySQLが無いサーバ、もっと言うとroot権限がないサーバで運用したいというケースは、あまり想定されていないように思う。

月500円からroot権限付きのVPSサーバが借りられる時代に、そんな事まで考慮しないといけないのか?という意見もあるだろうが、大学や企業のイントラ系ではそういったケースも無いこともない…と思うんですが、どうでしょうかね(ヽ´ω`)

(ヽ´ω`) < SQLiteで運用するんよ

WordPress › SQLite Integration « WordPress Plugins

そんな貴方にSQLite。単一ファイルなので、自分のディレクトリ内で完結するので、システムへの変更が不要。

(ヽ´ω`) < ただしパフォーマンスはお察し

(ヽ´ω`) < 手順   とみせかけて

古いバージョンの時はwp-config.phpの中身をいじらないといけなかったけど、今はなんかファイルをコピーするだけでOKっぽい。

で、そうなってくるとわざわざこんな風にメモを残さなくても、公式のドキュメントだけでいいよねと。

WordPress › SQLite Integration « WordPress Plugins

なので、インストール手順は省略。問題の部分にフォーカスを当てる。

(ヽ´ω`) < パーミッションが問題

セットアップが開始されると、wp-content/ディレクトリにdatabaseというディレクトリが作成される。このディレクトリはApacheプロセスが作成するので、オーナーはそのプロセスのユーザーとなる。(httpd.conf内のUserとGroupで指定。CentOSの場合apache)

当然、wp-content/ディレクトリのパーミッションによっては、作成できずにエラーになる場合がある。というか実際に、何も考えずにそのまま手順を進めていったら、初期設定の画面を表示する際に、

Unable to create the required directory! Please check your server settings.

と表示された。

(ヽ´ω`) < さてどうする

単純に、最初の設定の間だけ

# chmod 777 wp-content

としてやる。

初期設定が終わって、ログイン画面が表示されたら

# chmod 755 wp-content

で元に戻す。これでOK。

(ヽ´ω`) < ここで終わっちゃだめよ

上記の作業で、デフォルトではwp-content/databaseが作成される。

[test@ec96def439b7 wp-content]$ ls -l
total 24
drwx---rwx 2 apache apache 4096 Oct  2 06:55 database
-rw-r--r-- 1 test   test   3876 Oct  2 06:43 db.php
-rw-r--r-- 1 test   test     28 Jan  8  2012 index.php
drwxr-xr-x 4 test   test   4096 Sep  5 02:06 languages
drwxr-xr-x 5 test   test   4096 Oct  2 06:43 plugins
drwxr-xr-x 5 test   test   4096 Sep  5 02:06 themes

ここでSQLiteを使う理由をもう一度振り返ってみると、「root権限が無い、MySQLが入れられないサーバ」ということだったが、root権限がないということは、自分以外のユーザが存在する共有サーバの可能性が非常に高い。

database/パーミッション777なので、どのユーザからでも、自由に書き込みが可能となっている。
上位ディレクトリのパーミッションで段階的なアクセス(シェルからcdコマンドで辿っていく)ことは不可能であっても、直接指定でディレクトリの移動やファイルの操作は可能であり、セキュリティ的にかなりよろしくない。

例えばmod_userdirで運用している場合、http://hoge.com/~testuser/wordpress/のアドレスが与えられれば、同じサーバのユーザならば容易に/home/testuser/public_html/wordpress/wp-content/databse/であることが推測できる。(/home/testuser/public_htmlはサーバ全体でほぼ共通の設定なはず)

# (ヽ´ω`) < オーナーなら普通に辿れる
[root@ec96def439b7 /]# su - test
[test@ec96def439b7 ~]$ ls
public_html
[test@ec96def439b7 ~]$ cd public_html/
[test@ec96def439b7 public_html]$ cd wordpress/
[test@ec96def439b7 wordpress]$ cd wp-content/
[test@ec96def439b7 wp-content]$ cd database/
[test@ec96def439b7 database]$ ls -la
total 116
drwx---rwx 2 apache apache  4096 Oct  2 06:55 .
drwxr-xr-x 6 test   test    4096 Oct  2 06:54 ..
-rw-rw-rw- 1 apache apache    13 Oct  2 06:54 .htaccess
-rw-r--r-- 1 apache apache 96256 Oct  2 06:55 .ht.sqlite
-rw-rw-rw- 1 apache apache    28 Oct  2 06:54 index.php


# (ヽ´ω`) < 別ユーザは辿れない
[root@ec96def439b7 /]# su - test2
[test2@ec96def439b7 ~]$ cd /home/test
[test2@ec96def439b7 test]$ ls
ls: cannot open directory .: Permission denied

# (ヽ´ω`) < けど、public_htmlは簡単に推測できる
[test2@ec96def439b7 test]$ cd public_html
[test2@ec96def439b7 public_html]$ ls
index.html  wordpress
[test2@ec96def439b7 public_html]$ cd wordpress/
[test2@ec96def439b7 wordpress]$ ls
index.php    readme-ja.html   wp-blog-header.php    wp-config-sample.php  wp-includes        wp-login.php     wp-signup.php
license.txt  wp-activate.php  wp-comments-post.php  wp-content            wp-links-opml.php  wp-mail.php      wp-trackback.php
readme.html  wp-admin         wp-config.php         wp-cron.php           wp-load.php        wp-settings.php  xmlrpc.php

wordpress/o-xしても最後のdatabase/が777である以上は、直接アクセスが可能。

(ヽ´ω`) < それじゃどうする?

database/を公開ディレクトリに置くのを止めて、名前も変えてしまう。そしてそのための設定が、公式ドキュメントのOptional settingsに記載されている。

初期設定を行う前に、wp-cofnig.php内に

# 以下の2つを定義する
# define('DB_FILE', 'your_database_name');
# define('DB_DIR', '/home/youraccount/database_directory/');
define('DB_FILE', '.my_blog_db.sqlite');
define('DB_DIR', '/home/test/blog_db_dir');

のようにDB_FILEDB_DIRを追記する(DB_DIRだけでもいいかもしれないが、2つとも変更しておくと好ましい)。

blog_db_dir/ディレクトリが作成されるのが、/home/testなので、先程はwp-content/を777にしたが、今度はここを一時的に777にする。

# chmod 777 /home/test

これで初期設定を行うと

[test@794ad4c0b47d ~]$ pwd
/home/test
[test@794ad4c0b47d ~]$ ls -l
total 8
drwx---rwx 2 apache apache 4096 Oct  2 08:09 blog_db_dir
drwxrwxr-x 3 test   test   4096 Oct  2 08:06 public_html
[test@794ad4c0b47d ~]$ cd blog_db_dir/
[test@794ad4c0b47d blog_db_dir]$ ls -la
total 116
drwx---rwx 2 apache apache  4096 Oct  2 08:09 .
drwx-----x 4 test   test    4096 Oct  2 08:11 ..
-rw-rw-rw- 1 apache apache    13 Oct  2 08:06 .htaccess
-rw-rw-rw- 1 apache apache    28 Oct  2 08:06 index.php
-rw-r--r-- 1 apache apache 97280 Oct  2 08:09 .my_blog_db.sqlite # <= DB_FILEで指定した名前でDBファイルが作成

となる。

これでOKかというと、もちろんダメで、wp-config.phpが見えたら意味無いですよね。とはいえ、Apacheプロセスがwp-config.phpにアクセス出来ないとWordpressが動かない。

(ヽ´ω`) < 落ち着いて聞いて欲しい…

と、ここまで「root権限がないサーバ」という前提で解説をしてきたのだが、もうこればっかりはどうしようもない。サーバの管理者に頼んでwp-config.phpのグループをapacheにしてもらうしか、他ユーザから読み取りを防ぐ方法はない。

作業としては

[root@794ad4c0b47d /]# cd /home/test/public_html/wordpress
[root@794ad4c0b47d wordpress]# chown :apache wp-config.php # <= グループをapacheに変更
[root@794ad4c0b47d wordpress]# ls -l wp-config.php
-rw-r--r-- 1 test apache 3825 Oct  2 08:05 wp-config.php

としてもらってから、wp-config.phpからo-rする

[test@794ad4c0b47d wordpress]$ ls -l wp-config.php
-rw-r--r-- 1 test apache 3825 Oct  2 08:05 wp-config.php
[test@794ad4c0b47d wordpress]$ chmod o-r wp-config.php
[test@794ad4c0b47d wordpress]$ ls -l wp-config.php
-rw-r----- 1 test apache 3825 Oct  2 08:05 wp-config.php

おめでとう!これでwp-config.phpは他のユーザから守られ、あなたはピカピカのWordpressを手に入れることができた!

(ヽ´ω`) < ………

とまぁ、翻訳書みたいな表現をしてみたが、察しの良い方なら既に違和感を感じられているはず。

その通り、他のユーザがPHPなりCGIで別ユーザのファイルを読み込むスクリプトを組んだらどうなるの?

(ヽ´ω`) < バッチリ読まれます

よくよく考えてみると、共有サーバで任意のファイルを読み込んで表示をするようなCGI(Apacheプロセスから任意のファイルを読み込んで表示する)が設置されると、少なくともApacheプロセスから読み込み可能にしなければならないwp-config.phpは読まれてしまう運命にあるわけで。そうなるとMySQLであっても、ユーザ名とパスワードはバッチリ見えてしまう。

対策としてはsuPHPぐらいしか思いつかないけど、それもユーザ側が自由にできる領域ではないので、基本的には共有サーバでWordpressを使う時は危険が危ないということですな。

(ヽ'ω`) < 毒にも薬にもならないメモでした