WordPressとリスク管理 at 第42回 WordBench大阪

46
WordPress のののののの 2015 の 6 の 13 の の 42 の WordBench のの のの ののKITANI Kimiya @kimipooh のののののののののののの

Transcript of WordPressとリスク管理 at 第42回 WordBench大阪

WordPress のリスク管理2015 年 6 月 13 日 第 42 回 WordBench 大阪

木谷 公哉( KITANI Kimiya ) @kimipooh

京都大学東南アジア研究所

@kimipooh IT よろず屋(大学教員)

ヘルプディスク、コンサルティング、コーディネーター コンテンツマネージャー、ネットワーク管理、サーバー管理 データベース開発

リアル出没先 WordBench 京都 WordBench 大阪

オンライン上 Gmail ヘルプフォーラム Google Apps for Work ヘルプフォーラム

WordPress との関わりあい 出会い

2010 年 7 月 9 日  オープンソースカンファレンス 2010 Kansai@Kyoto

WordPress でのサイト構築 2012 年 4 月 5つ同時立ち上げ

WordPress コミュニティ 2012 年 5 月 第 5 回 WordBench 京都 2012 年 7 月 第 7 回 WordBench 京都でスピーカー(プラグインの公式リポジトリ登録) 2013 年 1 月 第 13 回 WordBench 大阪 2013 年 5 月 第 17 回 WordBench 大阪でスピーカー(昔の WordPress をインストールした

よ!)

プラグインと本体のアップデートが管理パネルから容易に出来る

16 サイト(公開 13 )

まず最初に

100% 安全!!

そんなシステムありません

リスクとは 改ざん(加害者は誰だ!)

ログインされて・・・ 脆弱性を攻撃されて・・・ 内部攻撃されて・・・ 初期化されて・・・( wp-admin/

install.php 消し忘れ・・・) 動作不安定

システムをアップデートしたら真っ白に・・・

テーマ変更したら真っ白に・・・ データ破損

文字化け・・ 複数人が打ち合わせなく作業して・・・

情報漏洩 うっかり公開

/◯◯/ のアクセスでフォルダ丸見え( Directory Index )

利用メーリングリストが公開されちゃってた・・

盗聴 パスワード盗聴(ログインが非暗号) 管理データ・パスワードロックデータ(非暗

号)

端末感染 添付ファイル(ウィルス)付きメールを開

いた・・ ウェブサイトを開いたら・・・

本当に攻撃はしてくるのか4 月の エラーログ( 7,738) 件数Directory index forbidden 20

/trackback/ 92

File name too long 24

PHP Fatal error(Cannot redeclare class PHPMailer)

30

File does not exist 28

PHP Warning 71

PHP Notice (Use of undefined constant) if ($lang == ja) …. × if ($lang === ‘ja’) … ◯

114

Client denied 7,574 (97.9%)

┣ xmlrpc.php 74

┣ wp-login.php 3,077 (39.8%)

┣ /wp-admin/ 57

┣ themes/**/images/…jpg 4,255

┗ /…/ or /wp-content/…/ 等 111

本当に攻撃はしてくるのか

4 月のログ( wp-login.php ) ブロック件数総計(クライアント数 : 90 ) 3,077

ウクライナ (5) 648

中国 (3) 183

韓国 (2) 120

香港 (1) 60

本当に攻撃はしてくるのか

Crazy Bone プラグイン全く攻撃を受けないことは珍しい

過去の WordPress を振り返ると

テーマでみる WordPress の歴史

昔を懐かしむ – セキュリティ関連フィックス -

テーマでみるWordPress の歴史

テーマ履歴 2003.05.27 初期( 0.71-gold 〜 1.0-platium ) 2004.05.22 WordPress Classic ( 1.2-delta 〜 ) 2005.02.17 KUBRCK ( 1.5-strayhorn ) 2010.06.17 Twenty Ten ( 3.0 〜)

WordPress と WordPess MU 統合

2011.07.05 Twenty Eleven ( 3.2 〜) 2012.12.12 Twenty Twelve ( 3.5 〜) 2013.08.02 Twenty Thirteen ( 3.6 〜) 2013.12.14 Twenty Fourteen ( 3.8 〜) 2014.12.19 Twenty Fifteen ( 4.1 〜)

テーマも刷新されていく

