2015年2月26日木曜日

WordPressのセキュリティ対策(2)

【4.SSL化】
サイトをSSL化することでパスワードの漏洩など防ぐことができます。
また、常時SSL化することでSEO効果があるそうです。
https://don2.net/sem/ssl-seo/

試しに自己証明書を作成してサイト全体をhttps接続にしたいと思います。

①OpenSSLのインストール
OpenSSLをダウンロードし解凍します。
# cd /usr/local/src/

# wget http://www.openssl.org/source/openssl-1.0.2.tar.gz

# tar xzf openssl-1.0.2.tar.gz


解凍したフォルダに移動し、インストールしていきます。
# cd openssl-1.0.2

# ./config

# make

# make install


これでOpenSSL自体のインストールが完了しました。

②自己証明書の作成
次に、専用のディレクトリを作成して自己証明書を発行していきます。
# mkdir /var/lib/ssl

# cd /var/lib/ssl


秘密鍵を作成します。
# openssl genrsa -out private.key -aes256 1024

Generating RSA private key, 1024 bit long modulus

........................++++++

................++++++

e is 65537 (0x10001)

Enter pass phrase for private.key:パスフレーズ

Verifying - Enter pass phrase for private.key:パスフレーズ


genrsa:RSA形式の秘密鍵を作成する
-aes128:128ビットのAES方式で暗号化する
1024:1024バイトの鍵を作成する

公開鍵を作成します。
# openssl req -new -key private.key -out server.csr

Enter pass phrase for private.key:パスフレーズ

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [XX]:JP

State or Province Name (full name) []:Tokyo

Locality Name (eg, city) [Default City]:Shinjuku

Organization Name (eg, company) [Default Company Ltd]:社名など

Organizational Unit Name (eg, section) []:所属部署など

