データベース・テーブルに対するセキュリティ対策

MySQLのテーブル名を変更 インストール
セキュリティ対策:テーブル名を変更

データベース・テーブル

目的は、データベース(db)に対するセキュリティ対策です。

WordPressをインストール後(デフォルト)では、全てのテーブルには「wp_」というプレフィックスが設定されています。

脆弱性対策の一環として「テーブル名」を特定されにくくし、データベースに対しての攻撃があった場合でも「テーブル名」が特定しずらく、攻撃者によって行われるSQLインジェクションで、不正にテーブルが削除・変更されてしまうなどの予防にも役立ちます

「テーブル名」を特定されにくくするために、プレフィックスをオリジナルに設定するのです。

プレフィックスを変更できるプラグインも存在しますが、プラグインに頼るよりここではより確実なSQLによる変更を行います。(SQL文など使い慣れていない方も多いかとはおもいますが、出来るだけ分かりやすくお伝えして行きますので、セキュリティ対策の一環としてお役立ていただければ幸いです。)

.SQL Injectionとは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法。(複数のSQL文を注入することによるデータの破壊や改ざん、ストアドプロシージャ(データベースに対する一連の処理をまとめた手続きにしたもの)を実行されることによる情報の漏洩や改ざん、OSコマンドの実行などを引き起こすこともできる)

手動でWordPressで使用するテーブル名を変更:セキュリティ対策

MySQLのテーブル名を変更
セキュリティ対策:テーブル名を変更

手動でWordPressのテーブルのプレフィックス(prefix)を変更する手順

正確にはWordPressが利用するデータベース(MySQL)のテーブルに対するprefix変更です。

変更手順は、以下の3つのステップに分かれます。

①-「wp-config.php」で設定している、テーブルプレフィックス(prefix)を変更する

②- WordPressで利用している、全てのテーブルのプレフィックス(prefix)を変更する

③-「options」テーブルと「usermeta」テーブル内の項目を変更する

  • 「wp-config.php」で設定しているテーブルプレフィックス(prefix)を変更する

WordPressのファイル群で、テーブルプレフィックスを指定しているファイルが

wp-config.php」です。

今回WordPressインストールしたドメイン(イイネ.biz)にFTPで入って

WordPressフォルダ内の『wp-config.php』ファイル内で行います。

これをインストール時に設定してしまえば良いのですが、インストール後に変更したいという場合もあります。(この説明はWordPressインストール後の方法です。)

また、この記事では2つの環境(異なるドメイン)に、ほぼ同時並行的にWordPressをインストールし、セキュリティ対策などを行っていくことで、タイミングの違いなどをそれぞれのキャプチャを添付し、出来るだけセキュリテイ対策をわかりやすくお伝えして行くことに努めています。

. 「wp-config.php」というファイルは、WordPressを利用する上で、最も重要で、最もセキュリティレベルを高く設定しなければいけないファイルです。

なぜなら、「wp-config.php」には、データベースのアカウント情報(データベースのID・パスワード)が記載されているからです。リネーム後の「wp-config.phpそのもののセキュリティ対策後途(外部からのアクセスを不可に設定し、パーミッションも厳しく設定する。)でお伝えしたいと思います。

ここで、wp-config.phpを編集して、データベース(db)のテーブル名(プレフィックスだけ)を変更するだけでは、問題が残ります。

(このままでは『このページにアクセスするための十分なアクセス権がありません。』と警告メッセージが表示されてしまいます。)

その為に、 wp-config.pnp内容記述内容)を編集(変更)するのです。

wp-config.phpの中身の70行前後くらいにる『$table_prefix』という部分を変更・編集します。

$table_prefix = ‘wp_’; という部分を

$table_prefix = ‘wp2_’;  など、別なものに変更するのです。

.各自の実態にあわせて実際は別のプレフィックスにします。)

Point

