Amazon Lightsail により数クリックでWordPressサーバを作成する + WordPressサーバ用のiptables設定(接続元IPアドレスによるhttp,https,sshの接続制限)

はじめに
===

少し前になりますが「Amazon Lightsail」というVPSサービスの提供が開始されました。

https://aws.amazon.com/jp/blogs/news/amazon-lightsail-the-power-of-aws-the-simplicity-of-a-vps/

Amazon Lightsailを使うと、WordPress, LAMPスタック, Node.js等がインストールされた仮想マシンを数分で簡単に作成出来るので便利です。

本記事では、以下の手順について記します。これにより、Amazon Lightsailにより、指定したIPアドレスやネットワークからのみ閲覧可能なWordPressサーバを簡単に作成する事が可能です。

　・Amazon LightsailでWordPressサーバを作成する手順。
　・Amazon Lightsailで作成したWordPressサーバに対して、iptablesにより指定したポート + 指定したIPアドレスやネットワークのみアクセスを許可する設定

本記事の補足
===

2017年2月26日時点では、Amazon Lightsailで作成した仮想マシンはhttp,https,sshといったポート単位でしかアクセス制限をかける事が出来ません。

Amazon Lightsailの仮想マシンでは、EC2にようにセキュリティグループを適用出来ない為、ポート単位 + IPアドレス単位のアクセス制限を適用出来ず、仮想マシンへアクセス可能なIPアドレスやネットワークを制限する事は出来ません。

<img width="970" alt="スクリーンショット 2017-02-26 21.10.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/f185dbdd-643b-06e9-e36d-50f05e319e5c.png">

本記事では、Amazon Lightsail仮想マシンを作成し、iptablesで指定したIPアドレスやネットワークからのみhttp,https,ssh接続を許可する手順を記します。

iptablesを設定する環境について
===

iptablesを設定するAmazon Lightsail仮想マシンのOSはUbuntuになります。

```
root@ip-172-26-XXX-XXX:~# uname -a
Linux ip-172-26-XXX-XXX 3.13.0-107-generic #154-Ubuntu SMP Tue Dec 20 09:57:27 UTC 2016 x86_64 x86_64 x86_64 GN
U/Linux
```

Amazon LightsailでWordPressサーバを作成する手順
===

## (1) AWSマネジメントコンソールへログインします。

<img width="1202" alt="スクリーンショット 2017-02-26 21.14.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/db0b87f7-cda7-b8a3-ec31-2949046b096d.png">

## (2)「すべてのサービス」->「コンピューティング」->「Lightsail」をクリックします。

<img width="814" alt="スクリーンショット 2017-02-26 18.07.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/71de70cc-41cc-a7d0-740f-b954037e4aeb.png">

## (3) Lightsailコンソールが表示されます。「Let's get started」をクリックします。

## (4) Lightsailコンソールで、作成したいLightsail仮想マシンの種類を選択します。「Pick your instance image」で「WordPress」を選択します。

<img width="1264" alt="スクリーンショット 2017-02-26 18.13.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/9dfcfcce-903f-20e2-7938-9ce384bd8960.png">

## (5) Lightsailコンソールを下にスクロールさせて、作成するLightsail仮想マシンのインスタンスプランを選択します。「Choose your instance plan」で「$ 5 month」を選択します。

<img width="1272" alt="スクリーンショット 2017-02-26 18.15.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/3d43cec7-8150-e52b-2a9c-44a9ac3c921f.png">

## (6) Lightsail仮想マシンを作成するリージョンを選択します。「Change zone」をクリックします。

<img width="1253" alt="スクリーンショット 2017-02-26 18.17.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/767e6ead-9bba-6c0a-3682-8efd42ed6dda.png">

## (7)「Select Availability Zone」で「Zone A (us-east-1a)」を選択します。

なお、2017年2月26日時点では、us-eastリージョンしか選択出来ません。

<img width="1257" alt="スクリーンショット 2017-02-26 18.20.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/9419ef84-3403-3441-f5cd-58f34a9bb8a0.png">

