AWS移行 - ネットワーク関連でやったこと

ネットワーク関連の設定メモ。
AWSになったことによる影響等を書いていきます。


#セキュリティグループ設計
セキュリティグループはサーバー、ELB、RDS..ごとに設定し、そのセキュリティグループを許可するような設計になっています。
直接IPアドレスを記述するのは最小限になります。

※下記はイメージ
列が各リソース
行がセキュリティグループ名です
○が付いているところには、そのセキュリティグループの許可（インバウンド許可設定）されていることになります。
そのセキュリティグループに所属しているものも許可します。
たとえば下記の「prd-web01」というEC2は、「prd-app-web-sg」というセキュリティグループを許可していますが、
「prd-app-web-sg」の中身は「prd-front-main-sg」の80番を許可しています。
これは「prd-front-main-sg」が設定されている「prd-main-alb」からの80番アクセスを許可するという意味になります。


| ELB                         | prd-main-alb | prd-admin-alb | prd-jenkins-alb | 
|:----------------------------|:-------------|:--------------|:----------------|
| prd-myoffice-maintenance-sg | ○            | ○             | ○              
| prd-monitoring-sg           | ○            |               |                 |
| prd-front-main-sg           | ○            |               |                 |
| prd-front-admin-sg          |              | ○             |                 |
| prd-front-jenkins-sg        |              |               | ○               |




| EC2                         | prd-web01    | prd-admin01   | prd-rent01      | jenkins |
|:----------------------------|:-------------|:--------------|:----------------|:--------|
| prd-myoffice-maintenance-sg | ○            | ○             | ○               | ○       |
| prd-app-web-sg              | ○            |               |                 |         |
| prd-app-admin-sg            |              | ○             |                 |         |
| prd-app-rent-sg             |              |               | ○               |         |
| prd-app-batch-sg            |              |               | ○               |         |
| prd-app-jenkins-sg          |              |               |                 | ○       |

| RDS                         | prd-rent-db  | prd-web-db    | 
|:----------------------------|:-------------|:--------------|
| prd-data-rent-sg            | ○            |               |
| prd-data-web-sg             |              | ○             |


----
次に各セキュリティグループで許可している内容です。
IPの記述は最小限になっています。


| ELB                         |                      |          |
|:----------------------------|:---------------------|:---------|
| prd-myoffice-maintenance-sg | 自社のIP             |          |
| prd-monitoring-sg           | 監視サービスのIP     |          |
| prd-front-main-sg           | 0.0.0.0/0            | 80/443番 |
|                             | ::/0                 | 80/443番 |
| prd-front-admin-sg          | 0.0.0.0/0            | 80/443番 |
|                             | ::/0                 | 80/443番 |
| prd-front-jenkins-sg        | 自社のIP             | 80/443番 |


| EC2                         |                      |          |
|:----------------------------|:---------------------|:---------|
| prd-myoffice-maintenance-sg | 同上                 |          |
| prd-app-web-sg              | prd-front-main-sg    | 80番     |
| prd-app-admin-sg            | prd-front-admin-sg   | 80番     |
| prd-app-rent-sg             | prd-front-main-sg    | 80番     |
| prd-app-batch-sg            | prd-app-admin-sg     | 22番     |
| prd-app-jenkins-sg          | prd-front-jenkins-sg | 80番     |


| RDS                         |                      |          |
|:----------------------------|:---------------------|:---------|
| prd-data-rent-sg            | (postgresql)         |          |
|                             | prd-app-rent-sg      | 5432番   |
|                             | prd-app-admin-sg     | 5432番   |
| prd-data-web-sg             | (mysql)              |          |
|                             | prd-app-web-sg       | 3306番   |
|                             | prd-app-rent-sg      | 3306番   |
|                             | prd-app-admin-sg     | 3306番   |
|                             | prd-app-jenkins-sg   | 3306番   |

----

#ELBが挟まったことによる影響
今までのロードバランサーではアクセス元IPが取得できていたが、ELBでは直接判別はできず、
headerのX-Forwarded-Forに格納される。
これによりアプリの改修や、Apache, Nginxに影響が出る。


##Apache, Nginxでip制限をしている場合


####Apacheでは以下のように設定

```Apache:ApacheでIPを許可する場合,,X-Forwarded-Forを取得
	Order deny,Allow
	Deny from All
	Allow from env=allow_ip

	SetEnvIf X-Forwarded-For "xxx\.xxx\.xxx\.xxx" allow_ip
	SetEnvIf X-Forwarded-For "xxx\.xxx\.xxx\.xxx" allow_ip
```

####Nginxの設定では以下の設定を追記する。

```nginx:/nginx/nginx.conf,X-Forwarded-Forを取得
	set_real_ip_from xxx.xxx.xxx.xxx/xx; #許可したいip
	real_ip_header X-Forwarded-For;
	real_ip_recursive on;
```





#IAMの設計。スイッチロール

開発、ステージ、本番の３つのアカウントがあるが、
３つのアカウントそれぞれでIAMユーザを作成するのではなく、
一つのアカウントでIAMユーザを作成し、それぞれのアカウントではSwitchロールして使用。

<!--
実現方法はよくわからなかったのでコメントアウトしておく。。

![スライド1.PNG](https://qiita-image-store.s3.amazonaws.com/0/192134/fae47b6b-972d-c613-8c0e-c6cdbbd4b200.png)
![スライド2.PNG](https://qiita-image-store.s3.amazonaws.com/0/192134/44120ef3-1efb-c54e-20e3-11b9a0c7f35f.png)

各EC2へのログインの統一化ですが、複数あるLinuxサーバへのユーザー一括管理は、　SSHユーザーを手動スクリプトで管理する方法もありますが、Simple ADを利用するのが一般的な方法かと思います。

参考：Windowsを一切使わずDirectory ServiceのSimple ADを使ってLinuxユーザーを一元管理する ｜ Developers.IO
https://dev.classmethod.jp/cloud/aws/linux-simplead-management/

また、クライアントからのRDS（Aurora含む）への直接アクセスですが、可能です。
方法については、以下の記事をご参照ください。

IAM認証によるRDS接続を試してみた ｜ Developers.IO
https://dev.classmethod.jp/cloud/aws/iam-auth-rds/



https://cloudonaut.io/manage-aws-ec2-ssh-access-with-iam/
で試してみました。

STGに作成したIAMユーザでPRDのEC2にsshアクセスできているので
多分これで大丈夫だと思います。

STG側に
ポリシー：GetIAMUserSSHPublicKey
を作成して、
ロール：get-iam-user-ssh-publickey
を作成し、これにアタッチ。

PRD側で
ポリシー：GetCrossaccountIamUserSshPublickey
を作成し、作成したロールにアタッチしてあります。
-->