. 小文字/大文字の扱いは注意してください。特に開発環境と運用環境が異なる場合は注意が必要です。開発環境windowsMacで、運用環境Linux(多くのレンタルサーバー)の場合で、開発環境から運用環境にデプロイ(deploy:ネットワークを通じてシステムを開発環境から本番環境に配置)する様な場合、文字コードの関係で、開発環境で動いていたものが、運用(本番)環境では動かないなんてことにもなりかねません(特にテーブル名など)※それぞれ文字コードの扱い(CCSID:文字セットの識別)が違いますから。(この件の詳しいことは別途日を改めてお伝えできれば、と思っています。)またプレフックスの最後は半角アンダースコア(_)で終わる様にしてください。

FTP(XSERVERの場合)

Xserverログインファイル監理FTP(WebFTP)ご自分のドメイン名public_html

 「✅」wp-config.php ➡「編集」ボタン

wp-config.php の「編集」

wp-config.php

✅ をつけて、「編集」ボタンを押下すると⇩以下の様な表示になります。

wp-config.php の「編集」
wp-config.php の「編集」

サーバーのFTP上での編集は困難ですので、コピペで「Sublime Text 3」などのテキストエディタに移して、「Sublime Text 3」上で編集後に、編集後の状態コピペWebFTP上移し保存する」で置き換えましょう。  wp-config.php

この例では、72 Stepです。

ここを変更します。

⇧例では、72 Stepをコメント化し、新しく73Stepに追記したため、1Step増えました

この状態で、「Ctrl」+「A」で全体を選択しコピペでWebFTP上のwp-config.php

に移し「保存」します。

パス /xn--ecka7j.biz/public_html/   ⇩変更後、⇧変更前

更新日時が変わったことで更新を確認します。

続いて②データベース(db)の(全て(12個)のテーブルのプレフィックス)変更です。

  • WordPressで利用している、全てのテーブルのプレフィックス(prefix)を変更する

XSERVERログイン > サーバー管理 > データベース > phpmyadmin(MySQL5.7)

 php-adminログイン

「SQL」タブ

既に、同じデータベース上に、別のドメイン用のWordPressをインストールし、プレフィックスも変更していることから、ここでは別のプレフィックス(ユニーク・一意な)を付けます。

「SQL」タブから、ALTER TABLE wp_commentmeta RENAME TO jn1_commentmeta; などを入力して変更します。「実行」

しかし、SQLタブに直接入力は間違えやすく・しかも困難な部分もあります。

事前にテキストエディタでしっかり文法ミスの無い様に入力してチェックしておいてから、

コピペでSQLタブに移して「実行」の方が良いでしょう。

と言っておいて実際にはミスるのですが(笑)・・・印をつけたもの。この時点ではまだ気付いていない

あなたに、間違い(違い)が分かりますか?

「実行」

 でエラーが無かったことが判ります。

「F5」キーでリフレッシュ表示すると、

12個のテーブル名のリネーム(プレフィックスの変更)完了が確認できます。

未だ気付いていない

「構造」をクリックすると ⇩

 テーブルの並び順がおかしい?(ここでやっと気付く)

 リネームミスですjnl_postmeta は、jn1_postmeta に修正です。

⇧OKです。

これで、Wordpress標準で設定されているテーブルは全てプレフィックスを変更しました。

ですが、注意しなければならないのが、「プラグイン」で使用しているテーブルもプレフィックス変更しなければならない。ということです。

今回の場合は、WordPressをインストールしただけで、何もプラグインをインストールしていないから大丈夫です。

例えば、 別環境だと2つテーブルが多く14個です。

(SiteGuard WP Pluginで追加されたものです。)

更に、プラグインの「xo security」をインストールすると、

**_xo_security_loginlogテーブルが追加され15Tableとなっています

☝は別環境、①②③の処理(プレフィックス変更)後にプラグインをインストールで追加されたテーブルですが、①の『wp-config.php』の変更と、③のテーブル内の項目を変更の結果がうまく反映されていることの表れ(証明)です。