## (8)「Create」をクリックして、Lightsail仮想マシンの作成を開始します。

<img width="1253" alt="スクリーンショット 2017-02-26 18.20.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/744b6e79-ead8-7a0c-7152-3416d3218bd1.png">

## (9) WordPressがインストールされたLightsail仮想マシンが作成されます。インスタンス名(例:WordPress-512MB-Virginia-1)をクリックします。

<img width="1263" alt="test1.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/737d3f56-e999-3059-1f0c-8ae878bbe7f9.png">


作成したLightsail仮想マシンのWordPressサーバのIPアドレスを確認します。
本記事では例として、Lightsail仮想マシンのIPアドレスを「54.173.XXX.XXX」と表記します。

## (10) Lightsail仮想マシンの設定画面が表示されます。「Connect using SSH」をクリックして、Lightsail仮想マシンへsshログインします。

<img width="1265" alt="test2.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/07ba7db2-c9cd-51d5-c015-bb4adf21d4f6.png">

## (11) Lightsail仮想マシンへsshログイン出来ます。sshログインユーザやパスワード入力は不要で、sshでLightsail仮想マシンへログインした状態の画面が表示されます。

<img width="946" alt="スクリーンショット 2017-02-26 18.29.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/8bd6bb5d-5a7d-fab6-dd16-2b57749ea3e2.png">

## (12) Lightsail仮想マシンのWordPress管理画面の初期パスワードを確認します。

Lightsail仮想マシンのWordPress管理画面へログインする初期パスワードを確認します。パスワードは/home/bitnami/bitnami_application_passwordファイルに記載されています。

```
bitnami@ip-172-26-XXX-XXX:~$ cat /home/bitnami/bitnami_application_password 
初期パスワード
bitnami@ip-172-26-XXX-XXX:~$ 
```

<img width="963" alt="スクリーンショット 2017-02-26 22.20.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/66e34076-00c1-ba7d-03ff-a18b27ea29ab.png">

## (13) 作成したLightsail仮想マシンのWordPressページへアクセスし、WordPressページが閲覧出来るか確認します。

http://54.173.XXX.XXX/

<img width="1273" alt="スクリーンショット 2017-02-26 22.18.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/4e0cf0cc-359d-c3d5-7f6f-3fe1e5d6a8e2.png">

## (14) Lightsail仮想マシンのWordPress管理画面へログイン出来るか確認します。

WordPressの管理画面URLへアクセスします。

http://54.173.XXX.XXX/wp-login.php

　ユーザ名: user
　パスワード: (12)で/home/bitnami/bitnami_application_passwordファイルに記載されていたパスワードを入力します。

<img width="1261" alt="スクリーンショット 2017-02-26 22.24.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/bd49cab9-217c-8252-156b-c27452661157.png">

WordPressの管理画面へログイン出来る事を確認します。

<img width="1273" alt="スクリーンショット 2017-02-26 22.27.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/f0924235-c37e-3d3a-bdf5-3c50cd6e1a19.png">



Amazon Lightsailで作成したWordPressサーバにiptablesでネットワークアクセス制限を設定する手順
===

## (1) Amazon Lightsail仮想マシンへsshログインしたら、rootユーザへスイッチします。

以下のコマンドを実行します。rootユーザへスイッチします。

```
bitnami@ip-172-26-XXX-XXX:~$ sudo su - 
```

<img width="937" alt="スクリーンショット 2017-02-26 18.47.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/d7362646-6c50-c96b-d92d-97df45b95754.png">

Amazon Lightsail仮想マシンのOSを確認します。
WordPressサーバの場合、仮想マシンのOSはUbuntuです。

```
root@ip-172-26-XXX-XXX:~# uname -a
Linux ip-172-26-XXX-XXX 3.13.0-107-generic #154-Ubuntu SMP Tue Dec 20 09:57:27 UTC 2016 x86_64 x86_64 x86_64 GN
U/Linux
root@ip-172-26-XXX-XXX:~# 
```