昔を懐かしむ - セキュリティ関連フィックス -

0.71-gold

PHP5.3 以降では動作しない( $HTTP_GET_VARS 利用) DB 作成時に「 utf8_unicode_ci 」を明示設定必要

1.0-platinum

ログインパスワードの非暗号 1.2-delta

PHP5.4 以降対応( $HTTP_GET_VARS → $_GET ) ログインパスワードの暗号( MD5 ハッシュ)

2.2

DB_CHARSET, DB_COLLATE ( DB 照合順序)追加 wp-config.php

完全な ATOM フィードが追加 2.3

プラグインを含むアップデート通知機能(ダッシュボード) 2.6

初期パスワードの強固化( 7 文字、英数字(大文字小文字含む)) → 12 文字、英数字(大文字小文字含む)、記号

secret-key が導入( wp-config.php ) 2.7

secret-key が強化( SALT が追加) 2.8

テーマのインストールが可能に

3.0

WordPress と WordPress MU の統合 インストール時に、管理者ユーザーとパスワード

を変更できるように 3.2

動作環境:PHP5.2.4 /MySQL 5.0 以降 IE6 のサポート終了

3.5

XML-RPC が既定で有効化(無効設定が消えた) 3.6

自動保存機能の追加 投稿ロック機能

3.7

本体、翻訳ファイルの自動アップデート機能 4.0

多言語切り替えが容易に FORCE_SSL_LOGIN の廃止

( FORCE_SSL_ADMIN として動作) オレオレ証明書( SSL自己証明書)の場

合、 JetPack 連携できないように・・・ 4.2

絵文字対応

気づかないからこそ対策が必要

③リスク予防

②証跡管理

①サイト復元

WP 管理者が出来る範囲で・・・

①サイト復元

とりあえずは・・・

自動バックアップシステムを構築しよう!

ちゃんと復元できますよね!?

WordPress の基本構成

WordPress

データベース( MySQL )

システム

テーマ

プラグイン 表示

バックアップ対象は上記2つ

データ(設定)

設定wp-config.php

バックアップの自動化- WP-DBManager編 -

データベースのバックアップのみ可能

復元も簡単

バックアップの自動化- BackWPUP編 -

データベースとファイル/フォルダのバックアップ デフォルト:wp-content/uploads/backwpup-◯◯-backups/

復元は手動 データベースを復元 ファイル/フォルダの復元

バックアップ先の選択

1. 異なるデバイスに保存2. 二箇所以上に・・・

1. 別ハードディスク2. 外部ハードディスク3. クラウド

4. サーバー自体のバックアップ

②証跡管理

ログイン履歴を残す Crazy Bone

管理者のみ

③リスク予防

基本セキュリティのおさらい WordPress (動的に HTML コードを生成し表示)

システム(ログイン、管理データ) プラグイン テーマ データ(データベース)

サーバー OS

ウェブシステム( +PHP ) データベーシステム( MySQL ) リモートアクセス

クライアント(ウェブ編集者・管理者)

③リスク予防

1. システムアップデート

2. ログイン制限

3. 外部認証システムの活用

4. サイト管理画面の暗号化

5. アーカイブサイトの静的 HTML 化

6. その他プラグインの活用

1. システムアップデート

システム 自動アップデート

プラグイン 自動アップデート

公式プラグイン

テーマ 自動アップデート

公式テーマ 公式テーマをベースに子テーマ構成

サイトへのアクセスで発動

発動しないことがある

ローカルページ

バックアップ…

2. ログイン制限①初期ユーザーの変更

「 admin 」 を使っていたら変更するか削除しましょう 「 root 」などいかにも管理者ユーザーっぽいのは避けましょう

3.0 以降は初期セットアップ時に初期管理者ユーザー名を変更可

2. ログイン制限② IP / ホスト制限 wp-config.php (システム環境ファイル)

wp-login.php (ログイン)

/wp-admin/ (管理画面)

xmlrc.php ( XML-RPC を利用した投稿)

Apache のケースで紹介

ウェブサーバーが、 .htaccess の設定を許可している場合に限る

2. ログイン制限② IP / ホスト制限

<Files ‘wp-config.php’> deny from all</Files>

wp-config.phpへの制限 ( .htaccess )

このファイルには DB アクセス情報が入っている