次は③テーブル内の項目を変更です。 ➡

「options」テーブルと「usermeta」テーブル内の項目を変更する

先ほど、Wordpressで利用している全テーブルのプレフィックスを変更しましたが、このままだと、まだ不十分です。

試しに、WordPressの管理画面を開いてみますと、「アクセス権限がありません」とエラーになります。まだやらなければならない作業があるからです。

理由は、「wp_」というプレフィックスが使用されているのは、テーブル名だけでなくデータの名前にも使用されているのです。

どこのデータかというと、オリジナルのテーブルでは、『wp_options』と『wp_usermeta』で、あなたが先の処理で変更した。

jn1_optionsテーブルと「jn1_usermetaテーブル内にあるデータです。

多―商テーブル名は、分かりました。でもどうやってテーブル内のデータを見つけるの?

お任せください。

まず、「options」テーブル内から、下記クエリで、該当データを検索しましょう。

SELECT * FROM jn1_options WHERE option_name LIKE ‘%wp_%

「実行」すると、

となります。対象は、

WP_user_rolesです。

 .ここで、 もWP_が付いているじゃあないかとお気づきのあなた、「さすが、注意力があります」。

 でも安心してください。’wp_page_for_privacy_policyには他他に影響を与えるデータではないのです(プライバシーポリシーに関するものです)

⇧ここで「✅」「編集」クリックでここの値を直接編集入力で「jn1_user_roles」に変更して「実行」でも良いのですが、確実性を求め、SQLで実行します。

「実行」

「実行」

同様に、「SQL」から、確認

「実行」

同様に、「SQL」から、更新

「更新」

  ☜ 確認

「実行」

  ☝2件だけで、先の2件はwp_でない結果(抽出されない)となっている。

「再確認:「1行変更しました。」とは?」

「実行」

  ☝ 2件ともmeta_keyは更新されている。 は、phpMyAdminのバグ?

これで、データベース(db)aitc_wp2の全テーブルのプレフィックスの変更は終わりです。

ちょっと待った~~~~~

 最初に、

『脆弱性対策の一環として「テーブル名」を特定されにくくし、データベースに対しての攻撃があった場合でも「テーブル名」が特定しずらく、攻撃者がSQLインジェクションで、不正にテーブルが削除・変更されてしまうなどの予防にも役立ちます。

「テーブル名」を特定されにくくするために、プレフィックスをオリジナルに設定するのです。

と言っていながら、テーブルのプレフックス名も、中身の設定値もマスキングすることなく全て開放して大丈夫かよ? この様な設定方法はネットで他にもみかけるが、みんな肝心な部分はマスクしているぞ!

セキュリティ対策が大事とかいって大丈夫かよ?

大丈夫です

マスキングすると肝心なところが隠れてしまい、あなたに伝えにくくなるから、あえてマスキングしていないのです。(分かりやすく伝えることがこのブログの目的です。隠すべきところは、隠していますから。ブログを公開する前に、それでも尚あなたが脆弱性を見つけたら、連絡いただけると嬉しいです。)

そして、ここをお見せしても大丈夫と言える根拠が、次にお伝えする

wp-config.phpをアクセス不可に設定する」と、その次の「パーミッションの変更」です。

「wp-config.php」そのもののセキュリティ対策(外部からのアクセスを不可に設定し、パーミッションも厳しく設定する。)

「wp-config.php」を、アクセス不可に設定する

「wp-config.php」というファイルは、Wordpressを利用する上で、最も重要で、最もセキュリティレベルを高く設定しなければいけないファイルです。

大事なのは「外部からのアクセスを不可に設定し、パーミッションも厳しく設定する」事です。

以下の手順で行います。

まず、「wp-config.php」と同じ階層にある「.htaccess」ファイルを編集し更新します。

外部からアクセスされないように.htaccessを使って制限を掛ける

<Files wp-config\.php>

Order deny,allow

Deny from all

</Files>

