AWS上にWordPress用の少しセキュアなWebインフラを作ってみる

【スポンサーリンク】

AWSに構築する環境について

  • 可用性の面から、将来的にAvailability Zone(AZ)を跨いだ複数台構成のWEBサーバが配置可能なネットワーク構成とする。
  • 環境を堅牢(アクセス経路少など)にするため、sshでの接続は踏み台となるサーバ(Bastion)のみを経由して作業が行えるようにする。(パブリックIPはWebサーバには付与しない)
  • Bastionサーバは利用しないときは、停止可能とする。
  • サーバは外部アクセスが可能なPublicな領域と、内部からのみアクセス可能なPrivateな領域をサブネットで区切って構成する。
  • 構成名はwp1とする。 f:id:nyasu0123:20160507230537p:plain

AWS Management Consoleにログインし、まずは、VPCメニューからネットワーク基盤を構築する。

  1. VPCの作成」からVPCを作る。

    クラスBで作る感じ。これで単純に65000台のサーバーが作れる。

    • ネームタグ:「vpc-wp1」
    • CIDR: 10.0.0.0/16
    • テナント: デフォルト
  2. 「サブネットの作成」からサブネットを作る。

    以下、全部で5つのサブネットを作る。

    • Public(公開)領域として、Elastic Load Balancing(ELB)用のサブネットをAZ-aに「sn-wp1-elb-a」、AZ-bに「sn-wp1-elb-b」の2つを作る。
    • Prvate(セキュアな)領域として、Webサーバ(WordPress+MySQL)用のサブネットをAZ-aに「sn-wp1-web-a」、AZ-bに「sn-wp1-web-b」の2つを作る。
    • Public(EIPを振るので)領域として、Bastionサーバ(踏み台)用のサブネットをAZ-aに「sn-wp1-bastion」を1つ作る。 f:id:nyasu0123:20160507172013p:plain
  3. 「インターネットゲートウェイの作成」からインターネットゲートウェイを作る。

    インターネットゲートウェイは、EIP付き(Public IP付き)のインスタンスやELBが、インターネットと通信するためのコンポーネントで、後述のルートテーブルにセットして使用する。

    • ネームタグ:「igw-wp1」

      f:id:nyasu0123:20160507172249p:plain

  4. 「NAT ゲートウェイの作成」からNATゲートウェイを作る。

    NATゲートウェイは、EIP付きではないプライベートIPのみのインスタンスが、インターネットと通信するためのコンポーネントインスタンスの代わりにインターネットと通信するため、EIPを付与する。これも、後述のルートテーブルにセットして使用する。

    • サブネット:「sn-wp1-bastion」
    • Elastic IP割り当て ID: 新規で割り当てをする。

      f:id:nyasu0123:20160507173447p:plain

  5. 「ルートテーブルの作成」からELBのサブネット用にルートテーブル「rt-wp1-elb」を作る。

    • 「送信先」: 0.0.0.0/0
    • 「ターゲット」:「igw-wp1」で設定を追加する。
    • 作ったら下のタブから「ルート」を選択して、「編集」からテーブルを設定する。

      f:id:nyasu0123:20160507173546p:plain

    「rt-wp1-elb」がメインテーブルでなければ、「メインテーブルに設定」をすることでメインテーブルにする。メインテーブルにすると、ルートテーブルと関連付けされていないサブネットが自動で設定されるようになる。

  6. 「ルートテーブルの作成」からWebサーバのサブネット用にルートテーブル「rt-wp1-web」を作る。

    • 「送信先」: 0.0.0.0/0
    • 「ターゲット」: nat-0c9481..(4.で作ったNATゲートウェイ)で設定を追加する。
    • 作ったら下のタブから「ルート」を選択して、「編集」からテーブルを設定する。

      f:id:nyasu0123:20160507194435p:plain

    「サブネットの関連付け」を選択して、「編集」から「sn-wp1-web-a」、「sn-wp1-web-b」の2つをチェックし「保存」することで関連付けを行う。

    f:id:nyasu0123:20160507194521p:plain

  7. 「ルートテーブルの作成」からBastionサーバのサブネット用にルートテーブル「rt-wp1-bastion」を作る。

    • 「送信先」: 0.0.0.0/0
    • 「ターゲット」:「igw-wp1」で設定を追加する。
    • 作ったら下のタブから「ルート」を選択して、「編集」からテーブルを設定する。

      f:id:nyasu0123:20160507195150p:plain

    「サブネットの関連付け」を選択して、「編集」から「sn-wp1-bastion」をチェックすることで関連付けを行う。

    f:id:nyasu0123:20160507195200p:plain