2. ログイン制限② IP / ホスト制限

<Files ‘wp-login.php’> Order Deny, Allow Deny from all Allow from 127.0.0.0/8 Allow from uqwimax.jp </Files>

wp-login.phpへの制限 ( .htaccess )

「 IP アドレスチェック」で接続端末のインターネットから見えるグローバル IP アドレスとクライアントホスト名をチェック

プロバイダ全体でも効果あり

ログイン制限による予防② IP / ホスト制限

<Limit GET POST> Order Deny, Allow Deny from all Allow from 127.0.0.0/8 Allow from uqwimax.jp </Limit>

<Files 'admin-ajax.php'>

Order Allow,Deny Allow from all Satisfy any

</Files>

/wp-admin/への制限 ( wp-admin/.htaccess )

テーマ / プラグインによって、制限で動作しなくなる可能性の排除

WordPress Codex 日本語版 http://wpdocs.osdn.jp/ ブルートフォース攻撃

2. ログイン制限② IP / ホスト制限

<Files ‘xmlrpc.php’> Order Deny, Allow deny from all

allow from jetpack.wordpress.com

allow from 192.0.0.0/255.255.0.0

</Files>

xmlrpc.phpへの制限 ( wp-admin/.htaccess )

JetPack 対策

wp-config.php add_filter('xmlrpc_enabled','__return_false'); Pinback は防げない

SiteGuard WP Pluginや WP Total Hacks プラグイン等のプラグインによるピンバックブロック機能も使えるかも

2. ログイン制限② IP / ホスト制限xmlrpc.phpへの制限 ( wp-admin/.htaccess )

WordPress 上でサイトのリンクを貼る

リンク元に通知( pingback )

リンク元に通知( pingback )

サイトのリンクを記事に貼りまくれ!!(確保した大量の WordPress サイト)

コメント欄にも通知

コメント欄に記事リンクが掲載(承認)

攻撃者

コメント欄に記事リンクが掲載(承認)

過負荷でアクセスできない

Pingbackチェック: http://labs.sucuri.net/?is-my-wordpress-ddosing

Google から API Key を入手 https://console.developers.google.com

Client ID, Secret キーを取得 Google Apps Login プラグインを導入

Client ID, Secret キーを入力

3. 外部認証システムの活用( Google アカウント編)

http://kitaney-google.blogspot.jp/ で「 WordPress 」検索

ユーザー名もパスワードも教えない

よりセキュアな外部認証を使える

