MENU

wordpress導入の対応内容について

WPセキュリティ覚書
参考:
https://knowledge.cpi.ad.jp/security-info/211/
https://kosaeru.net/memo/wordpress-security-header/
https://qiita.com/hirai-11/items/f4d81f27886b623c5ef0

完全にゼロからオリジナルテーマを作成する場合は、下記記事参照。

このページの内容は、既に構築済みのWordPressや、市販テーマを使用してWordPressを構築する際に、
セキュリティ対策の内容として、対応可能な内容を組み込んでください。

目次

WPインストール時の設定

■サブディレクトリにWPを入れる

ドメイン直下にWP関連ファイルを入れると外部から推測されやすいので、可能であればサブディレクトリを作成して、そこにWP関連ファイルを入れる。
※wordpressと推測されそうなディレクトリ名は避ける「wp」とか「wordpress」とか

サブディレクトリのWPをドメイン直下のサイトURLにしてリリースする手順

①ワードプレスのダッシュボードから設定

②index.phpの編集

サブディレクトリにある「index.php」をコピーして、下記のように変更し、ルート直下のディレクトリにアップ
※サブディレクトリにある「index.php」はそのままでOK

③.htaccessの移動

サブディレクトリ内の「.htaccess」をドメイン直下に移動。
最後に管理画面からパーマリンクを更新する。
※サブディレクトリ内にあった「.htaccess」は削除
※ドメイン直下に元々「.htaccess」があった場合は、内容をマージさせる。

■WPインストール時の接頭辞について

初期値の「wp_」から推測しにくい文字列に変更する

■WPのユーザーについて

「admin」というユーザーは作らない。パスワードは可能な限り複雑にする
https://www.luft.co.jp/cgi/randam.php

■コメント機能について

コメント機能を使わない場合は最初に設定
「設定>ディスカッション」でチェックを外す
※赤線のチェックを外す

WPファイル設定

■wp-config.phpの編集

WordPressダッシュボードでファイル編集を無効にする。
wp-configファイルの最後に次のコードを追加してください。

//WordPressダッシュボードでファイル編集を無効

define('DISALLOW_FILE_EDIT', true);

■不要なファイルの削除

・使用していないテーマディレクトリ
・使用していないプラグイン

■ログインURLの変更

参考:
https://ishikawatsukasa.com/chat/web/894/
https://wpqw.jp/wordpress/themes/post-password-required/

ハッシュ値自動生成
https://www.webdesignleaves.com/pr/samples/PHP/password_hash.php

※ログインのURL変更した場合、パスワード付きの記事機能が上手く機能しなくなる。
上記の機能を使用する場合は、下記のコードをfunctionに追加する必要がある。
ただし、下記の設定を行うとセキュリティが緩くなるので、導入する場合先方と相談が必要

// パスワード保護機能復活(form タグ内の記述はテーマに合わせてください。)
function wpqw_password_form() {
	global $post;
	$label = 'pwbox-'.( empty( $post->ID ) ? rand() : $post->ID );
	$o = '<form action="' . esc_url( site_url( 'wp-login.php?action=postpass', 'login_post' ) ) . '" method="post">
	' . __( "<p>パスワードを入れてね</p>" ) . '
	<label for="' . $label . '">' . __( "パスワード" ) . ' </label><input name="post_password" id="' . $label . '" type="password" size="20" maxlength="20" /><input type="submit" name="Submit" value="' . esc_attr__( "Submit" ) . '" />
	</form>';
	return $o;
}

■feed(RSS)から投稿者名を削除

デフォルトだとfeed内に投稿者のアカウント名が表示されてしまうので、wordpressのサイト名に差し替える。
function.phpに下記の記述を追加。
※その他ページでのアカウント名の非表示対応はプラグインで対応

//feedのauthor名を変更
function delete_feed_author($author) {
    if(is_feed()){
        $author = get_bloginfo( 'name' ) ;
    }
    return $author;
}
add_filter( 'the_author', 'delete_feed_author');

※キノスラテーマを使う場合は、
 下記のインクルードファイル内に記載しているため、
 function.phpへの追記は不要です。
 http://wp-template.cynosura.jp/
 ┗ custom_security.php

