Webサイトのお助け隊

インストール後にWordPressのデータベースのテーブル接頭辞を変更するプラグインと手順

2 views
約15分

WordPressのテーブル接頭辞、wp_のままにしてるサイト、意外と多いんですよね。まあ、インストール時に何も考えずに「次へ」を連打してると、そうなっちゃいますわな。俺も若い頃はそうでした。クライアントのちょっとしたメディアサイトで、公開3日後に管理画面が改ざんされて、トップページに意味不明な外国語の羅列が表示されたことがあります。原因は、推測されやすいパスワードと、当時見つかったばかりのプラグインの脆弱性、そしてwp_決め打ちのSQLインジェクションのコンボでした。冷や汗かきながら徹夜で復旧したあの夜のことは、30年経った今でも忘れられません。

この「お決まり」の名前、実はセキュリティ的には、そんな風にちょっとした「隙」になるって話、聞いたことあります?今回は、このテーブル接頭辞の変更っていう、地味だけど意外と奥が深いテーマについて、俺の30年のPHP経験と、あの夜の苦い思い出を交えながら、賛否両論ぶっちゃけながら話していこうと思います。

はじめに:その「wp_」、まだ使ってます?

WordPressをインストールすると、データベースの中にwp_postsとかwp_usersみたいなテーブルがずらっと作られますよね。このwp_っていうのが「テーブル接頭辞(プレフィックス)」です。いわば、WordPress用のテーブルだよっていう目印みたいなもんですね。

デフォルトでこれなんだから、別にそのままでいいじゃんって思うじゃないですか。実際、ほとんどのサイトはそのままです。でも、セキュリティの世界には「知られてる設定は狙われやすい」っていう鉄則があるんです。攻撃者は、常に最小の労力で最大の結果を得ようとします。その一番楽な方法が、業界標準(デファクトスタンダード)の設定を決め打ちで狙うことなんです。その一つが、このwp_をターゲットにした「SQLインジェクション」っていう攻撃なんですね。

この記事では、このテーブル接頭辞を変更することが、本当にセキュリティ対策として意味があるのか?っていう、ちょっと突っ込んだ話をします。巷じゃ「変えるべきだ!」って意見と、「いや、意味ないよ」っていう意見、両方あるんですよね。どっちが正しいのか。俺なりの結論と、じゃあどうすりゃいいのか、具体的な手順から万が一のトラブルシューティングまで、ガッツリ解説していきます。

なんで接頭辞を変えるの?そのメリットと…限界

まず、なんで「接頭辞を変えましょう」って言われるのか。一番の理由は、自動化されたボットによる攻撃を防ぎやすくなるからです。

攻撃の99%は「数打ちゃ当たる」の自動ボット

世の中のハッキングの多くは、映画に出てくるような天才ハッカーが、あなたのサイトを狙い撃ちして手作業でやってるわけじゃありません。実態は、プログラム(ボット)がインターネット中のサイトを片っ端から巡回して、機械的に脆弱性を探してるんです。これらのボットは、世界中の何十万、何百万というWordPressサイトに対して、同じ攻撃コードをひたすら送りつけます。

その攻撃コードは、当然、一番効率がいいように作られています。つまり、「WordPressならユーザー情報はwp_usersテーブルに入ってるだろ」「投稿データはwp_postsにあるはずだ」という決め打ちで、SQL文を組み立ててインジェクション(注入)を試みるわけです。

ここで接頭辞をwp_からa7z3_みたいな、誰も知らない文字列に変えておくと、この手の単純な攻撃は「そんなテーブルありませんよ」というデータベースエラーになって、空振りに終わります。言ってみれば、全国の「鈴木さん」宛に詐欺の電話をかけまくってるグループに対して、表札を「田中」に変えておくようなもんですね。少なくとも、最初の電話はかかってこなくなります。

メリットデメリット・限界
単純なSQLインジェクション攻撃に強い腕の立つ攻撃者には通用しない
ボットによる攻撃を大部分防げるサイトが壊れるリスクがある
セキュリティ意識のアピールになるプラグインによっては不具合が出る可能性
ゼロデイ攻撃の被害を遅らせる可能性根本的な脆弱性解決にはならない

あるECサイトの悲劇:他人事じゃない実例

昔、俺がコンサルで入った、ある小さなアパレル系のECサイトの話です。そこはWordPressにECプラグインを入れて運営してたんですが、ある日突然、顧客から「ログインできない」「買った覚えのない商品の注文履歴がある」という問い合わせが殺到しました。

