はじめに
少し前になりますが「Amazon Lightsail」という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アドレスやネットワークを制限する事は出来ません。
本記事では、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マネジメントコンソールへログインします。
(2)「すべてのサービス」->「コンピューティング」->「Lightsail」をクリックします。
(3) Lightsailコンソールが表示されます。「Let's get started」をクリックします。
(4) Lightsailコンソールで、作成したいLightsail仮想マシンの種類を選択します。「Pick your instance image」で「WordPress」を選択します。
(5) Lightsailコンソールを下にスクロールさせて、作成するLightsail仮想マシンのインスタンスプランを選択します。「Choose your instance plan」で「$ 5 month」を選択します。
(6) Lightsail仮想マシンを作成するリージョンを選択します。「Change zone」をクリックします。
(7)「Select Availability Zone」で「Zone A (us-east-1a)」を選択します。
なお、2017年2月26日時点では、us-eastリージョンしか選択出来ません。
(8)「Create」をクリックして、Lightsail仮想マシンの作成を開始します。
(9) WordPressがインストールされたLightsail仮想マシンが作成されます。インスタンス名(例:WordPress-512MB-Virginia-1)をクリックします。
作成したLightsail仮想マシンのWordPressサーバのIPアドレスを確認します。
本記事では例として、Lightsail仮想マシンのIPアドレスを「54.173.XXX.XXX」と表記します。
(10) Lightsail仮想マシンの設定画面が表示されます。「Connect using SSH」をクリックして、Lightsail仮想マシンへsshログインします。
(11) Lightsail仮想マシンへsshログイン出来ます。sshログインユーザやパスワード入力は不要で、sshでLightsail仮想マシンへログインした状態の画面が表示されます。
(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:~$
(13) 作成したLightsail仮想マシンのWordPressページへアクセスし、WordPressページが閲覧出来るか確認します。
(14) Lightsail仮想マシンのWordPress管理画面へログイン出来るか確認します。
WordPressの管理画面URLへアクセスします。
ユーザ名: user
パスワード: (12)で/home/bitnami/bitnami_application_passwordファイルに記載されていたパスワードを入力します。
WordPressの管理画面へログイン出来る事を確認します。
Amazon Lightsailで作成したWordPressサーバにiptablesでネットワークアクセス制限を設定する手順
(1) Amazon Lightsail仮想マシンへsshログインしたら、rootユーザへスイッチします。
以下のコマンドを実行します。rootユーザへスイッチします。
bitnami@ip-172-26-XXX-XXX:~$ sudo su -
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」をクリックします。
「Save current IPv6 rules」と表示されるので「No」をクリックします。
iptables-persistentコマンドがインストールされます。
(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)は全て許可しております。
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アドレスへアクセスしてみます。
以下のようにAmazon Lightsail仮想マシンのWordPressページが表示される事を確認します。
また、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アドレスへアクセスしてみます。
Amazon Lightsail仮想マシンのWordPressページが表示されない事を確認します。
また、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を使う事で、数クリック・数分で仮想マシンを作成出来るので、社内サーバや開発用サーバを気軽に作成出来る便利なサービスだと思います!
以上になります。