■パーミッションの設定

wp-config.php  400
.htaccess    664
ファイル    664
ディレクトリ  775

※セキュリティのためより権限を狭めるなら下記のパーミッション(構築完了後)
.htaccess    604
ファイル    604
ディレクトリ  705

・sshでのファイル操作
#WP関連ファイルの所有者変更(chownはスーパーユーザーのみ)
chown -R apache:apache WPをインストールしたディレクトリパス

#パーミッションの変更
find WPをインストールしたディレクトリパス -type d -exec chmod 775 {} \;
find WPをインストールしたディレクトリパス -type f -exec chmod 664 {} \;
find WPをインストールしたディレクトリパス -name wp-config.php -exec chmod 400 {} \;
find WPをインストールしたディレクトリパス -name .htaccess -exec chmod 664 {} \;

htaccessの設定

■各種セキュリティ対応。.htaccessに下記記述足す

# セキュリティ対応
<IfModule mod_headers.c>
Header set Cache-Control "private, no-store, no-cache, must-revalidate"
Header set Pragma "no-cache"
Header set Strict-Transport-Security: "max-age=31536000"
Header set Content-Security-Policy "upgrade-insecure-requests"
Header set X-Content-Type-Options "nosniff"
Header set X-XSS-Protection "1; mode=block"
Header set Referrer-Policy: "no-referrer-when-downgrade"
Header append X-Frame-Options SAMEORIGIN
Header set Permissions-Policy "geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=(self),payment=()"
</IfModule>

■ディレクトリ表示の禁止。.htaccessに下記記述足す
# ディレクトリ表示の禁止
Options All -Indexes

■.htaccessのアクセス制限
#.htaccessのアクセス制限
<Files ~ "^\.(htaccess|htpasswd)$">
    deny from all
</Files>

■BASIC認証かける
https://www.luft.co.jp/cgi/htpasswd.php
※ログインURL変えてたら「wp-login.php」のファイル名も合わせる
※ファイルに記述するPWは暗号化後、ブラウザでログインするPWは暗号化前
※「 AuthUserFile /home/homepage/.htpasswd」のディレクトリは環境によって変わる。
 .htaccess の一つ上のディレクトリに格納すればOK(.htaccessが置いてあるディレクトリはユーザーからも見えてしまうため。但し、レンサバなどで前述のディレクトリに格納できない場合は、.htaccess と同ディレクトリに格納)

<Files wp-login.php>
 AuthName "Please enter your ID and password"
 AuthType Basic
 AuthUserFile /home/homepage/.htpasswd
 Require valid-user
</Files>

■管理画面への接続を固定IPにする
※ログインURL変えてたら「wp-login.php」のファイル名も合わせる
<Files wp-login.php>
order deny,allow
deny from all
allow from ご自身のIPアドレス
</Files>

※キノスラのIPアドレス(2023.07時点)
allow from 153.125.130.246
allow from 202.241.138.139
allow from 116.82.248.69

■「.htaccess」が利用できるサーバーであれば下記コードを追記
# 特定ファイルへのアクセス防止
<FilesMatch "^(wp-config\.php|wp-config-sample\.php|xmlrpc\.php|readme\.html|license\.txt)$">
    Order allow,deny
    Deny from all
</FilesMatch>

■インクルードのみのファイルをアクセスブロックする
# Block the include-only files.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

■「wp-content/uploads」ディレクトリでPHPを実行させない。
「wp-content/uploads」ディレクトリに下記内容で「.htaccess」を設置
※プラグインとかとバッティングするようなら削除
# Kill PHP Execution
<Files *.php>
deny from all
</Files>

プラグイン設定

■プラグイン
・共通
SiteGuard WP Plugin
Wordfence Security
reCaptcha by BestWebSoft
WP Multibyte Patch
BackWPup
EWWW Image Optimizer

・必要あれば
Advanced Custom Fields
All-in-One WP Migration

■プラグイン(セキュリティ)-SiteGuard WP Plugin


下記の設定をON

画像認証
→全部「ひらがな」にチェック

XMLRPC防御
→「XMLRPC無効化」にチェック