調査してみると、原因はECプラグインに未公開の脆弱性(ゼロデイ攻撃)があり、そこを突かれてデータベースに不正アクセスされたことでした。攻撃者は、その脆弱性を利用してSQLインジェクションを実行し、wp_usersテーブルから顧客のログイン情報(ハッシュ化されたパスワード含む)を抜き取り、さらにwp_usermetaテーブルに保存されていた顧客の住所や電話番号もごっそり盗んでいったんです。

もし、このサイトがテーブル接頭辞をwp_から変更していたら?攻撃者は、脆弱性を見つけた後、もう一手間かけないとテーブル名にたどり着けませんでした。そのわずかな時間稼ぎが、プラグイン開発元が修正パッチを出すまでの命綱になったかもしれないんです。この一件があってから、俺は「気休めでもいいから、やれることは全部やる」という考えになりました。

でも、これって「気休め」なの?Wordfenceの辛口な意見

ここで、WordPressセキュリティのトップ企業であるWordfenceが、面白いことを言ってるんで紹介します。彼らは「テーブル接頭辞の変更は、セキュリティを全く向上させない『セキュリティシアター(見せかけの対策)』だ」と断言してるんです[1]。

なんでかっていうと、ちょっと腕の立つ攻撃者なら、SQLインジェジェクションの脆弱性を見つけた時点で、簡単なクエリを一つ投げるだけで、テーブル接頭辞が何かなんて一瞬で分かっちゃうから。具体的には、こんなSQL文です。

SELECT DISTINCT SUBSTRING(TABLE_NAME, 1, LENGTH(TABLE_NAME) - 8) 
FROM information_schema.TABLES 
WHERE TABLE_NAME LIKE '%postmeta';

これ、データベースに「postmetaで終わるテーブルを探して、その名前の接頭辞部分だけ教えて」って聞いてるだけなんです。information_schemaっていうのは、データベース自身の設計図(テーブル名やカラム名の一覧)が格納されている特別な場所で、攻撃者はまずここを覗きにくるんです。これでhogehoge_みたいなカスタム接頭辞も一発でバレちゃう。攻撃者にとっては、懐中電灯で部屋を照らすくらいの簡単な作業なんですよ。

だからWordfenceは、「そんなリスクのある作業するくらいなら、WAF(Web Application Firewall)をちゃんと入れろ」って言ってるわけです。正論です。俺もそう思います。WAFは、不正なSQLインジェクションのパターンそのものを検知してブロックしてくれる、言わば屈強なガードマンです。表札を変えるより、ガードマンを雇う方が確実なのは当然ですよね。

じゃあ、やる意味ないの?俺なりの答え

じゃあ、接頭辞の変更は全くの無駄なのか?っていうと、俺は「やらないよりは、やった方がマシ」だと考えてます。

確かに、プロの攻撃者には通用しないでしょう。でも、インターネット上の攻撃の99%は、さっき言ったみたいなレベルの低い自動ボットによるものです。その「その他大勢」の攻撃を防げるだけでも、十分に価値はある。セキュリティは「多層防御」が基本です。玄関の鍵を二重にする、窓に補助錠をつける、防犯カメラを設置する…みたいに。一つ一つは完璧じゃなくても、組み合わせることで全体の強度が上がり、泥棒に「この家は面倒くさそうだ」と思わせることが重要なんです。テーブル接頭辞の変更は、その積み重ねの、一番下に置くブロックの一つとして、俺は十分に価値があると思っています。

それに、接頭辞を変更する作業を通じて、自分のサイトのデータベース構造を意識する良い機会にもなります。「ああ、ユーザー情報ってここに入ってるんだな」とか、「プラグインがこんなテーブルを作ってるのか」とか。そういう理解が、いざという時のトラブルシューティングに役立つんです。だから俺は、「リスクをちゃんと理解した上で、簡単な方法でできるならやっておこう」っていうスタンスです。

一番ラクで安全な方法:プラグインで変更する

じゃあ、どうやって変更するのか。昔はwp-config.phpを書き換えて、phpMyAdminで一個一個テーブル名を手で変更して…って、めちゃくちゃ面倒でミスりやすい作業でした。俺もそれで何度かサイトを飛ばしかけたことがあります(笑)。

でも今は、便利なプラグインがあります。これを使えば、ボタン一つで安全に変更できる。俺がおすすめするのは「Brozzme DB Prefix & Tools Addons」です。他にも似たようなプラグインはありますが、これが一番シンプルで実績もある。

