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 SecurityreCaptcha 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が存在しているようであれば、「許可リスト」に追加する
■プラグイン(最適化)-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