ここまででネットワーク基盤の構築は完了。 f:id:nyasu0123:20160507195253p:plain

VPCメニューから各サーバーに付与するセキュリティグループを準備する。

  1. 「セキュリティグループの作成」からELB用にセキュリティグループ「sg_elb_web」を作る。

    • ネームタグ: 「sg_elb_web」
    • グループ名: 「sg_elb_web」
    • VPC: 「vpc-wp1」
    • インバウンド: f:id:nyasu0123:20160507200035p:plain

    • アウトバウンド: 変更なし。(その他のセキュリティグループの場合もアウトバウンドは基本的に変更なし。)

  2. 「セキュリティグループの作成」からWebサーバ用にセキュリティグループ「sg_web」を作る。

  3. 「セキュリティグループの作成」からBastionサーバ用にセキュリティグループ「sg_bastion」を作る。

ここまででセキュリティグループは完了 f:id:nyasu0123:20160507210202p:plain

EC2メニューから各サーバーを構築する。

  1. インスタンスの作成」からBastionサーバーを作る。 Amazon Linux AMIの最新でBastionサーバ「wp1-bastion」を作る。

    • インスタンスタイプ: 「t2.nano」
    • ネットワーク: 「vpc-wp1」
    • サブネット: 「sn-wp1-bastion」
    • ネームタグ: 「wp1-bastion」
    • セキュリティグループ: 「sg_bastion」
    • その他はデフォルトで作る。 (t2.nanoで十分と思うけど、t2.microだと無料枠あり)

    • キーペアは新規に「wp1-key」で作成する。

    • プライベートキーファイル「wp1-key.pem」はAWS環境にアクセスする際に必須のため無くさないこと!

    f:id:nyasu0123:20160507202215j:plain

  2. インスタンスの作成」からWordPress+MySQLサーバー Amazon Linux AMIの最新でWebサーバ「wp1-web-a」を作る。

    • ネットワーク: 「vpc-wp1」
    • サブネット: 「sn-wp1-web-a」
    • ストレージ: ルート汎用SSD 30GB程度。1つの方がバックアップが楽。
    • ネームタグ: 「wp1-web-a」
    • セキュリティグループ: 「sg_web」
    • スペックはお好みで、その他はデフォルトで作る。

    • キーペアは「wp1-bastion」と同じ「wp1-key」を利用する。

    今回は個人利用なので1台構成とする。商用利用、企業利用で場合は、同様のサーバをAZ-b側にも用意して可用性を対策する。

    f:id:nyasu0123:20160507204447j:plain

  3. Elastic IPの「新しいアドレスの割り当て」からVPCに利用可能なパブリックIPを割り当てる。

    • EIPの使用箇所: 「VPC」で関連づける。Bastionサーバ用とWebサーバ用に2回行う。
  4. Elastic IPの「アクション」から「アドレスの関連付け」で、割り当てされたElastic IPをBastionサーバにパブリックIPを付与する。

    • インスタンス: 「wp1-bastion」
    • その他はデフォルトで「関連付け」をする。
  5. 同様にWebサーバにパブリックIPを付与する。

    • インスタンス: 「wp1-web-a」
    • その他はデフォルトで「関連付け」をする。

構築したAWS上の各サーバーに接続する。

  1. クライアントマシンに接続用の設定を行う。 Macとか、Linux系から多段SSHの設定を行い接続する方法。 設定が必要なため、事前に「wp1-bastion」パブリックIPと「wp1-web-a」のプライベートIPを確認しておく。
    $ vi .ssh/config
    ServerAliveInterval 60
    
    Host wp1bastion
    HostName 52.xxx.xxx.xxx (BastionサーバのパブリックIP)
    User ec2-user
    IdentityFile /Users/xxx/wp1-key.pem (プラベートキーファイル)
    
    Host wp1weba
    HostName 10.0.1.185 (WebサーバのプライベートIP)
    User ec2-user
    IdentityFile /Users/xxx/wp1-key.pem
    ProxyCommand ssh -W %h:%p wp1bastion
  2. sshコマンドでWebサーバーに接続する。
    $ ssh wp1weba
    
    Bastionサーバへの接続は、
    $ ssh wp1bastion
    

ここまで。 WordPress環境は別記事で。

--

2016.04.26 sshのつなげ方が漏れてたので追記。