ステップ1:何よりもまずバックアップ!

これはもう、口を酸っぱくして言います。作業前には、必ずサイト全体のバックアップを取ってください! ファイルとデータベース、両方です。データベースを直接いじる作業なんで、万が一、本当に万が一何かあった時に、バックアップがないとマジで泣きます。サーバーの自動バックアップ機能でもいいし、UpdraftPlusみたいなバックアッププラグインを使ってもいい。とにかく、「1時間前の状態に完全に戻せる」という自信を持ってから進みましょう。これを怠ったせいで、週末を徹夜で棒に振った同僚を何人も見てきました。

ステップ2:プラグインのインストールと有効化

  1. WordPressの管理画面で「プラグイン」→「新規追加」に進みます。
  2. 検索窓に「Brozzme DB Prefix & Tools Addons」と入力して検索。
  3. 出てきたプラグインを「今すぐインストール」して、「有効化」します。

ステップ3:新しい接頭辞を決めて、実行!

  1. 有効化すると、管理画面の「ツール」の中に「DB Prefix」っていうメニューが追加されます。
  2. それを開くと、すごくシンプルな画面が出てきます。
  • Current Prefix: 今の接頭辞(たぶん wp_)が表示されてます。
  • New Prefix: ここに、新しく使いたい接頭辞を入力します。
  1. 新しい接頭辞は、推測されにくいものがいいですね。例えば「wp_」を逆さにした「_pw」とか、サイト名の頭文字(例: mysite_)とか、そういうのは避けましょう。ランダムな英数字の組み合わせが理想です。例えば a7z3_ みたいに、最後にアンダースコア_を忘れずに。長さは5〜10文字もあれば十分です。
  2. 新しい接頭辞を入力したら、「Change DB Prefix」ボタンをポチッと押すだけ。

プラグインが裏側で、以下の作業を全部自動でやってくれます。

  • 全テーブル名の接頭辞を変更
  • wp-config.php$table_prefixの値を書き換え
  • optionsテーブルやusermetaテーブルの中にある古い接頭辞の参照を、新しいものに更新

昔はこれを全部手でやってたんだから、いい時代になったもんです。

ステップ4:サイトの動作確認と後片付け

「Prefix has been successfully changed!」みたいなメッセージが出たら成功です。でも、油断は禁物。サイトの表側も裏側(管理画面)も、一通り触ってみて、ちゃんと動くか確認しましょう。

  • 基本動作: 記事はちゃんと表示されるか? 新しい記事を投稿できるか? メディアライブラリは表示されるか?
  • 管理画面: 各設定ページは開けるか? 特にプラグインの設定ページは要チェック。
  • ユーザー関連: ログイン・ログアウトはできるか? 新規ユーザー登録は機能するか?
  • 特殊な機能: ECサイトならカート機能や決済、会員サイトならコンテンツ制限が正しく動くか。

特に問題がなければ、作業は完了です。使った「Brozzme DB Prefix」プラグインは、もう不要なので削除してしまってOKです。プラグインは、少ないに越したことはありませんからね。

トラブルシューティング:もしサイトが壊れたら?

万が一、変更後にサイトが真っ白になったり(White Screen of Death)、データベース接続エラーが出たりした場合。慌てず、以下の手順で確認してください。

  1. バックアップから復元: これが一番手っ取り早くて確実です。だからあれほどバックアップが大事だと…。
  2. 手動で元に戻す: 復元が難しい場合、やったことを逆に戻します。
    • FTPなどでwp-config.phpを開き、$table_prefixの値を元のwp_(あるいは変更前の値)に戻します。
    • phpMyAdminにログインし、変更されてしまったテーブル名を一つずつRENAME文で元に戻します。面倒ですが、これで大抵は復旧します。

主な原因は?

  • wp-config.phpの書き込み失敗: サーバーのパーミッション設定で、WordPressがwp-config.phpを書き換えられなかった場合に起こります。この場合、テーブル名だけが変わって、WordPress本体の設定が古いままなので、エラーになります。
  • 一部プラグインの不追随: ごく稀に、プラグインが$table_prefix変数を参照せず、wp_をハードコーディングしている場合があります。そのプラグイン関連の機能だけが動かなくなります。その場合は、プラグインを一旦停止するか、開発者に問い合わせる必要があります。

まとめ:完璧な対策はない。でも、やる価値はある。

