OWASP WordPress
セキュリティ実装ガイドライン
1
2018.04.07 (Sat)
OWASP Nagoya
OWASP WordPress Security Implementation
Guideline
● OSI参照モデルの物理層からアプリケーション層まで幅広くカバーしています
● rawデバイス(ディスク)の暗号化など、システムとハードの深層深部から全領域の暗号
化を追及しています
● 有名なCVEを重点的に訴求し、信頼性が高いドキュメントです
● 毎年、少しずつ更新されています
2
OWASP WordPressセキュリティ実装ガイドライン
に沿って進めます
https://www.owasp.org/index.php/OWASP_Wordpress_Security_Implementation_Guideline#WordPress_security
OWASP WordPress Security Implementation
Guideline
3
OWASP WordPress セキュリティ実装ガイドライン の歴史
https://www.owasp.org/index.php?title=OWASP_Wordpress_Security_Implementation_Guideline&action=history
2014年10月 一気にプロジェクトが充実しました!
OWASP WordPress Security Implementation
Guideline
4
以降、『実装ガイド』と呼称します
目次
5
3.1 Apache堅牢化
3.2 php堅牢化
3.インフラセキュリティ
3.3 MySQL堅牢化
3.4 リモート接続
2.一般的なキュリティ
2.1デバイスセキュリティ
実装ガイドの番号に沿って記載します!
4.1 アップデート
4.2 未使用プラグインとテーマの削除
4.3 プラグインとテーマのセキュリティ
4.4 バックアップ
4.5 ユーザー種別と権限
4.6 wp-adminのアクセス制限
4.7 ブルートフォースアタック対策
4.8 2要素認証の実装
4.9 デフォルト管理者アカウント削除/変更
4.10 ユーザー登録の無効化
4.11 データベーステーブル接頭辞の変更
6
4.12 コメント機能の制御
4.13 ファイル/ディレクトリパーミッション確認
4.14 readme.html と install.phpの削除
4.15 ブランクindex.phpファイルの追加
4.16 wp-config.phpファイルの移動
4.17 秘密鍵の作成
4.18 ダッシュボードの強制SSL
4.19 WAFの活用
4.20 セキュリティプラグイン各種
4.21 プラグインとテーマの編集の無効化
4. WordPressセキュリティ
7
5.1 スタンダードイメージの作成
5.2 LDAP運用とシングルサインオンの活用
5.3 マルチサイト
5.4 複数ワードプレスの一元管理
5. 大規模運営
8
2. 一般的なセキュリティ
2.1 デバイスセキュリティ
9
WordPressサイトを見るデバイスのセキュリティです
スマホやPCなど、デバイスのパスワード保
護
強力なパスワードを使う
OSの更新 ストレージの暗号化
ウイルスソフトのインストールと更新
マルウェア/スパイウェアスキャナーのインストール
、スキャンの実行、スキャンソフト更新
ファイヤーウォールの設定 セキュアなブラウザ
10
3. インフラセキュリティ
11
3.1 Apache堅牢化①
定期的な更新 ウェブ上のディレクトリリスト表示の無効化
SSL化 Apache不要モジュールの削除 ※次ページにて
別のユーザーとグループにてデーモンを稼動 allow,denyによる各ディレクトリのアクセス制限
apacheを安全にするmod_securityの使用(WAF) シンボリックリンク無効化
SSI(Server Side Include)とCGI executionのオフ リクエストのサイズ制限
TimeOut, MaxClients, KeepAliveTimeout,
LimitRequestFields, LimitRequestFieldSize、などの
設定(DOS攻撃対策)
ログの有効化と設定
サーバーのバナー情報(ncコマンド)の変更 など
3.1 Apache堅牢化②
12
Apache不要モジュール
※上記のモジュールが必要な環境もあります。必要に応じて使用してください
userdir mod_userdir。ユーザー毎のウェブディレクトリを構成
suexec WEBサーバーを実行しているユーザーIDと異なるユーザーIDでCGIやSSIを実行
cgi/cgid mod_cgid。外部CGIデーモンを使ったCGIスクリプトの実行
include mod_mime。他の設定ファイルをIncludeディレクティブによって追加
autoindex mod_autoindex。ディレクトリ内のファイル一覧表示
3.2 php堅牢化①
13
定期的な更新 php-cgiバイナリをインストールしない
リスクのある不要なphpモジュールの無効化 潜在的に脅威を持つ不要なphpのfunctionの無効化※
内部エラーログ設定 クライアントサイドのエラーレポート表示の無効化
アプリケーションのエラーログ表示無効化 リモートコード実行をオフにする
マジッククオート(自動エスケープ)無効化 ファイルシステムへのphpアクセス制限
DOS攻撃対策(投稿容量サイズ、スクリプト
の実行時間制限、メモリの利用率制限)
php-suhosinのsecurity extensionを使う
phpバージョンを隠す .php拡張子を隠す
※詳細は次ページにて確認します。
3.2 php堅牢化②
14
潜在的に脅威を持つ不要なphpのfunctionの無効化
コマンド実行関数各種
● exec
● passthru
● shell_exec
● system
PHP Secure Configuration Checker
https://github.com/sektioneins/pcc
3.3 MySQL堅牢化
15
定期的な更新 リモートアクセスの制限、もしくは無効化
ファイルシステムのアクセス制限とACLs(
access control lists)の設定
chrootによるrootサービス隠蔽の設計(指定ディ
レクトリより上のディレクトリに進めない様に設
計)
ネットワークの暗号化(WEBサーバーとDBサー
バーを分離する場合、必須)
rawデバイス(ファイルシステムを入れる前のデ
ィスク)暗号化
バックアップデータの暗号化 MySQL設定 ※
※MySQL設定は次のページとなります。
3.3MySQL堅牢化
16
MySQL設定
同時接続数の上限設定 アクセス権/ユーザー権限管理
ログ設定 rootパスワード設定
rootアカウントのリネーム 未使用ユーザーや未使用データベースの削除
インストール履歴の削除
3.4 リモート接続
● FTPを使用しないで、SFTPを使用してください
● SSH接続を利用し、ファイル転送はSCPやWinSCPなどを使用してく
ださい
● ダッシュボードログインはVPNかSSHトンネルを使用して接続してく
ださい
17
サーバー接続
18
4. WordPressセキュリティ
4.WordPressセキュリティ
19
セキュリティ対象コンポーネント
● WordPress本体(コア)
● テーマ
● プラグイン
4.1 アップデート①
● wp-config.phpにてWordPress本体(コア)自動アッ
プデートの設定を行います
define( 'WP_AUTO_UPDATE_CORE', true );
20
アップデートはセキュリティホールの修繕として重要
「コアのマイナーバージョンアップ」と「翻訳ファイル」はデフォルトで自動更新。
4.1 アップデート②
functions.phpなどに記載します。
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
21
テーマとプラグインの自動更新
4.2 未使用プラグインとテーマの削除
● 脆弱性を余分にかかえることになるので、停止ではなく削除します
● 新たな脆弱性が発見されると、攻撃者は脆弱性を持つファイルを探す
スクリプトを作成します
● 脆弱性が知られたプラグインの増加は、攻撃者にチャンスをより多く
与えることになります
22
4.3 プラグインとテーマのセキュリティ①
23
● WordPress公式のプラグイン・テーマを使用
● WordPress公式の評価やコメントを参考に
● WordPress公式の最終更新日で、新旧具合を確認
● WordPress公式の更新リリース頻度を確認
● 現状のWordPressコアバージョンとの整合性を確認
4.3 プラグインとテーマのセキュリティ②
24
ソースコード解析ツールを使う
● RIPS
● PHP-sat
● Yasca ※
● Manual analysis using grep , GrepBugs
※Yascaはリンク先が以下の様に変更されています
https://linuxsecurity.expert/tools/yasca/
4.3 プラグインとテーマのセキュリティ③
● 難読化された箇所
● BASE64エンコードされた箇所
● システムコール(exec, passthru, system, shell_exec など)
● PHPのコード実行(eval, assert, preg_replace など)
● 情報開示機能(phpinfo, getenv, getmygid/pid/uid, など)
● ファイルシステム関数(fopen, bz/gzopen, chgrp/own/mod など)
25
ソースコード解析ツールで対応できない部分
4.3 プラグインとテーマのセキュリティ④
● 可能性有
● 事例有
26
公式プラグインに悪意の脆弱性!
補足
4.3 プラグインとテーマのセキュリティ⑤
● CVE ツイッター:@CVEnew
https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=wordpress
● WPScan Vulnerability Database ツイッター:@_WPScan_ ※メール配信登録出来ます
https://wpvulndb.com
● NVD
https://nvd.nist.gov
• WPScanを使って脆弱性スキャン
27
WordPress脆弱性情報のチェック
補足
4.4 バックアップ①
● WordPressコア(本体)
● プラグイン
● テーマ
● 画像ファイル
28
バックアップ対象
● jsとphpの各種ファイル
● その他のファイルや静的
WEBページ
● データベース
4.4 バックアップ②
● BackWPupプラグインでDropbox,AMAZON S3などに保存
● 「保存先リモートストレージアカウントを探りあてられ、データを全て削
除される」などのリスク対策として、WordPressインストール環境から
アクセスできないように、取得したバックアップを隔離された場所への移
動(待避)
29
バックアップの自動化
4.5 ユーザー種別と権限①
30
特権管理者 Super Admin マルチサイトのWordPressで全権を持つ管理者
管理者 Administrator シングルサイトのWordPress内で全権を持つ管理者
編集者 Editor シングルサイトのWordPress内で他ユーザーの分も含めて記事投稿/編集が
出来る
著者 Author シングルサイトのWordPressで投稿/編集できる。他ユーザー投稿の編集は
出来ない
寄稿者 Contributor シングルサイトのWordPressで下書き/編集は出来るが、公開投稿は出来な
い。他ユーザー投稿の編集は出来ない
購読者 Subscriber シングルサイトのWordPressで自己のユーザープロフィールのみ編集可能
4.5 ユーザー種別と権限②
31
ユーザー管理系プラグイン
Members plugin Role Scoper Plugin
User Access Manager Advanced Access Manager
User Role Editor
4.6 wp-adminアクセス制限①
● IPアドレスホワイトリスト
● 接続はローカルホストのみに制限
● 管理者ユーザー専用のVPN
● SSHトンネルの活用
● .htaccessの活用 ※次ページにて説明
32
4.6 wp-adminアクセス制限②
以下の様に記載して接続IPアドレスを指定、ファイル/ディレクトリ全てア
クセス制限します
Order deny,allow
Deny from all
Allow from 127.0.0.1
33
wp-adminディレクトリにて .htaccess を使う
※127.0.0.1のIPアドレス部分はご自身のIPアドレスに適宜変えてください。
4.7 ブルートフォースアタック対策①
● Google Captcha(reCaptcha)プラグインBy BestWebSoftの活用
https://wordpress.org/plugins/google-captcha/
※バックドアが見つかったCaptchaプラグインとは別のプラグインです。
34
キャプチャ機能の実装
4.7 ブルートフォースアタック対策②
● ログイン試行の上限回数を超えたら、一定時間ロックアウト
● IPアドレスによるロックアウトは、攻撃者のIPアドレスが変わる
のでベストプラクティスではない
35
ログイン試行回数の上限を設定
4.8 2要素認証の実装
● Clef※1
● Google Authenticator※2
● MiniOrange and other 2FA Plugins
36
サポートプラグイン
※1 Clefはプラグイン公開終了/サポート終了しています
※2 Google Authenticatorは3年前から更新停止しています
4.9 デフォルト管理者アカウントの削除/変更
37
● ブルートフォースアタックの標的になる
● ユーザーID:1、すなわち id =1 としてのSQLインジェ
クションの脆弱性を無効化する
WordPress初期インストール時のadminユーザー削除
4.10 ユーザー登録機能無効化
● ダッシュボードにログインしていない状態のユーザー
登録機能の無効化を行う
○ 「設定」⇒「一般」⇒「だれでもユーザー登録がで
きるようにする」にてチェックを外す
38
4.11 データベース接頭辞変更
● WordPressの初期インストール中に設定可能
● MySQLかphpmyadminやプラグインで変更する場合、wp-config.phpの
接頭辞変更も必要
● db-prefix-change(※)プラグインで可能 ※最終更新は1年以上前
39
wp_ ではないデータベーステーブル接頭辞に変更
4.12 コメント機能の制御
● コメント機能無効
● 登録済ユーザーだけにコメント機能利用制限
● コメント公開の手動承認
● Akismetプラグインの様なアンチスパムプラグインの活用
40
4.13 パーミッション確認
41
ファイル/ディレクトリ パーミッション
wp-config.php 400
wp-content/uploads/ 755
.htaccess 400
4.14 readme.htmlとinstall.phpの削除
以下3種のファイルを削除します
/<WordPress_root>/readme.html
/<WordPress_root>/license.txt
/<WordPress_root>/wp-admin/install.php
42
4.15 ブランクindex.phpファイル追加
43
以下のディレクトリに追加
wp-includes wp-content
wp-content/plugins wp-content/themes
wp-content/uploads
4.16 wp-config.phpファイルの移動
WordPressドキュメントルートからルートディレクトリに
wp-config.phpファイルの位置をずらします
public_htmlよりも違う位置の階層に移動させ、wp-
config.phpファイルへのインターネット経由アクセスを禁
止させます
44
4.17 秘密鍵の作成
define( 'AUTH_KEY', 't`DK%X:>xy|e-Z(BXb/f(Ur`8#~UzUQG-^_Cs_GHs5U-&Wb?pgn^p8(2@}IcnCa|' );
define( 'SECURE_AUTH_KEY', 'D&ovlU#|CvJ##uNq}bel+^MFtT&.b9{UvR]g%ixsXhGlRJ7q!h}XWdEC[BOKXssj' );
define( 'LOGGED_IN_KEY', 'MGKi8Br(&{H*~&0s;{k0<S(O:+f#WM+q|npJ-+P;RDKT:~jrmgj#/-,[hOBk!ry^' );
define( 'NONCE_KEY', 'FIsAsXJKL5ZlQo)iD-pt??eUbdc{_Cn<4!d~yqz))&B D?AwK%)+)F2aNwI|siOe' );
define( 'AUTH_SALT', '7T-!^i!0,w)L#JK@pc2{8XE[DenYI^BVf{L:jvF,hf}zBf883td6D;Vcy8,S)-&G' );
define( 'SECURE_AUTH_SALT', 'I6`V|mDZq21-J|ihb u^q0F }F_NUcy`l,=obGtq*p#Ybe4a31R,r=|n#=]@]c #' );
define( 'LOGGED_IN_SALT', 'w<$4c$Hmd%/*]`Oom>(hdXW|0M=X={we6;Mpvtg+V.o<$|#_}qG(GaVDEsn,~*4i' );
define( 'NONCE_SALT', 'a|#h{c5|P &xWs4IZ20c2&%4!c(/uG}W:mAvy<I44`jAbup]t=]V<`}.py(wTP%%' );
45
wp-config.phpにて(見本キーは使わないでください)
キーのジェネレータを使う事ができます
https://api.wordpress.org/secret-key/1.1/salt/
4.18 ダッシュボード強制SSL①
以下を記載してください
define('FORCE_SSL_ADMIN', true);
※ FORCE_SSL_LOGIN はコア4.4で非推奨になりました
46
wp-config.phpにて
4.18 ダッシュボード強制SSL②
グーグルもSSLを推奨しています
Google Security Blog『Next Steps Toward More Connection Security』2017/4/27
https://security.googleblog.com/2017/04/next-steps-toward-more-connection.html
47
WordPress全面SSL化を推奨します。
補足
4.19 WAFの活用
● BOT、コードインジェクション、admin-ajax.phpやindex.phpへのファ
イルアップロードなど、攻撃の形跡ログが見やすい
● criticalやmediumなど脅威レベルの把握
● httpヘッダのポリシー管理機能
● ログイン画面だけでなく、BOT防御、認証ログ、xml-rpc保護機能
48
NinjaFirewallプラグイン
4.2 セキュリティプラグイン各種
● iThemes Security
● BulletProof Security
● All In One WP Security & Firewall
● Sucuri Security
● Acunetix WP Security & Acunetix Secure
WordPress※
● Wordfence Security Plugin
49
※Acunetixは、数年前から更新が完全に止まっています。
4.21 プラグインとテーマの編集機能無効化
ダッシュボードのプラグイン/テーマの編集機能の無効化
define('DISALLOW_FILE_EDIT',true);
50
wp-config.phpの設定にて
51
5.大規模運営
5.1 スタンダードイメージ作成
セキュリティ設定とプラグイン設定がなされた基本イメージの作成
52
大企業で多数のWordPressを同時に取り扱う場合、一元管理システムを導入
イメージより作られる複数の新WordPressインスタンスには、以下3項目の設定で運用スタートでき
るようにします
1. 設定(一般)
2. データベース接続アカウント
3. 管理者アカウント設定
5.2 LDAPとシングルサインオン
サポートプラグイン
● Active Directory Integration / LDAP Integration
● Single Sign On for Windows
● Simple LDAP Login
53
Active Directoryや他のLDAP互換サービスとの連携も可能
5.3 マルチサイト①
● ワードプレスのネットワーク機能を使って構築
● テーマとプラグインのディレクトリは複数ワードプレスで共有
● メディアとデータベーステーブルについては複数ワードプレスで
非共有
54
1つのワードプレスインストールで複数ワードプレスを保持
5.3 マルチサイト②
複数ワードプレスのセキュリティ管理(テーマとプラグイ
ンの更新)を一元化出来る
55
メリット(デメリット)
5.4 複数ワードプレス一元管理①
● マルチサイトと対照的な手法
● 1つ1つのWordPressが完全に独立しているケース
56
ワードプレスを複数インストール
5.4 複数ワードプレス一元管理②
● InfiniteWP , InfiniteWP Client(プラグイン)
ログイン、更新、バックアップ、リストアの一元管理が出来ます。
● ManageWP
● WPRemote
57
一元管理向けツール各種
6.参照
58
実装ガイドの下段に各種参照リンクがあります。
OWASP WordPress セキュリティ実装ガイドライン
https://www.owasp.org/index.php/OWASP_Wordpress_Security_Implementation_Guideline
セキュアなWordPressの構築
ハンズオンスタートです!
59
是非、読んでみてください!
謝辞
60
本資料の作成に当たり多大なる支援をしてくださった方々に
感謝の意を表します。
(順不同)
・井上 茂
・村井 剛
・西村 将利
・谷口 貴之
・丹羽 雪晴
・All OWASP Nagoya Staff
・坂梨 功典
・加藤 人生
・清水 健吾
・浅田 竜起

OWASP WordPressセキュリティ実装ガイドライン (セキュアなWordPressの構築)