WordPressブログをAWSで構築する(2) - EC2編
前回は、サーバー構築時に必要な「ドメイン」と「SSL」を購入しました。
今回は、これらを設定するサーバーを構築していきます。
今回のゴール(システム構成)
今回のゴールは WordPress をインストールするための EC2 構築になります。
EC2インスタンスを起動しよう
以下の考え方で、EC2インスタンスを起動していきます。
- インスタンスタイプは、利用料が抑えられるARM系インスタンス t4g.micro にする
- セキュリティグループは自分の命名ルールに変更する
- セキュリティグループのポートは、22番と22番を閉じたとき用のSSH接続ポート番号のみを空ける
- セキュリティグループのアクセスは、自身のパブリックIPのみを許可する
- SSDは無料で利用できる30GBに増やす
AWSアカウントはすでにあるので、EC2管理コンソールでインスタンスを起動します。
Amazon Linux 2 を選択し、CPU は Arm を選択します。
以降の設定で t4g.micro を選択予定で、無料利用枠の対象ではなくなりますが、月額コストを削減できます。
nano では起動しない可能性が高いので、micro を選択します。
インスタンスの詳細では「バースト」がされないように、「クレジット仕様」のチェックボックスを外しています。
ストレージは30GBまで無料なので、8から30に変更します。
Nameタグで命名をして(後からでもできます)、次の設定へ移ります。
セキュリティグループが適当な命名をされてしまいそうになっているので、自身の命名ルールで作成します。
sg-で始まる命名をしたくなりますが、そうすると起動時に怒られます。
空けるポートは、22番と22番を閉じたとき用(後述)のSSH接続ポート番号 を指定します。
私は 5桁の空きポート を使います。(仮に 44044 とします)
また、マイIPを選択して、自身が現在割り当てられているパブリックIPからのみアクセス可とします。自宅からだとパブリックIPは変わることがありますが、その際はマイIPを選択し直して接続します。
いざ起動! と思ったら、キーペアをどうするかと聞かれます。
key_で始まる命名をして、pemファイルをダウンロードすると、ようやく起動できます。(pemファイルはSSH接続時に必要となります)
EC2インスタンスにSSH接続しよう
EC2が問題なく起動したかは、EC2管理コンソールで確認します。
サーバー名(Nameタグ)は一覧上で設定・変更することができます。
概要欄にサーバーのパブリックIPが記載されていますので、さっそくSSH接続します。
ツールは Mac の iTermを使用します。
その前に、IPアドレスが逆引きできるかを確認します。
※ 11.222.33.444 部分は、EC2 の IPアドレスに読み替えてください
$ nslookup 11.222.33.444
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
444.33.222.11.in-addr.arpa name = ec2-11-222-33-444.ap-northeast-1.compute.amazonaws.com.
問題なさそうですね。
次に、ローカルに保存したpemファイルが参照できるかを確認します。
Downloadsフォルダに保存した状態であれば、以下で表示されるかを確認します。
$ cat Downloads/key_wordpress_1.pem
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
参照できれば、いざ接続です。
ルート権限(sudo)で接続します。Passwordは、Macのログインするときのパスワードと同じになります。
EC2のデフォルトユーザーは ec2-user になります。
$ sudo ssh ec2-user@11.222.33.444 -i Downloads/key_wordpress_1.pem
Password:
Are you sure you want to continue connecting (yes/no/[fingerprint])?
と聞かれるので
yes
と打ち込むとログインできます。
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
Amazon Linux2サーバーを初期設定しよう
続いて、Linux の設定を進めていきましょう。
参考にさせていただいたサイトは、こちらです。
それではさっそく設定していきます。
何はともあれ、最新化です。
$ sudo yum -y update
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core | 3.7 kB 00:00
No packages marked for update
アップデートは何もありませんでした。
ザーっとコンソールが流れるのが気持ちよかったりするのですが...
- タイムゾーンと時刻の設定
$ date
2020年 9月 17日 木曜日 13:11:21 UTC
UTCですね。ではJPTにします。
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ date
2020年 9月 17日 木曜日 22:14:24 JST
バッチリ変わりました。
時刻も変更します。
$ sudo vi /etc/sysconfig/clock
ZONE="UTC"
UTC= true
viでは i を押すと編集モードになるので、UTC の部分を Asia/Tokyo に変更します。
ZONE="Asia/Tokyo"
escボタンで編集モードを終わらせて、: w q を順に押して保存します。(: q は保存せずに終了します)
終了後はいったん再起動します。
$ sudo reboot
- 不要なサービス停止
$ sudo ntsysv
スペースタブで * マークは消えます。
私の場合も参考サイトに書いてある 8つのサービスのうち、7つのサービスだけをONにしています。(ntpd, ntpdateはないため、6つです)
SysV initscripts
[*] network
systemd services
[*] cloud-final.service
[*] crond.service
[*] irqbalance.service
[*] rsyslog.service
[*] sshd.service
$ chkconfig --list | grep 3:on
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
$ systemctl list-unit-files | grep enabled
brandbot.path enabled
autovt@.service enabled
cloud-final.service enabled
crond.service enabled
getty@.service enabled
irqbalance.service enabled
rsyslog.service enabled
sshd.service enabled
default.target enabled
graphical.target enabled
nfs-client.target enabled
remote-fs.target enabled
runlevel5.target enabled
不要なコンソールも減らす設定(ACTIVE_CONSOLES)は、Amazon Linux 2 ではなさそうです。
- 独自のrootユーザー作成
まずは、独自ユーザーがどのくらいあるかを確認します。
$ tail -2 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
ec2-user:x:1000:1000:EC2 Default User:/home/ec2-user:/bin/bash
$ grep wheel /etc/group
wheel:x:10:ec2-user
現状は ec2-user のみです。
ここに新しいルートユーザーを作成します。taro としましょう。
$ sudo adduser taro
$ sudo usermod -G wheel taro
$ echo 'taro ALL = NOPASSWD: ALL' | sudo tee --append /etc/sudoers.d/cloud-init
taro ALL = NOPASSWD: ALL
ほぼ最後の方にある NOPASSWD 行を有効にします。
また、その上にある行はコメントアウトします。
$ sudo visudo
...
## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
新しいrootユーザーに ec2-user のパーミッションをコピーします。
$ sudo rsync -a ~/.ssh/authorized_keys ~taro/.ssh/
$ sudo chown -R taro:taro ~taro/.ssh
$ sudo chmod -R go-rwx ~taro/.ssh
$ sudo ls -al ~taro/.ssh
合計 4
drwx------ 2 taro taro 29 9月 17 22:56 .
drwx------ 3 taro taro 74 9月 17 22:56 ..
-rw------- 1 taro taro 397 9月 17 21:35 authorized_keys
新しいユーザーで sudo権限があるかを確認します。
[ec2-user@ip-111-22-33-44 ~]$ sudo su - taro
[taro@ip-111-22-33-44 ~]$ sudo -s
[root@ip-111-22-33-44 taro]# exit
exit
[taro@ip-111-22-33-44 ~]$ exit
[ec2-user@ip-111-22-33-44 ~]$
新しいユーザー taro でSSH接続し直します。
$ sudo ssh taro@11.222.33.444 -i Downloads/key_wordpress_1.pem
問題ないので ec2-user を削除します。
$ sudo userdel ec2-user
ポート22番も閉じて、独自ポートで接続するようにします。(独自ポートを 44044 とした場合)
$ sudo vi /etc/ssh/sshd_config
...
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
Port 44044
$ sudo service sshd reload
$ sudo netstat -anp | grep sshd
tcp 0 0 0.0.0.0:44044 0.0.0.0:* LISTEN 3316/sshd
...
tcp6 0 0 :::44044 :::* LISTEN 3316/sshd
...
セキュリティグループで 44044 ポートはすでに空けていますので、上記の変更後も接続はされます。
再度 SSH接続をポート指定で実施します。
$ sudo ssh taro@11.222.33.444 -p 44044 -i Downloads/key_wordpress_1.pem
問題なく接続できたら、次にセキュリティグループで22番ポートを削除します。
その後、もう1回接続して問題なければ完了です。
SSHポート22番 と rootユーザー ec2-user に関する脆弱性対応ができました。
念のための対処として、ウイルス対策ソフトの導入も検討しましたが
どうやら micro では動作しなさそうなので、諦めます。
rkhunter もひとまずはいいかな。
次は、いよいよWordPressをインストールします!
が、その前にいったんここで AMI を作っておきます。
まだWordPressはインストールできていないので、それっぽい名称にしておきます。
ちなみに、まだ ElasticIP を利用していないので、EC2を立ち上げ直した(停止→起動した)場合は IPアドレス が変更になってしまいます。
SSH接続は、新しく割り当てられた IPアドレスを確認した上で接続します。
LAMP環境を作ろう
AWS公式マニュアルに従い、設定を進めます。
まずは、前提条件として、LAMP環境の設定が必要なので、以下に従ってインストールを進めます。
「ステップ 1: LAMP サーバーを準備する」
サイト上ではコマンドコピーもできるので、便利ですね。
パッケージを最新化して、ApacheとMySQLをインストール、Apacheの起動まで終わったら セキュリティグループにHTTPを許可する80番を追加します。
セキュリティグループは、すでに wordpress-1 を作成していますので、そちらに追加します。
http://サーバーIP/
にアクセスして、Apache のテストページが表示されればOKです。
「ファイルの許可を設定するには」項の設定では、
ec2-user を削除して別のルートユーザーでログインしている場合は、ec2-user でなく作成したルートユーザーを追加するようにしてください。