## (2) Amazon Lightsail仮想マシンにiptables設定保存用コマンドをインストールします。

以下のコマンドを実行して、iptables-persistentをインストールします。

```
root@ip-172-26-12-149:~# apt-get install iptables-persistent
```

「Save current IPv4 rules」と表示されるので「Yes」をクリックします。

<img width="946" alt="スクリーンショット 2017-02-26 18.59.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/fb90f99b-aafd-4d11-58a1-21ed0489b34c.png">

「Save current IPv6 rules」と表示されるので「No」をクリックします。

<img width="949" alt="スクリーンショット 2017-02-26 19.01.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/ae12a465-b4fc-39f1-1403-1acac01ae8d4.png">

iptables-persistentコマンドがインストールされます。

<img width="950" alt="スクリーンショット 2017-02-26 19.02.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/3ac60b25-531a-2b00-3ebf-6c7e10909d83.png">

## (3) Amazon Lightsail仮想マシンにiptablesによるネットワークアクセス制限を設定します。

前述の手順でiptables-persistentをインストールすると、/etc/iptables/rules.v4というiptables設定ファイルが作成されます。

```
root@ip-172-26-XXX-XXX:~# ls -lrta /etc/iptables/
total 12
drwxr-xr-x 92 root root 4096 Feb 26 10:01 ..
-rw-r--r--  1 root root  199 Feb 26 10:01 rules.v4
drwxr-xr-x  2 root root 4096 Feb 26 10:01 .
root@ip-172-26-XXX-XXX:~# 
```

以下のコマンドを実行して、iptablesによるアクセス制限を行います。

　・以下のiptables設定では、指定したIPアドレスやネットワークのみからAmazon Lightsail仮想マシンへのhttp,https,ssh接続を許可するようにしております。

　・「72.21.217.0/24」からのssh接続を許可しているのは、Amazon Lightsailコンソールで「Connect using SSH」をクリックした時、Lightsail仮想マシンへのsshログインを許可する為の設定です。72.21.217.0/24からの接続を許可しないと、どのIPアドレスやネットワークからAmazon Lightsailコンソールの「Connect using SSH」をクリックしても、Lightsail仮想マシンへsshログイン出来なくなります。

　・DNS名前解決の為、Amazon Lightsail仮想マシンから外部へのDNS通信(ポート53)は全て許可しております。

　・時刻同期の為、Amazon Lightsail仮想マシンから外部へのNTP通信(ポート123)は全て許可しております。


```bash:Lightsail仮想マシン(WordPressサーバ)のiptables設定
root@ip-172-26-XXX-XXX:~# iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

root@ip-172-26-XXX-XXX:~# iptables -A OUTPUT -p tcp --dport 123 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 192.0.2.0/24 --dport 22 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 198.51.100.0/24 --dport 22 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 203.0.113.11/32 --dport 22 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 72.21.217.0/24 --dport 22 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp --dport 22 -j REJECT

root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 192.0.2.0/24 --dport 80 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 198.51.100.0/24 --dport 80 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 203.0.113.11/32 --dport 80 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp --dport 80 -j REJECT

root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 192.0.2.0/24 --dport 443 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 198.51.100.0/24 --dport 443 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp -s 203.0.113.11/32 --dport 443 -j ACCEPT
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -p tcp --dport 443 -j REJECT

root@ip-172-26-XXX-XXX:~# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

root@ip-172-26-XXX-XXX:~# iptables -A INPUT -i lo -j ACCEPT

root@ip-172-26-XXX-XXX:~# iptables -A INPUT -s 10.0.0.0/8 -j DROP
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -s 172.16.0.0/12 -j DROP
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -s 192.168.0.0/16 -j DROP
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -s 127.0.0.0/8 -j DROP
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -s 169.254.0.0/16 -j DROP
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -s 192.0.2.0/24 -j DROP
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -s 224.0.0.0/4 -j DROP
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -s 240.0.0.0/5 -j DROP
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -d 0.0.0.0/8 -j DROP
root@ip-172-26-XXX-XXX:~# iptables -A INPUT -d 255.255.255.255/32 -j DROP
```


