こんにちは。HASHコンサルティングの一ノ瀬太樹です。
前回の記事では「弊社のWordPressに対する取り組み(by HASHコンサルティング 松本)」について書かせて頂きました。
HASHコンサルティングでは日々増えていくWordPressサイトのセキュリティ対策に貢献するべく、
WordPressサイトのセキュリティ強化支援サービスを展開させて頂いております。
https://www.hash-c.co.jp/service/wordpress_security/
さて、このブログを読んでいる方の中には既にご存知の方もいらっしゃると思いますが、 弊社は2016/9/30にコーポレートサイトをリニューアルしています。
https://www.hash-c.co.jp/
そして、リニューアルされたコーポレートサイトでは
皆様の人柱となるために WordPressが利用されているのです!
今回の記事では弊社で実際に採用しているCentOS7環境でのWordPressのセキュリティ施策について触れたいと思います。
HASHコンサルティングで採用している施策
弊社で実施しているWordPressに対する施策は大きく次の通りです。
- 適時のアップデート
- 管理画面のアクセス制限
- 二段階認証
- 書き込みディレクトリの実行制限
- SELinux
- WAF
- 改ざん検知
以降は基本的な施策を踏まえ、それぞれの施策について記載します。
基本的な施策
WordPressのセキュリティ対策を考えるうえで重要になるのは、次の3点です。
- 常に最新版のWordPressやテーマ、プラグインを利用する(もちろんOS・ミドルウェアも!)
- 実績が多く、適時メンテナンスされているテーマやプラグインを選択する
- 適切なアカウント管理をする
これらは必須対策と言っても過言ではありません。そして、この3点が重要になる理由は次の通りです。
- 古いWordPressには既知の脆弱性が存在する(もちろんOS・ミドルウェアも!)
- テーマやプラグインは危険な脆弱性が含まれていることが多い
- 脆弱性が存在しなくてもログインを許せば乗っ取られてしまう
既知の脆弱性には攻撃方法が公開されているものも存在します。適時のアップデートは不具合が発生するリスクも存在しますが、セキュリティファーストの考え方から最も重要な施策です。
WordPress本体は力量の高いメンバーが開発しており、また広く利用されていることから、多くの人のチェックが行われています。
それに対してテーマやプラグインは個人開発である場合も多く、結果として脆弱性が作り込まれやすくなります。
利用者は脆弱性が発見された場合でも素早く対応しているテーマやプラグインを選択する必要があるのです。
また、使わないプラグインは無効化ではなく「削除」することも重要です。 脆弱性が存在するプラグインは、無効化されていたとしても外部からの直接起動で悪用される危険性があります。
適切なアカウント管理も忘れてはいけません。脆弱なパスワードが使用されていないか、不要なアカウントが残っていないかなど定期的な棚卸が重要です。
弊社ではOS・ミドルウェア・WordPressの適時のアップデートに加え、二段階認証や管理画面へのIPアドレス制限を行っています。また、CentOS7で利用するパッケージに関しては運用管理の容易性から全て標準リポジトリのものを利用する方針で設計しています。
OS・ミドルウェアからセキュリティを強化する
一口にWordPressの設定と言っても、WordPressの設定ファイルであるwp-config.php
だけに注目すればよいわけではありません。 自前でWordPressをインストールしているならば、ファイルシステムやミドルウェアを含めたセキュリティ施策も重要になります。
WordPressは単なるPHPプログラムの集合群ですから、利用者はそれらPHPプログラムの動作範囲を適切にコントロールする必要があります。
コントロールしなければならない部分の一例として、ファイルアップロード機能があります。通常"wordpress/wp-contents/uploads"
ディレクトリのようにアップロードされたファイルを保存する場所はhttpdからの書き込みが許可されています。
WordPressの初期設定を行っただけの状態で、この場所に次のような.phpファイルを置いて外部から参照した場合どうなるでしょうか。
<?php phpinfo();
phpinfo();
が実行され、Webサーバーの設定情報が確認できることは想像に難くありません。そして、これが遠隔操作プログラム(いわゆるWebShell)だった場合には任意のコマンドが実行できます。
この例は通常管理者のみ実施可能な操作ですが、WordPress本体やテーマ、プラグインの脆弱性を悪用されてファイルをアップロードされたり、ファイルを作成されてしまう可能性を想定しておく必要があります。
では、どのように対策をすればよいのでしょうか。この様な事象に対しては、書き込みを許可しているディレクトリで.phpファイルが実行できないようにWebサーバー側で対処するという方法があります。Apache HTTPDではHandlerでPHPを実行できないようにする事などが対策になります。
とはいうものの、最近のWordPressではデフォルトでマイナーアップデートの自動更新が有効ですから、全ての書き込み可能なディレクトリでPHPの実行を制限することが困難だという現実もあります。
SELinuxのすすめ
そこであわせてお勧めするのが、弊社でも導入しているSELinux
です。
サーバーをセットアップする際、最初に停止されることで定評(?)のあるSELinux
ですが、WordPressの動作をコントロールする上では有用です。
そもそもSELinux
とは何でしょうか。SELinux
は「強制アクセス制御」を行うためのセキュリティ拡張機能です。強制アクセス制御を実現しますから、正しく設定を行うことによってroot特権すらもコントロールすることができます。
ファイルシステムのパーミッションのみではなく、最小権限の原則に基づいてhttpdプロセスからのアクセス制御を細かく制限することによりアクセスコントロールを強化します。
SELinuxの導入で何ができるか
前述の通りSELinux
はプロセスレベルのアクセス制御を提供します。Webサーバーからのメール送信やネットワーク経由のDB接続に関するコントロール、httpdから読み込み可能なファイルの指定、ファイル書き込みを許可するスクリプトファイルの指定等を行うことができます。
たとえば、WordPressのプラグインにファイル書き込みが可能な脆弱性があった場合でも、あらかじめSELinux
のポリシー設定で該当プラグインにファイル書き込み禁止のポリシーを適用しておくことで攻撃を防御することが可能です。
たとえば、SELinux
では"httpd_sys_content_t"というタイプのコンテキストをファイルやディレクトリに設定することで、httpdに対して読み込みに限定した許可を設定することができます。コンテキストの設定はpolicycoreutils-python
パッケージに含まれるsemanage
コマンドを利用すると便利です。
また、次のコマンドでは現在指定されているコンテキストが確認できます。
# 現在の値を確認
$ ls -dZ /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
# 設定ポリシーを確認
$ sudo semanage fcontext -l | grep "/var/www"
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
出力結果から"httpd_sys_content_t"と記載されていることがわかります。
コンテキストは":"で区切られており、"ユーザー:ロール:タイプ:セキュリティレベル"の順で記載されています。
WordPressにSELinux
を適用する場合ではコアファイルによるテンポラリーファイルの作成や画像のアップロードなどが想定されるため、コアファイルにスクリプト実行権限を与え、ファイルを読み書きするディレクトリには書き込み権限を与える必要が出てきます。
まとめると下記の組み合わせにより、より強固なセキュリティを実現できるということです。
- スクリプトファイルを設置しないディレクトリでスクリプト実行を無効化
SELinux
によるアクセス制限を設定
SELinuxの副作用
SELinux
は非常に強力ですが、SELinux
により最小権限の原則を実現することで問題になる部分があります。それは、WordPressの自動アップデートです。SELinux
はスクリプトからの書き込みを制御することができますが、厳しく制御してしまうと、一種のスクリプトである自動アップデート機能も制限を受けてしまいます。スクリプトからの書き込みを禁止するということは、同時にスクリプトを利用したファイル更新も制限することになるからです。
弊社では、この問題をwp-cli
を利用することで解決しています。wp-cli
はWordPressを管理するためのコマンドラインツールです。設定変更やアップデートをブラウザにアクセスすることなく実行することが出来ます。SELinux
ではプロセスレベルで制限をかけて、wp-cli
を利用したローカルアクセスを許容することで解決します。
WAF
弊社のサイトではウェブアプリケーションファイアウォール(以後WAF)を導入しています。WAFはアプリケーションに存在する脆弱性へ防御機能を提供するものです。あらかじめ用意されている膨大なシグネチャ(ブラックリスト・ホワイトリスト)を利用してサイトに合わせたカスタマイズを行うことで、攻撃を検知して遮断することが出来ます。また、有名な攻撃に対しては専用のシグネチャが提供されることが多く、自分でルールを作成することもできます。
WAFのメリットは安全性の底上げと脆弱性対策の容易性確保です。クロスサイト・スクリプティングやSQLインジェクションなどの脆弱性に関しては多くの場合に既存のシグネチャで防御できます。新たな脆弱性に関してもシグネチャの更新のみで対応可能なことが多いです。
改ざん検知
適時のアップデートを実施し、ファイルシステムとSELinux
を組み合わせたアクセス制御と共にWAFによる防御を行っていたとしても、攻撃を受けてしまう可能性を完全に排除することはできません。そこで、ファイルの作成や書き換えが発生した場合に状態変化を検知する仕組みとして弊社ではinotify
を利用した改ざん検知を行っています。
inotify
はLinuxカーネル2.6.13から組み込まれた機能です。カーネル上で動作するため比較的高速に動作します。
inotify
を活用するためにはinotify-tools
を利用することが多いと思いますが、現時点でCentOS7の標準リポジトリには含まれていません。そこで、弊社ではpyinotify
というPythonのライブラリを利用して改ざん検知用のスクリプトを作成し、systemd
によるデーモン化を行っています。検知ログに関してはsyslogへの出力も実施していますが、同時にslack通知を行うことでログが埋もれないようにしています。
万が一の事態に備えて迅速な検知を行うことは、攻撃兆候の発見に繋がります。結果として実際に攻撃される前に対処できる場合もあるため、改ざん検知は重要な施策になります。
HASHコンサルティングのミッション
私たちのミッションは、増え続けるサイバーセキュリティの課題に対して本質的な解決策を提供することです。
HASHコンサルティングのサービスではこれらの施策を含めたご提案も実施致します。みなさまのWordPressサイトのセキュリティ強化に貢献できるよう日々精進いたしますので、今後ともよろしくお願いいたします。
なお、サービスの詳細につきましては、弊社公式サイトの以下のページをご参照ください。
WordPressサイトのセキュリティ強化支援サービス
https://www.hash-c.co.jp/service/wordpress_security/