※注意サイトガードのログインページをOFFにしないと、function.phpでログイン画面以外リダイレクト設定が干渉して動作に影響を及ぼす。基本的にログイン画面ページの変更はfunction.phpで対応する為、こちらは必ずOFFにする!

■プラグイン(セキュリティ)-Wordfence Security

ライセンス登録をする必要有り。
有料プランもあるが、無料プランでOK




・下記の設定は初期値から変更
すべての設定 > ブルーとフォース保護


→「SiteGuard WP Plugin」で「ログインロック」有効にしているなら「オフ」にする。

・下記を参考にファイヤーウォールの設定を行う
https://haseblo-blog.com/wordfence-security-setting-how-to/#index_id7

・下記のチェックシートを使用して不足が無いか確認https://docs.google.com/spreadsheets/d/10f9TGCsZUPhdbJ75pkGqR5ojtq9Whtku8RCCDNKtEG0/edit?usp=sharing

プラグイン(セキュリティ)-reCaptcha by BestWebSoft
※Wordfence Securityで対応

https://www.google.com/recaptcha/admin/create
https://to-min.net/wordpress-spam-recaptcha-bestwebsoft/

・「Login form」にチェック(必要があれば他項目も適宜チェックを入れる)

・先方に固定IPが存在しているようであれば、「許可リスト」に追加する

image.png を表示しています

■プラグイン(最適化)-EWWW Image Optimizer

初期設定



↓ WebP の配信方法

「リライトルールを挿入する」をクリックして、右の「PNG」が「WEBP」になればOK

■プラグイン(バックアップ)-BackWPup

https://lucy.ne.jp/bazubu/how-to-use-backwpup-3-23804.html
・ファイル系とDB系のジョブは別々に登録する。

・ファイル系 → 週1回の3か月(12回)



バックアップを格納するフォルダー
→ backupfile/file-backup/

ファイルを削除
→ 12


・DB系 → 毎日を一月分(30回)




バックアップを格納するフォルダー
→ backupfile/database-backup/

ファイルを削除
→ 30

パーツの読み込み

WordPress構築の際に対応が必要な内容については、用途に応じてパーツ化しているので、適宜、構築中のテーマの「functions.php」にインクルードして使用してください。

・パーツの格納先
/var/www/cynosura.jp/wp-template/public_html/wpinstall/wp-content/themes/cstm-wp/inc/component

「一般設定>キャッチフレーズ」の内容を表示されないようにする

custom_title.php

アーカイブのURLから「/category/」のスラッグ消す

custom_cat_slag.php

the_archive_titleの「カテゴリー:」や「タグ:」の文字を削除する

custom_the_archive_title.php

wordpressがデフォルトで表示させる不要なものを削除

disabled_wp_default.php

固定ページのbodyにページスラッグのclassを付与

custom_page_slag.php

カスタム投稿、カスタムタクソノミーを追加する

custom_post_type.php

空欄・スペースで検索した場合、検索結果を0件にする

custom_search_space_nolist.php

wordpressの基本的なセキュリティ対応

・ログインURLを変える
対応方法詳細
・ログイン画面にベーシック認証かける
・WordPressのバージョン非表示
・投稿者アーカイブ非表示
・feedから投稿者名を非表示
・コメントCSSクラスの除去
・「SiteGuard WP Plugin」プラグイン入れる
→対応方法詳細
・「Wordfence Security」プラグイン入れる
→対応方法詳細

custom_security.php

SEO対策用のフィールド追加

custom_seo.php

オリジナルのショートコード追加

custom_shortcode.php

GTMやASPタグなど任意の場所に表示

custom_tag.php

パンくずの表示

custom_breadcrumb.php

ページネーションの表示

custom_pagenation.php

外部CSSファイルの非同期処理

load_css_async.php
→※「/themes/cstm-wp/inc/custom-header.php」にて使用

外部JSファイルの非同期処理

load_js_async_defer.php
→※「/themes/cstm-wp/inc/custom-header.php」にて使用

その他

記述内容が構築するサイトによって都度、異なりそうなものは下記のテンプレートに記載
/themes/cstm-wp/inc/template-functions.php
/themes/cstm-wp/inc/template-tags.php

この記事を書いた人

目次