## (4) Amazon Lightsail仮想マシンでiptablesによるアクセス制限を有効化します。

以下のコマンドを実行します。

```
root@ip-172-26-XXX-XXX:~# /etc/init.d/iptables-persistent save
 * Saving rules...        
 *  IPv4...        
 *  IPv6...       [ OK ] 
root@ip-172-26-XXX-XXX:~# 
```

```
root@ip-172-26-XXX-XXX:~# /etc/init.d/iptables-persistent reload
 * Loading iptables rules...        
 *  IPv4...        
 *  IPv6...       [ OK ] 
root@ip-172-26-XXX-XXX:~# 
```

## (5) Amazon Lightsail仮想マシンのネットワークアクセス制限が有効になっているか確認します(iptablesでhttp通信を許可したIPアドレスからの接続確認)。

iptablesでアクセスを許可しているネットワークのWebブラウザからAmazon Lightsail仮想マシンのIPアドレスへアクセスしてみます。

http://54.162.XXX.XXX

以下のようにAmazon Lightsail仮想マシンのWordPressページが表示される事を確認します。

<img width="1276" alt="スクリーンショット 2017-02-26 19.49.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/b4bd7173-cc8a-fa4c-abee-a31a74d21d4e.png">


また、iptablesでアクセスを許可しているネットワークのマシンからAmazon Lightsail仮想マシンへssh接続出来る事を確認します。

```
PC001:~ user$ ssh 54.173.XXX.XXX
The authenticity of host '54.173.XXX.XXX (54.173.XXX.XXX)' can't be established.
　(中略)
```

```
PC001:~ user$ nc -z -v 54.173.XXX.XXX 22
found 0 associations
found 1 connections:
     1:	flags=82<CONNECTED,PREFERRED>
	outif en0
	src 198.51.100.21 port 52095
	dst 54.173.XXX.XXX port 22
	rank info not available
	TCP aux info available

Connection to 54.173.XXX.XXX port 22 [tcp/ssh] succeeded!
PC001:~ user$ 
```

## (6) Amazon Lightsail仮想マシンのネットワークアクセス制限が有効になっているか確認します(iptablesでhttp通信を許可していないIPアドレスからの接続確認)。

iptablesでアクセスを許可していないネットワークのWebブラウザからAmazon Lightsail仮想マシンのIPアドレスへアクセスしてみます。

http://54.162.XXX.XXX

Amazon Lightsail仮想マシンのWordPressページが表示されない事を確認します。

<img width="1275" alt="スクリーンショット 2017-02-26 19.58.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/f926f345-2f3a-7eb1-60c4-f0fd12d70fea.png">

また、iptablesでアクセスを許可していないネットワークのマシンからはAmazon Lightsail仮想マシンへssh接続出来ない事を確認します。
このようになっていれば、iptablesによるアクセス制限は有効になっております。

```
PC001:~ user$ ssh -i SSH鍵ファイル bitnami@54.173.XXX.XXX
ssh: connect to host 54.173.XXX.XXX port 22: Connection refused
PC001:~ user$ 
```

```
PC001:~ user$ nc -z -v 54.173.XXX.XXX 22
nc: connectx to 54.173.XXX.XXX port 22 (tcp) failed: Connection refused
PC001:~ user$ 
```

***
最後に
===

Amazon Lightsailは設定がシンプルな分、EC2と比較するとセキュリティグループ機能がなかったり、きめ細かな設定は行えないようです。

また、2017年2月26日時点では、us-eastリージョンでしかAmazon Lightsail仮装マシンを作成出来ません。体感的に気になる程ではありませんが、日本からAmazon Lightsail仮装マシンのWordPressぺージを表示する場合は少しレイテンシがあると思います。

しかし、それらを踏まえても、Amazon Lightsailを使う事で、数クリック・数分で仮想マシンを作成出来るので、社内サーバや開発用サーバを気軽に作成出来る便利なサービスだと思います！

以上になります。