(ヽ'ω`) < 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_FILE
とDB_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を使う時は危険が危ないということですな。
(ヽ'ω`) < 毒にも薬にもならないメモでした