Common Name (eg, your name or your server's hostname) []:ドメイン

Email Address []:スルー

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:スルー

An optional company name []:スルー


req:CSRファイルを作成する
-new:新規にCSRを作成する
-key 秘密鍵ファイル:秘密鍵のファイル名を指定する

デジタル証明書を作成します。
# openssl x509 -in server.csr -days 3650 -req -signkey private.key -out server.crt

x509:X509形式のデジタル証明書を作成する
-in CSRファイル:CSRファイル名を指定する
-days 日数:証明書の有効期限を指定する
-req:入力ファイルがCSRファイルであることを指定する
-signkey 秘密鍵ファイル:秘密鍵ファイルを指定する

③mod_sslの設定
ApacheでSSL暗号化通信を実行するにはmod_sslモジュールが必要です。

mod_sslモジュールがインストールされているか確認します。

# yum list installed mod_ssl

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

Could not get metalink https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=x86_64 error was

14: problem making ssl connection

 * base: ftp.iij.ad.jp

 * centosplus: ftp.iij.ad.jp

 * elrepo: ftp.ne.jp

 * epel: ftp.riken.jp

 * extras: ftp.iij.ad.jp

 * rpmforge: mirror.fairway.ne.jp

 * updates: ftp.jaist.ac.jp

Error: No matching Packages to list


インストールされていないようなので、インストールします。
# yum list install mod_ssl

インストールが完了すると/etc/httpd/conf.dにssl.confが生成されます。
秘密鍵とデジタル証明書を指定します。
# cd /etc/httpd/conf.d

# vi ssl.conf

SSLCertificateFile /var/lib/ssl/server.crt

SSLCertificateKeyFile /var/lib/ssl/private.key

Apacheを再起動します。
# /etc/init.d/httpd restart

④WordPress HTTPSの設定
最後にプラグインを使用してサイト全体をSSL化します。
WordPressの管理画面から「WordPress HTTPS」をインストールし、左メニューからHTTPSをクリックします。





















サイト全体をSSL化したいので
1.Force SSL Administration 管理画面をSSL設定
2.Force SSL Exclusively 個別ページにSSL設定
それぞれにチェックします。
3.URL Filtersで「/」を入力しルート以下でSSL通信を行うように設定します。

保存したらサイトを確認してみます。














オレオレ警告が出ていますが、SSL接続できていることが確認できました。
以上です。

2015年2月25日水曜日

WordPressのセキュリティ対策(1)

【1.Basic認証】
開発段階などで、WordPressをクローラーにインデックスされたくない場合、サイト全体にBasic認証を設定することでそれを回避できます。

プラグイン-新規追加よりBasic Authentication Settingをインストールし、プラグインを有効化します。


















設定-一般の下のほうに、BASIC認証のパスワードを設定する箇所があるので、記述して保存します。


















サイトにアクセスするとBasic認証が実行されているのがわかります。
非常に簡単にBasic認証を実装することができました。






















【2.Digest認証】
管理画面(/wp-admin/)にはDigest認証を導入したいと思います。
Digest認証を導入することで、ログインを含めて2段階認証となりセキュリティを高めることができます。
BASIC認証との主な違いは、BASIC認証が入力したIDパスワードを平文で通信するのに対し、Digest認証は暗号化して通信するのでネットワークの盗聴などに強いという点です。

プラグインが見当たらなかったため、実装していきます。

以下では/var/www/wordpress/wp-adminにアクセス制限をかけたいとします。

Apacheの設定ファイル(/etc/httpd/conf/httpd.conf)に以下の設定を追加します。

<Directory "/var/www/wordpress/wp-admin">

  AuthType Digest

  AuthName "Secret Zone"

  AuthDigestDomain /wp-admin/

  AuthUserFile /etc/httpd/.htdigest

  Require user secret

</Directory>


htdigestコマンドでsecretユーザーとパスワードを設定します。

# htdigest -c /etc/httpd/.htdigest 'Secret Zone' secret

Adding password for secret in realm Secret Zone.

New password:

Re-type new password:


Apacheを再起動します。

# /etc/init.d/httpd restart


管理画面にアクセスするとDigest認証が実行されているのがわかります。




















【3.ログイン試行回数の制限】
wp-login.phpへの総当り攻撃を回避するため、Simple Login Lockdownを使用することでログインの試行回数の制限ができます。

1.と同様にプラグインをインストールし、有効化します。

一般-表示設定より設定します。
下記の例では5回のログイン失敗で60分のログイン禁止という設定になります。
















LinuxへのWordPressのインストール(2)

LAMP環境ができたのでWordPressの設定に入ります。

【1.データベースとユーザー作成】
WordPressで使うデータベースとユーザーをMySQLに作成します。
# mysql -u root -p

Enter password:

mysql> create database wp;

Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on wp.* to wp@localhost identified by 'Kl-admin';

Query OK, 0 rows affected (0.00 sec)

【2.WordPressのインストール】
wgetで最新版をダウンロードします。
# cd /tmp

# wget http://ja.wordpress.org/wordpress-4.1.1-ja.tar.gz

--2015-02-25 16:15:09--  http://ja.wordpress.org/wordpress-4.1.1-ja.tar.gz

ja.wordpress.org をDNSに問いあわせています... 66.155.40.250, 66.155.40.249

ja.wordpress.org|66.155.40.250|:80 に接続しています... 接続しました。

HTTP による接続要求を送信しました、応答を待っています... 200 OK

長さ: 6634579 (6.3M) [application/octet-stream]

`wordpress-4.1.1-ja.tar.gz' に保存中



100%[========================================================>] 6,634,579    925K/s 時間 7.2s



2015-02-25 16:15:16 (900 KB/s) - `wordpress-4.1.1-ja.tar.gz' へ保存完了 [6634579/6634579]


ダウンロードしたファイルを解凍して、Apacheが読み込めるようにします。
tar zxvf wordpress-4.1.1-ja.tar.gz

wordpress/

wordpress/wp-mail.php

wordpress/wp-load.php

wordpress/wp-content/

wordpress/wp-content/themes/

~中略~

wordpress/wp-admin/options-reading.php

wordpress/wp-admin/press-this.php

wordpress/readme.html

d

# cp -r wordpress /var/www/

# chown -R apache.apache /var/www/wordpress

DocmentRootに関する設定を行い、設定内容を反映させます。
DocumentRoot "/var/www/wordpress" ← DocumentRootをWordPressのディレクトリに変更
<Directory "/var/www/wordpress"> ← DocumentRootと同じディレクトリに変更
     AllowOverride All ← .htaccessによるディレクティブの上書きを許可
</Directory>

# /etc/init.d/httpd restart

ここまでの設定でWordPressのダウンロードが完了しているので、あとはブラウザからインストールしていけばOKです。
が、






















なんかエラーでました。

# rpm -q php-mysql

パッケージ php-mysql はインストールされていません。


接続モジュールを入れ忘れていました。
というわけで入れなおしてApacheを再起動します。

# yum install php-mysql

# rpm -q php-mysql

php-mysql-5.3.3-40.el6_6.x86_64

# /etc/init.d/httpd restart






















今度はうまくいきました。
1.で作成したDB情報を入力します。






















インストールプロセスにしたがって必要項目を入力していきます。





















インストールが成功しました!


















以上です。

LinuxへのWordPressのインストール(1)

WordPress導入の手順をまとめておきます。
まずはWordPressを動かすのに必要なLAMP環境を構築します。

【1.Apacheのインストール・設定】
インストール実行
# yum -y install httpd

HTTPポート(80番ポート)を開放して外部からの接続を許可します。
# vi /etc/sysconfig/iptables

-A INPUT -i lo -j ACCEPT

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -s 192..168.0.1/32 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT ←ココ!

-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

-A OUTPUT -o lo -j ACCEPT


ファイヤーウォールの設定を反映します。
# /etc/init.d/iptables restart

iptables: ファイアウォールルールを消去中:                  [  OK  ]

iptables: チェインをポリシー ACCEPT へ設定中mangle filter n[  OK  ]

iptables: モジュールを取り外し中:                          [  OK  ]

iptables: ファイアウォールルールを適用中:                  [  OK  ]


Apacheを起動します。
# /etc/init.d/httpd start

httpd を起動中:  [  OK  ]



サーバー起動時にApacheを起動しておくよう設定します。

# chkconfig httpd on


【2.MySQLのインストール・設定】
インストール実行
# yum -y install mysql-server

MySQLを起動します。
# /etc/rc.d/init.d/mysqld start

MySQL データベースを初期化中:  Installing MySQL system tables...

OK

Filling help tables...

OK



To start mysqld at boot time you have to copy

support-files/mysql.server to the right place for your system



PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !

To do so, start the server, then issue the following commands:



/usr/bin/mysqladmin -u root password 'new-password'

/usr/bin/mysqladmin -u root -h v5364.vir.kagoya.net password 'new-password'



Alternatively you can run:

/usr/bin/mysql_secure_installation



which will also give you the option of removing the test

databases and anonymous user created by default.  This is

strongly recommended for production servers.



See the manual for more instructions.



You can start the MySQL daemon with:

cd /usr ; /usr/bin/mysqld_safe &



You can test the MySQL daemon with mysql-test-run.pl

cd /usr/mysql-test ; perl mysql-test-run.pl



Please report any problems with the /usr/bin/mysqlbug script!



                                                           [  OK  ]

mysqld を起動中:                                           [  OK  ]


サーバー起動時にMySQLを起動しておくよう設定します。
# chkconfig mysqld on


【3.PHPのインストール・設定】
インストール実行
# yum -y install php

タイムゾーンの設定を行います。
# vi /etc/php.ini

; Defines the default timezone used by the date functions

; http://www.php.net/manual/en/datetime.configuration.php

#ini.date.timezone
date.timezone = "Asia/Tokyo"

一旦、サンプルスクリプトを書いて表示してみます。
# cd /var/www/html/

# vi index.php



<?php

  phpinfo();

?>





















ApacheとPHPが動いていることは確認できました。
次回はいよいよWordPressの設定に入ります。