WordPressサーバのセキュリティ強化

WordPressサーバのセキュリティの強化を図ります。主に、インターネットからの不正アクセス対策を行います。

サーバアクセスのセキュリティ強化

公開サーバは、インターネット上に晒されているため、サーバセキュリティ対策は必須です。

SSHのセキュリティ強化

サーバの設定や制御を行うためにサーバにアクセスする主な手段は、SSHになります。SSHのセキュリティを高めることでサーバセキュリティを向上させます。

SSHサーバのログ確認

SSHサーバのログを確認します。

$ sudo less /var/log/secure
Jan  1 06:06:35 pubser001 sshd[22293]: Invalid user admin from 101.75.117.125 port 38643
Jan  1 06:06:35 pubser001 sshd[22293]: input_userauth_request: invalid user admin [preauth]

ログを見ると、ひっきりなしに不正アクセスが試みられているようです。SSHの不正アクセスに対するセキュリティ対策としては、以下の対応があります。

  • パスワードでのログインを禁止し、鍵認証でのログインのみ許可する。
  • rootユーザでのログインを禁止する。
  • SSHのポート番号を変更する。

根本的対応として、上から2つ目までの対応を初期のサーバ構築時に実施済みですが、追加でポート番号の変更を行い、不正アクセスの削減を図ります。

SSHサーバのポート番号の変更

SSHサーバのポート番号をデフォルトの22から2222に変更します。まず、firewalldで2222番のポートへのアクセスを許可します。

$ sudo firewall-cmd --add-port=2222/tcp --zone=public --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all --zone=public | grep tcp

次に、SSHサーバの設定を変更して、SSHサーバのポート番号を変更し、設定ファイルを再読込します。

$ sodo vi /etc/ssh/sshd_config
#Port 22
Port 2222
$ sudo systemctl reload sshd

22番ポートでアクセスできず、2222番ポートでアクセスできることを確認します。

$ ssh -l admin001 lab4ict.com
ssh: connect to host lab4ict.com port 22: Connection refused
$ ssh -p 2222 -l admin001 lab4ict.com
$

サイトアクセスのセキュリティ強化

サイトアクセスのセキュリティ強化として、以下の対応を実施します。Qualys SSL LABSの「SSL Server Test」のサイトでテストを行い、根気よく一つ一つ対策を打つのがよさそうです。

  • サイトアクセスのHTTPS化
  • 不正なサーバ証明書の発行防止(DNS CAA)
  • SSL/TLSプロトコルの制限
  • 暗号化方式(Cipher Suite)の削除
  • 暗号化方式(Cipher Suite)の追加

サイトアクセスのHTTPS化

サイトアクセスを全てHTTPSで暗号化することにより、通信内容の漏えいと改ざんを抑止することができます。サイトのHTTPS化は、本サイトの手順では、Let’encryptの導入により、サーバの初期構築時に対応済みです。

不正なサーバ証明書の発行防止(DNS CAA)

サーバ証明書を発行する認証局をDNSで指定することにより、他の認証局で不正なサーバ証明書が発行されることを防ぐことができます。Sakura InternetのDNSでは、CAAレコードを登録することができます。

DNS1レコード種別 設定値(例)
CAA 0 issue “letsencrypt.org”
CAA 0 iodef “postmaster@lab4ict.com”

SSL/TLSプロトコルの制限

SSL/TLSのプロトコルをTLS1.2のみに制限します。

$ sudo vi /etc/httpd/conf.d/ssl.conf
#SSLProtocol all -SSLv2
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
$ sudo systemctl stop httpd.service
$ sudo systemctl start httpd.service
$ sudo systemctl status httpd.service

opensslコマンドで管理用のPCからテストします。

$ openssl s_client -connect lab4ict.com:443 -ssl3
$ openssl s_client -connect lab4ict.com:443 -tls1
$ openssl s_client -connect lab4ict.com:443 -tls1_1
$ openssl s_client -connect lab4ict.com:443 -tls1_2

暗号化方式(Cipher Suite)の削除

脆弱性が指摘されている暗号化方式(Cipher Suite)を削除します。RC4暗号の使用を不可に設定します。

$ sudo vi /etc/httpd/conf.d/ssl.conf
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4
$ sudo systemctl stop httpd.service
$ sudo systemctl start httpd.service
$ sudo systemctl status httpd.service

opensslコマンドで管理用のPCからテストします。

$ openssl s_client -connect localhost:443 -cipher RC4-SHA

暗号化方式(Cipher Suite)の追加

強度の強い暗号化方式(Cipher Suite)を追加します。Forward Securityを使用可にして、暗号化方式を全面的に見直して設定します。

$ sudo vi /etc/httpd/conf.d/ssl.conf
#SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
#SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"
...
SSLHonorCipherOrder on
$ sudo systemctl stop httpd.service
$ sudo systemctl start httpd.service
$ sudo systemctl status httpd.service

opensslコマンドで管理用のPCからテストします。

$ openssl s_client -connect localhost:443 -cipher ECDHE-RSA-AES256-GCM-SHA384

サイト管理機能のセキュリテイ強化

サイトの管理機能への不正アクセスを防止するため、クライアント証明書を保持している管理者のみがサイトの管理機能のURLにアクセス可能にします。

クライアント証明書によるアクセス制御

クライアント証明書を使用すると、クライアント証明書を持っていない人以外は、サイト管理のURLにアクセス不可にすることができます。

独自の認証局の構築とクライアント証明書の発行

少し大変ですが、独自の認証局を構築してクライアント証明書を発行します。クライアント証明書の発行方法は、「認証局の構築と電子証明書の発行(OpenSSL)」を参照してください。

サーバ側の設定

独自の認証局の証明書を格納したPEM形式のファイルを転送して配置します。(/tmp/ca-lab4ict.pemにPEM形式ファイルを転送後の例)

$ sudo cp /tmp/ca-lab4ict.pem /etc/pki/tls/certs/ca-lab4ict.pem
$ sudo ls -l /etc/pki/tls/certs/ca-lab4ict.pem

Apacheの設定を変更して、「https://lab4ict.com/system/wp-admin/」以下のページにはクライアント証明書なしでアクセスできないように設定します。

$ sudo vi /etc/httpd/conf.d/ssl.conf
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
SSLCACertificateFile /etc/pki/tls/certs/ca-lab4ict.pem
...
<Location /system/wp-admin>
SSLVerifyClient require
SSLVerifyDepth  3
</Location>
$ sudo systemctl stop httpd.service
$ sudo systemctl start httpd.service
$ sudo systemctl status httpd.service

サイト利用のセキュリティ強化

WordPressサイトのセキュリティ対策でまず必要となるのは、コメントスパム対策です。本サイトでは、必要なページのみ後からコメントを受付ける設定が行えるように、デフォルトではコメント欄を表示しない設定にしています。

おわりに

本稿では、WordPressサーバおよびサイトのセキュリティ強化を行いました。次はサイトのアクセス分析を行う体制を整えます。続きは、以下の記事にお進みください。