4. サイト管理画面の暗号化 サイトまるごと暗号化( http:// https:// )

設定( WordPress アドレス、サイトアドレスを https:// ) リダイレクト設定

特定ページのみ暗号化(お問い合わせフォームのみとか) サイト管理画面のみ暗号化

( http://◯◯/wp-admin/ https://◯◯/wp-admin/ ) wp-config.php に、 define(‘FORCE_SSL_ADMIN’, true); を追加

サーバーが対応していて、 https://◯◯/wp-admin/ でもアクセスできるようになっていることが前提

オレオレ証明書( SSL自己証明書)  jetpack 連携できないよ〜

5. アーカイブサイトの静的 HTML 化 もう誰もログインしないけれど、アーカイブはしておきたい

終了したプロジェクトのウェブサイト等

いつまでもやっていられない

WordsPerss のアップデート

データベースの脆弱性

5. アーカイブサイトの静的 HTML 化  StaticPress プラグイン編

事前テストができる パーマネント設定なら、フォルダ構造も引き継がれる

http://localhost:8888/wordpress/wordpress/static/

6. プラグインによる予防 自動バックアップ

BackWPUP (データベース・ファイルすべて) WP-DBManager (データベースのみ、復元も可能)

診断 AntiVirus (簡易テーマ / テンプレートチェック) Theme Check (テーマチェック) Exploit Scanner ( WordPress システム改ざんチェック)

( https://github.com/philipjohn/exploit-scanner-hashes) Broken Link Checker (コンテンツ内のリンク切れチェック)

自動更新 WP-CLI (コマンドラインから WordPress を管理)

履歴管理 Crazy Bone (ログイン、ログアウト履歴管理)

暗号化 WordPress HTTPS (非推奨)

6. プラグインによる予防 防衛

SiteGuard WP Plugin

/wp-admin/へのアクセス制限、ログイン対策、スパム対策、 WAF 、ピンバック無効等 Login Security Solution

総当たり攻撃防衛、パスワード強度設定 Acunetix WP Security

不必要な情報開示を回避 User Role Editor

ユーザーごとの細かいアクセス権限設定 Google Apps Login

Google アカウント認証を用いたログイン強化 Gianism

Facebook, Twitter 等 SNS を用いたログイン強化 Force Email login

メールアドレスをユーザー名の代わりに強制することでログイン強化 All In One WP Security & Firewall

多機能セキュリティ対策 WP Total Hacks

ピンバックをブロック(セルフピンバック含む)

付録 – プラグイン利用方法

AntiVirus 簡易テーマ / テンプレートチェック

Exploit Scanner WordPress システム改ざんチェック

Acunetix WP Security 不必要な情報開示を回避と問題点

AntiVirus

データベーステーブルのチェック テンプレートファイルのチェック

Iframe まわりを検出する Google Safe Browsing でのチェック

Exploit Scanner

https://github.com/philipjohn/exploit-scanner-hashes

利用している WordPress バージョン用のMD5 checksum ( hashes- バージョン .php )が必要

1.4.4 = WordPess 3.1.7 - 4.2.1 (英語版) 最新:

4.2.2

参照: [閉 ] WordPress 日本語版用 Exploit Scanner ハッシュファイル https://ja.forums.wordpress.org/topic/2743?replies=20

1. 4.2.2 英語版の利用

2. 自分で作る

Exploit Scanner

https://github.com/philipjohn/exploit-scanner-hashes

hashes-generator.php

$latest = 'https://ja.wordpress.org/wordpress-4.2.2-ja.zip';$file = 'wordpress-4.2.2-ja.zip';

日本語版ダウンロード: https://ja.wordpress.org/releases/#latest

①ハッシュジェネレータのダウンロード

②ハッシュジェネレータの書き換え

③ハッシュジェネレータの起動&作成ファイルの MD5値をメモphp hashes-generator.php > hashes-4.2.2.php

③ハッシュを Exploit Scanner プラグインフォルダへ移動hashes-4.2.2.php を移動

④Exploit Scanner の認識を確認MD5 of hashes-4.2.2.php の値と、 md5 hashes-4.2.2.php の値の一致確認

md5 hashes-4.2.2.php

Exploit Scanner1. ターミナルアプリ起動2. cd ~/Desktop && mkdir exploit-scanner-dev3. cd ~/Desktop/exploit-scanner-dev4. curl –O https://raw.githubusercontent.com/philipjohn/exploit-

scanner-hashes/master/hashes-generator.php5. open –a textedit hashes-generator.php

6. php hashes-generator.php > hashes-4.2.2.php7. md5 hashes-4.2.2.php

8. hashes-4.2.2.php を、 wp-content/plugins/exploit-scanner/ へ

9. 確認

$latest = 'https://ja.wordpress.org/wordpress-4.2.2-ja.zip';$file = 'wordpress-4.2.2-ja.zip';

日本語版ダウンロード: https://ja.wordpress.org/releases/#latest

MD5 (hashes-4.2.2.php) = 6214151dc39b725871bb7e76355afb40

Acunetix WP Security

過去の問題 Secure WordPress からの名称変更した際に、アップデート時

に「プラグインが停止したとエラー」 再度有効化すれば OK

Secure WordPress 2.0.2 利用時に、 WordPress 3.2.1へアップグレードすると、サイトが止まる

exist signal Segmentation fault が… PHP の JSON拡張仕様変更によって、いくつかのライブラ

リファイルが削除され、それを必須としたプラグイン側がハングした。

Acunetix WP Security - Settings-

Hide WordPress version for all users but administrators

Remove various meta tags generators from the blog's head tag for non-administrators

Try to create the index.php file in the wp-content, wp-content/plugins, wp-content/themes and wp-content/uploads directories to prevent directory listing

Remove the version parameter from urls

Empty the content of the readme.html file from the root directory

最後に・・・

WordCamp Kansai 2015 coming soon..

日時: 2015 年 7 月 25 日(土) - 26 日(日) 場所:大阪大学豊中キャンパス 大阪大学会館 参加費:無料

Get Involved進化を続ける未来に出会おう