#  \は、Linuxでは半角のバックスラッシュ(筆者の環境はWindowsの日本語キーボード)

 これが無い記述を他のサイト3か所で見かけるが・・・・・・¥がある方が正しい様です。

これで実際wp-config.phpファイルにアクセスすると403エラーが返るはずです。

これで、外部からのアクセスは不可能になります。

¥(円サイン)を使うのは日本語キーセットの場合です。

攻撃されやすいファイルのアクセス制限

wp-config.php :WordPressの動作に必要な設定ファイル と並んで攻撃されやすい

  • wp-cron.php :予約投稿やアップデート通知など時刻連動の処理に使われるファイル

.htaccessを使ってwp-config.phpと同様に制限を掛けるのが良いでしょう。

<FilesMatch "^(wp-config\.php|wp-cron\.php)">
order allow,deny
deny from all
</FilesMatch>

\は、サーバー上(Linux上)では、半角のバックスラッシュです。Windows上では表現が難しいため。以下に画像で表示します。

(サーバー上の.htaccessへは、上記のものをコピペで、# BEGIN WordPressの上の行に挿入貼り付けしてください。)

.htaccessの保護

.htaccess自体が不正アクセスされては他の設定も無意味になってしまうので.htaccessファイルそのものへのアクセスをすべて拒絶します。

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>

ディレクトリ表示の禁止

ブラウザでディレクトリにアクセスされた時にファイル一覧が見れる状態は攻撃の手がかりになってしまうため、表示されないようにします。

index.htmlやindex.phpが存在しないディレクトリに対してブラウザからアクセスすると、そのディレクトリにあるファイルの一覧が表示される場合があります。表示されているファイルによっては、不正なアクセスに利用されてしまうかもしれませんので、ファイルの一覧を非表示にしておきましょう。.htaccessに記述を追加するのですが、WordPressが動作しているサーバによって設定方法が異なります。

設定方法1

Options -Indexes

設定方法2

DirectoryIndex index.html .ht

どちらか動作する方法で記述してください。

ログイン管理画面(wp-login.php)のアクセス制限

ログイン画面への攻撃を防ぐため、関係者以外はログイン画面にアクセスできないようにします。➡ これは、次にお伝えするプラグインで行います。(関係者以外はログイン画面にアクセスできないようにするため、wp-login.phpのファイル名そのものを隠蔽してしまいます。)

次に、パーミッション設定です。

wp-config.php」のパーミッションは「400」が推奨ですが、

ただし、共有サーバーの場合「400」で設定できないケースも多いようで、WordPress.org では「600」を推奨しています。

当ブログで利用しているホスティング会社のXSERVERも「600」を推奨しているため、その設定で運用しています。

XSERVERの場合は「600所有者 書き込み権限+読み込み権限

200 所有者 書き込み権限
400 所有者 読み込み権限
数字 意味

「パーミッション変更」で可能の様ですが、このまま推奨値「600」で行きます。

 「wp-config.php」以外のパーミッションの設定は、また別の機会に。

.htaccess

「604」(所有者 書き込み・読み取り /その他 読み込み権限)か「606」

「.htaccess」ファイルが書き換えられる事例が多発しており、パーミッション設定は必須です。パーマリンク(Webページ毎に設定した(カテゴリ構造の)URL)の設定が出来るようにするには「606」(所有者 書き込み・読み取り /その他 書き込み・読み込み)にします。

XSERVERでは644です。

「644」は(所有者 書き込み・読み取り /グループ 読み込み権限/その他 読み込み権限)

 ここは➡「604」に変更・更新

次は、セキュリティ対策用のプラグインのインストール・設定・有効化です。

PingBack機能を悪用したDDoS攻撃の防止のためにもプラグインでPingBackを無効化します。

使用するプラグインは、SiteGuard WP Pluginです。

.htaccessの様々な利用法はここからどうぞ!

併せて、セキュリティ対策:インストール時に行うTableのリネーム

コメント

タイトルとURLをコピーしました