テーブル接頭辞の変更は、それ単体でサイトを鉄壁にするような魔法の杖じゃありません。Wordfenceの言う通り、本気の攻撃者の前では時間稼ぎにしかならないかもしれません。

でも、セキュリティっていうのは、そういう完璧な対策を一つ探すゲームじゃないんです。いくつもの不完全な対策を、意味のある形で積み重ねていくプロセスなんですよ。テーブル接頭辞の変更は、その積み重ねの、一番下に置くブロックの一つとして、俺は十分に価値があると思っています。

特に、プラグインを使えば数分で、しかも安全にできる時代です。「リスクがゼロじゃないならやらない」んじゃなくて、「低リスクでリターンがあるならやっておく」。そのくらいの軽い気持ちで、あなたのサイトの守りを一枚、増やしてみてはいかがでしょうか。あの日の俺みたいに、冷や汗をかきながら徹夜する人が一人でも減ることを願ってます。

よくある質問(FAQ)

Q1. 新しい接頭辞、どんな文字列がいいんですか?

A1. wp_とかサイト名とか、推測されやすいのはダメですね。英数字をランダムに混ぜて、最後に必ずアンダースコア _ をつけるのが基本です。8文字から12文字くらいあれば十分でしょう。例:db7x_site_k2m_

Q2. 接頭辞を変えたら、サイトが速くなったりします?

A2. しません(笑)。これは純粋にセキュリティのための作業で、サイトの表示速度とかパフォーマンスには全く影響ないです。

Q3. マルチサイトでも同じ方法でできますか?

A3. Brozzmeプラグインはマルチサイトにも対応してますが、構造が複雑なんでリスクは上がります。各サブサイトのテーブル(wp_2_postsとか)も全部変更されるんで、テストはより入念にやる必要があります。正直、マルチサイトの場合は専門家に頼むのが無難かもしれません。

Q4. 一回変えた接頭辞を、また別のに変えられますか?

A4. できますよ。手順は全く同じ。プラグインが現在の接頭辞を自動で認識してくれるんで、新しいのを入力してボタンを押すだけです。

Q5. エラーが出てサイトが表示されなくなったら、どうすれば?

A5. 落ち着いて、まずwp-config.phpの中身を確認してください。$table_prefixが新しいものに書き換わってるか。次にphpMyAdminで、実際のテーブル名が変更されてるか。どこかで処理が止まってるはずです。原因が分からなければ、迷わずバックアップから復元!これが一番確実です。

Q6. SEOに影響はありますか?

A6. ありません。テーブル接頭辞は、サイトの内部的なデータベースの話であって、Googleのクローラーなどの外部からは見えません。なので、検索順位に影響することは一切ないです。

Q7. プラグインの更新が止まってるみたいだけど、使って大丈夫?

A7. 良い質問ですね。確かに「Brozzme DB Prefix & Tools Addons」は、ここ数年更新が止まっています。ただ、やってることはすごくシンプルなんで、WordPressのコアアップデートで動かなくなる可能性は低い。とはいえ、心配な人は「All-In-One Security (AIOS)」みたいな、今も活発に開発が続いてる総合セキュリティプラグインを使うのがおすすめです。AIOSにも、同じように接頭辞を変更する機能が含まれてます。

Q8. レンタルサーバーによっては、注意することありますか?

A8. 一部のレンタルサーバーでは、独自のセキュリティ機能がwp-config.phpの書き換えをブロックすることがあります。もしプラグインでエラーが出たら、まずサーバーの管理パネルで、ファイル編集に関する制限がかかってないか確認してみてください。分からなければ、サーバーのサポートに聞くのが一番早いです。

参考文献

[1] Wordfence. (2016). WordPress Table Prefix: Changing It Does Nothing to Improve Security. https://www.wordfence.com/blog/2016/12/wordpress-table-prefix/

WordPressのセキュリティ、不安に思っていませんか?

「自分のサイトは大丈夫だろうか…」
「何から手をつければいいか分からない…」

もしあなたが少しでもそう感じているなら、専門家によるセキュリティ診断を受けてみることを強くお勧めします。

>> WordPressセキュリティ無料診断はこちら

上記のサイトでは、WordPressのプロがあなたのサイトの脆弱性を無料で診断してくれます。問題が見つかれば、具体的な対策方法についてもアドバイスをもらえます。手遅れになる前に、一度プロの目でチェックしてもらい、安心を手に入れましょう。

FacebookでシェアTwitterでシェアPinterestでシェア