IAM Identity CenterのユーザーでClientVPN接続後に、非公開サーバーへssh接続する環境構築

## 概要
AWS Identity Centerに登録したユーザーを利用して、AWS Client VPNでSAML2.0ベースの認証を行い、外部から接続できないサブネットに起動させた非公開サーバーへSSH接続するところまで行います。
上述した非公開サーバーとは、踏み台サーバーや、デプロイ用のサーバー、社内でのみ利用するようなサーバーを想定しています。

## 記事を書こうと思った経緯
社内でIAMIdenitityCenter+ClientVPNを利用しているので、個人的に気になって構築を始めてみたのですが、なかなか大変だったので、社内の技術共有も兼ねて構築手順を全部見れる記事を作ろうと考えました。

## 対象読者
以下のような方にはメリットがあるかもしれません。
・IAMIdenitityCenter+ClientVPNってどんな感じで構築するのかざっと全体を知りたい方
・踏み台サーバーなどの接続を安全に行いたい方法を検討中の方（※ClientVPN以外にも安全な方法はあると思いますので1つの手段として捉えていただければ幸いです）

## 構築後のイメージ
全体をイメージしやすいように、本記事内で構築するイメージを以下に示します。
※白い矢印はVPN接続時の通信の流れとなります。
![全体図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/e9866687-23f4-ca51-07aa-2c6993d22693.png)

本記事はハンズオンに近い形で記載しているため、基本的には同じ手順で進められます。
また、作成後に料金が発生するAWSリソースがいくつか利用します。事前に記事内のリソースがいくらかかるのか確認しておくことを推奨します。

それでは、構築を始めていきましょう。

## IAM Identity Center ユーザーを準備

事前にIAM Identity Centerを利用できるようにしておきます。[参考](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/get-set-up-for-idc.html)

認証を行うユーザーを準備します。

赤枠の「ユーザーを追加」を押下します。
![001_(access)identity_user_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/cf8d357f-03c7-30b1-b2de-3756514c5d1d.png)

今回は「sample-qiita」というユーザーを作ることにします。
![002_user_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/84715f38-a652-1282-5c66-7c7be15396cf.png)

「sample-qiita」が所属するグループを作成します。
![003_user_create_to_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/3bf4e0df-2569-1049-bc29-7be867efe987.png)

グループ名は「SampleQiitaGroup」とします。
![004_group_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/c43e3fbd-dda4-73f4-dac8-11b33a1ade47.png)

「グループを作成」の左にある更新ボタン押下後、上記で作成したグループを選択します。
![005_select_group.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/8906e622-08b8-22bf-d5e2-3c13b204c079.png)

内容を確認して、「ユーザーを追加」を押下します。
![006_user_create_confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/51eab1d4-e502-8096-4690-4fc97b79e2df.png)

ユーザーが追加されました。メールアドレスは未検証の状態です。
![007_作成したユーザーのプライマリEメールが未検証.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/6502ad14-6e66-d99d-76b3-cb6929d2af47.png)

招待メールが来るので、「Accept Invitation」を押下します。
![008_メールが来るので承認する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/d2aece93-d381-7b4f-1be7-cf10b08ed482.png)

メールアドレスが検証済となり、パスワードの設定画面が表示されますので、そのままパスワードの設定を行います。
![009_accept_invitation_click後パスワード設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/dd2be346-525c-5a52-9b1a-6c6942718681.png)

許可セットを作成していきます。
![014_ユーザーがログインできるように許可セットを作成していく.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/2bd52b60-e8d9-4da7-7d13-856ae0b3997a.png)

今回は、[PowerUserAccess](https://docs.aws.amazon.com/ja_jp/aws-managed-policy/latest/reference/PowerUserAccess.html)を設定したいので、カスタム許可セットを選択します。
![015_今回はカスタム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/edd8884a-3635-f43a-f8c9-bf6153ff5368.png)

[PowerUserAccess](https://docs.aws.amazon.com/ja_jp/aws-managed-policy/latest/reference/PowerUserAccess.html)を選択します。
![016_PoweerUserAccessを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/0f76256c-c8af-72d1-0f3a-e276c3e07704.png)

許可セット名は任意ですが、今回は「SampleQiitaPermissionSet」とし、セッション時間は12時間を選択します。
![017_create_permission_set.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/674bbfc9-5c30-1f0c-f4a4-1b7617140c73.png)

内容を確認後、「作成」を押下します。
![018_create_confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/09fe574e-a120-bfb4-ddb2-e9905d6b20e1.png)

許可セット「SampleQiitaPermissionSet」が作成されます。
![019_許可セットが作成された.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/663f2c88-03c8-aff8-7b7a-0e616f7def4f.png)

ここから、「SampleQiitaGroup」グループに所属する「sample-qiita」ユーザーは、SSOログイン後、管理アカウントのマネージメントコンソールにログインできるように設定していきます。

IAM Identity Center の AWS アカウントにアクセスし、管理アカウントのリンク（赤矢印部分）を押下します。
![020_AWSアカウント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/41538708-904a-7828-fbfe-246bc6cb86f2.png)

このアカウントに、アクセスできるグループと許可セットを割り当てたいので、赤枠の「ユーザーまたはグループを割り当て」を押下します。
![021_AWSアカウントにグループと許可セットを設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/ed8977d5-8a23-84fc-f43a-02a6960e8ecc.png)

「sample-qiita」ユーザーの所属する「SampleQiitaGroup」グループを選択して「次へ」を押下します。
![022_AWSアカウントにグループと許可セットを設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/aabf505c-004a-4a9b-1190-e79d9cbddffb.png)

「SampleQiitaGroup」グループには、先ほど作成した許可セット「SampleQiitaPermissionSet」を設定したいので、「SampleQiitaPermissionSet」を選択します。
![023_許可セットを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/2b72daf0-3f02-a655-5790-be7df5f48675.png)


内容を確認して「送信」します。
![024_送信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/fd472933-ec1a-a27a-d4d9-3c5ea4c72ce2.png)

正常に割り当てられました。
ここまでで、「SampleQiitaGroup」グループに所属する「sample-qiita」ユーザーは、「SampleQiitaPermissionSet」で許可された操作ができる状態で、SSOログインできるようになっています。実際にこれからログインを行なってみます。
![025_アカウントにアクセスSSOアクセス可能なグループと許可セットが設定された.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/f701dec4-6af9-ec79-720a-8c52ba79f9e9.png)

IAM Identity Centerのダッシュボードから赤枠の「AWSアクセスポータルのURL」に記載されたリンクへ飛びます。
![026_ダッシュボードのAWSアクセスポータルから再度ログインを試してみましょう.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/018ae343-3ba0-5149-9eaf-6477365b37b2.png)

ログインを行い、MFAの設定後以下のような画面になります。
管理アカウントに、割り当てた許可セットを利用して、マネージメントコンソールに入れるようになりました。
![032_SSOログインOK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/c3a08897-4c55-23f9-e246-262d0e87408a.png)


## ネットワーク関連の構築
これから行う大まかな流れとしては、VPC作成後に、パブリックサブネットとプロテクトサブネット、プライベートサブネットの三つを作成します。プライベートサブネットは今回利用せず、パブリックサブネットはローカル通信とインターネットゲートウェイへの通信を確保させ、プロテクトサブネットはローカル通信とNATゲートウェイへの通信経路を確保させます。
操作はroot権限でマネージメントコンソールから行い、東京リージョンで作業します。

「qiita-vpc」という名称のVPCを作成します。
![030_東京リージョンにVPCを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/4efe856e-a9ea-4032-3361-ea3fd07ce4bd.png)

作成されたVPCを確認
※ローカル通信の経路が設定されたメインルートテーブルは自動作成されています。
![031_作成されたVPC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/65f79ebd-2100-aaf5-8313-7816fef621be.png)

サブネットを作成します。VPC IDは先ほど作成した「qiita-vpc」を選択します。
![032_サブネットを作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/eb05f447-c2e6-d709-6cf1-a01023b49a54.png)

パブリックサブネットとプロテクトサブネット、プライベートサブネットを作成します。
![033_サブネット作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/fbcc4c61-8dae-21c1-37a5-bc0f5d2406e4.png)
![034_サブネット作成3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/80121545-7527-5379-204c-54ed9eac292b.png)

作成されたサブネットを確認します。
「qiita-public-1a」「qiita-protect-1a」「qiita-private-1a」が作成されています。用途別に用意しているだけで冗長性などは考慮していません。
![035_作成されたサブネット確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/04f71440-b1da-e0c1-d1ad-bebbcddccd74.png)

VPCを選択後、赤枠のメインルートテーブルのリンクを押下します。
![036_VPC作成時に作成されたVPCのルートテーブルに名前をつける.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/1f5b7cc3-9e15-1d17-a97b-7f0843d05334.png)

名称が設定されていないので、「qiita-vpc-main-rtb」と名称を変更しておきます。
![037_main_rtb_name_alter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/6d6c5630-676f-bb52-77ac-5b70cd8cb907.png)

インターネットゲートウェイを作成します。
NATゲートウェイ構築時にVPCにインターネットゲートウェイがアタッチされている必要があるため事前に作成します。
![038_IGW作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/2f4e2292-714f-f33e-1814-4f9d3ea18940.png)

「qiita-igw」という名前でインターネットゲートウェイを作成します。
![039_IGW2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/ab6889d8-ca16-30a3-9dbd-88d3d6397a9d.png)

作成したインターネットゲートウェイをqiita-vpcにアタッチさせます。
![039-2_作成したIGWをVPCにアタッチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/41ac2a78-79d8-aa75-ad0a-d993cd1e1616.png)

「qiita-vpc」を選択して、「インターネットゲートウェイのアタッチ」を押下します。
![039-3_IGWをVPCにアタッチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/b0174513-eed1-0763-17f5-d8d6f34b4c9e.png)

ルートテーブルの作成
各サブネットに関連づける用途で3つルートテーブルを作成します。
![040_各サブネットに紐づけるためのルートテーブル作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/44a8b4de-0801-94ec-d186-1aea697c2be2.png)

パブリックサブネットに関連づけるためのルートテーブル「qiita-vpc-public-rtb」を作成
![041_PUBLIC_RTB作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/87d55b91-2943-4b50-b01f-1d13726381f8.png)


プロテクトサブネットに関連づけるためのルートテーブル「qiita-vpc-protect-rtb」を作成
![042_protect_rtb作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/8517b05d-48e6-94e7-ce38-e5e84b6785ee.png)

プライベートサブネットに関連づけるためのルートテーブル「qiita-vpc-private-rtb」を作成
![043_private_rtb作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/aebebd79-ad51-11b9-4772-0c969e2caa9b.png)

「qiita-vpc-public-rtb」のルート編集へ向かいます。
![044_パブリックサブネットルート編集へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/1cc09655-e53e-f67c-67df-086f9799ed68.png)

「qiita-vpc-public-rtb」にインターネットゲートウェイへの通信経路を追加します。
![045_パブリックRTBにIGWへの経路を追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/22662d8f-3f1a-825e-f2b6-9e6d87b7a2ce.png)

NATゲートウェイの作成へ向かいます。
![046_NATG作成へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/d64adb1e-348d-7134-60ae-dffa49f2bfcb.png)

NATゲートウェイを作成します。
※今回はVPN経由の通信を行う際に、NATゲートウェイを経由して固定IPを利用したいので「ElasticIPを割り当て」を押下して固定IPを取得します。
![047_NATG作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/fccf1612-e021-1ea5-cdf0-764d206140e9.png)

作成後、3分くらいでAvaillableに切り替わります。
※切り替わらない場合は、VPNにインターネットゲートウェイがアタッチされているか確認してみると良いかもしれません。
![048_作成したNATGがAvailableに切り替わる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/1a601103-f52d-04d6-c615-d3e23eb23b75.png)

NATゲートウェイが利用可能になったので、「qiita-vpc-protect-rtb」のルートを編集しに向かいます。
![049_protect_rtbのルートを編集へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/eab3eaca-84fd-d110-3c64-58738e17526a.png)

外向きの通信であれば、先ほど作成したNATゲートウェイに向かわせるように経路を追加します。
![050_protect_rtbのルートにNATGへの経路を追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/401b36f3-a503-5599-c10a-9f571bc322dc.png)

「qiita-vpc-public-rtb」の「サブネットの関連づけを編集」に向かいます。
![051_public_rtbでサブネットの関連づけ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/e9f4de87-ccdb-27d7-bee8-6b85ed98f14f.png)

「qiita-vpc-public-rtb」に、「qiita-public-1a」を関連づけます。
![052_public_rtbにpublic_subnetを関連づけ（他のルートテーブルも同様に行うことを記事に書いておく）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/2c3b8f63-12e3-b660-9992-0d05a5f7d48b.png)

同様に、「qiita-vpc-protect-rtb」に、「qiita-protect-1a」を関連づけ、「qiita-vpc-private-rtb」に、「qiita-private-1a」を関連づけます。

ここまでの作業で以下のようなリソースマップになっていればOKです。
![053_ここまででネットワーク経路の確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/50bce249-e526-2053-83bb-58167de514cc.png)

図にすると以下のような状態となります。
![054_kokomade.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/0e80d7eb-0f75-f65e-2940-caf7dd8644b5.png)


## 非公開サーバーの準備
非公開サーバー（EC2）を用意していきます。
これから作成する非公開サーバーの名前は「qiita-server」とします。

「qiita-server」に設定するセキュリティグループを作成します。
![060_SG作成へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/ff9d601f-6a3c-4a25-3b3b-3b4ecdf619c3.png)

今回以下のようなルールでセキュリティグループを作成します。
※名称は「qiita-server-sg」とします。
※ClientVPN経由でSSHするだけであれば、アウトバウンドルールのSSH,HTTP,HTTPSのルールは不要です。「qiita-server」にてyumやgithubの利用予定があるため今回設定しています。
![061_SG作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/7af4447f-2a8f-c3bc-40c4-af6cc2b48b4c.png)

非公開サーバー「qiita-server」を作成していきます。

「インスタンスを起動」を押下します。
![062_EC2作成へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/2f96ff37-76a0-290c-2e88-d9c79578937e.png)

名前に「qiita-server」を入力後、AMIを選択
![063_ec2_create1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/2d3b6fa0-3607-625d-95ef-07b6d45eb28d.png)

今回は新しくキーペアを作成します。
※既存のキーペアがあればそちらを利用いただいても問題ありません。
※「.pem」ファイルはSSH接続の際に必要になるため、自分がわかる場所に保管しておいてください。
![064_ec2_create2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/5cd6f38b-197d-2d1c-f46e-51a205a57c94.png)

キーペアを選択
![065_ec2_create_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/40557854-2806-db7a-4dab-d77c7f6f9d9f.png)

VPCは作成した「qiita-vpc」を選択します。
サブネットは作成した「qiita-protect-1a」を選択します。
セキュリティグループは作成した「qiita-server-sg」を選択します。
![066_ec2_create4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/89f09372-156e-5c53-aceb-64d9b821e9b3.png)

ストレージはデフォルトのまま進めます。
![067_ec2_create5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/306383f9-66be-0616-9ddb-38b8dfecf546.png)

内容を確認して、「インスタンスを起動」を押下します。
![068_ec2_create6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/3161b2e0-acdc-310b-c36b-cf98ea49120e.png)

非公開サーバー「qiita-server」が起動しました。
![069_ec2_created.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/7be74997-77e4-bd10-23d1-0d5d25e96ca2.png)

ここまでで、以下のようなイメージになっています。
![ec2作成後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/5e8d1516-d391-c291-e482-c7d2158718f1.png)


## Route53でドメイン登録
ClientVPNでACMの証明書を利用するので、ACMのパブリック証明書を発行したいと思います。
ただ、自動更新してくれるAWSが発行する証明書を利用したいので、証明書をインポートするのではなく、今回はRoute53で独自ドメインを購入します。購入後、そのドメインでACMのパブリック証明書を発行します。

Route53から「ドメイン登録」を押下します。
![070_route53-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/219c70f8-f342-a9fe-5593-ae47950f823c.png)

内容を確認して「次へ」を押下します。
![071_Route53-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/312603d4-1c5d-3705-0a18-decf4a42a2c1.png)

必要な情報を入力して「次へ」を押下します。
![072_Route53-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/3c13137b-f42f-a214-7db6-f3f9056abb7a.png)

内容に問題なければ「送信」を押下します。
![073_Route53-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/732bb1a6-9f7d-1cf4-ebcc-0386c2595911.png)

まだ、ステータスが「進行中」なことを確認します。
※この時点では、ドメインの登録はできていません。
![073_Route53-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/32be32fa-d7d8-429b-d410-9456203ff8c2.png)

AWSからメールが来るので、メールアドレスの検証を行い
ステータスが「成功」になればOKです。
![073_Route53-LAST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/fecba340-881e-1a2f-5d12-e37f4a4ed44e.png)


## ACMでパブリック証明書を発行
ドメインが登録できたので、ACMでパブリック証明書を発行していきます。

Amazon Certificate Managerから、「リクエスト」を押下します。
![080_ACMパブリック証明書をリクエストへ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/ae9bcdc0-e576-fdc3-ba8f-3c85a8b6412d.png)

パブリック証明書をリクエストが選択された状態で「次へ」
![081_NEXT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/2d601bec-2f5d-bc3b-856c-713982a44358.png)

登録したドメイン名を入力して「リクエスト」
![082_REQUEST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/5efeb40f-22be-3afd-17fa-f5084b323288.png)

リクエスト後、ステータスは「保留中の検証」となっています。
![083_confirm_horyuutyuu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/4702b6e2-4783-955c-af05-7c4eb9c0926d.png)

ACMの検証に必要なCNAMEレコードを作成するために、ドメイン名のリンク（赤枠部分）を押下します。
![084_domain_link_click.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/8eb2ca83-44cb-4b8c-a91f-3a0043f9cb76.png)

赤枠の「Route53でレコードを作成」を押下します。
![085_create_CNAME.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/e0f5058d-2549-d37c-5053-f6f2d3180547.png)

レコードを作成を押下します。
![086_create_CNAME_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/d8e8cd6b-fa0b-a025-7787-5f268a9d15cc.png)

Route53で作成されたCNAMEレコードが確認可能です（赤枠部分）。
![087_route53で確認するとCNAMEが作成されていることが確認可能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/57b513b3-e48c-e456-d77c-7a86e014e4f5.png)

しばらくすると、ステータスが「発行済み」になります。
これでパブリック証明書の発行は完了です。
![088_発行済みになったことを確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/bb13dc7e-1e53-7241-e637-26657fdc4355.png)


## Client VPN 利用準備

### IAM Identity Center でアプリケーションを作成

IAM Identity Center の「アプリケーションを追加」を押下します。
![100_IAMIdentityCenter-アプリケーションを追加he.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/6ed3938e-6443-7943-be89-fb20959fe41c.png)

「設定するアプリケーションがある」「SAML2.0」を選択します。
![101_SAML.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/8ec41519-2209-2700-4ce2-578d2cc4add3.png)

後ほど使うため「IAM Identity Center SAML メタデータファイル」のダウンロードリンクからXMLファイルをダウンロードしておきます。
![102_application-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/eaad7224-e802-8edd-5335-6759f38f14a9.png)

「アプリケーションACS URL」に`http://127.0.0.1:35001`を入力し、
「アプリケーションSAML対象者」に`urn:amazon:webservices:clientvpn`を入力後、
「送信」を押下します。
![103_application-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/7a05c70f-9e99-817a-f887-4726d7847332.png)
※以下を参考に入力を行っています。
https://aws.amazon.com/jp/blogs/networking-and-content-delivery/using-aws-sso-with-aws-client-vpn-for-authentication-and-authorization/

正常にアプリケーションが作成されたことを確認します。
![104_application-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/c7e5193e-4d03-93bd-cfe4-8cf3b41e9890.png)

### IAM IDプロバイダ 追加

「プロバイダを追加」を押下します。
![150_IAMプロバイダ作成へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/a927df35-c827-cbec-40f5-9c91fb9bd6dd.png)

先ほどダウンロードしたXMLファイル（SAML メタデータファイル）をファイル選択部分で選びます。他の項目はスクショを参考に入力後、「プロバイダを追加」を押下します。
![151_idp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/ab9991fc-6c6a-e80d-7b1b-c61964bca4dc.png)

### Client VPN Endpoint 作成

「クライアントVPNエンドポイントを作成」を押下します。
![200_clientvpnエンドポイント作成へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/8ba6863c-b47a-a6be-6bf5-38fc2227fdc2.png)

スクショを参考に入力を行います。
※クライアント IPv4 CIDR はVPN接続したユーザーに割り当てられるIPの範囲と思われます。今回はVPCのIPレンジと被らないように「172.26.0.0/22」を設定しています。
※接続ログ記録の部分で、選択しているロググループは記事外で作成したものです。同じようにしたい場合は、CloudWatchにて「client-vpn」というロググループを作成していただければ同じように進められます。
![201_client_vpn_endpoint-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/ad3c6bf2-b9c0-7885-d210-c8db738cf133.png)

スクショを参考に入力を行います。
入力完了後に、「クライアントVPNエンドポイントを作成」を押下します。
※「DNSサーバー1 IPアドレス」には、VPC「qiita-vpc」の「Amazon Route 53 Resolver」がある「172.25.0.2」を指定しています([参考](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-dns.html#AmazonDNS))。今回の構築では、非公開サーバーへIPアドレスでSSH接続を行うので未指定でも問題ありません。
※VPCは「qiita-vpc」を、セキュリティグループはデフォルトのセキュリティグループを指定しています。
![202_client_vpn_endpoint-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/7f78e685-7cd7-8410-0812-ea96ecbb54dd.png)


クライアントVPNエンドポイントが作成されました。状態は「Pending associate」です。
![203_client_vpn_endpointが作成された.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/d8df64af-ca7a-318a-d08f-2c5c699fd0cc.png)

状態をActiveにさせるために、赤枠を押下してサブネット「qiita-protect-1a」と紐付けします。
![204_associate_target_networkへ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/bcd7d07d-082b-93e7-c650-a4fe97df84f5.png)

qiita-vpcとqiita-protect-1aを選択して、「ターゲットネットワークと関連づける」を押下します。しばらくすると状態がActiveになるはずです。
![205_associate_target_network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/bb944c47-f3b3-ec0b-6a56-21480bca4925.png)

次に、赤枠の「認証ルールを追加」を押下します。
![206_承認ルールの追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/d371cb2f-6156-d0ec-4717-7cfe8b9f96ab.png)

以下、IAM Identity Centerで作成したグループ「SampleQiitaGroup」のグループIDを、コピーしておきます。
![207_IAMIdentityCenterのグループからグループIDをコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/ba735fd0-8cfc-1234-79d2-f4361a322217.png)

コピーしておいたグループIDをアクセスグループIDにペーストして、アクセスを有効にする送信先ネットワークに「0.0.0.0/0」を指定して、「認証ルールを追加」を押下します。
![208_承認ルール作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/aca56e31-f99f-3fe8-b351-e4296678d7df.png)

VPNに接続した状態で普通にGoogle検索なども行いたいので、ルートを作成します。
![210_ルートの追加へ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/39f2e87f-121b-c7d5-d1cf-707c93c992b3.png)

以下の情報で「ルートを作成」を押下します。
![211_ルートの追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/157700da-f555-25f9-9205-01a403c18535.png)

### IAM Identity Center アプリケーション 追加作業
赤枠リンクを押下します。
![220_IAMIdentityCenter-application-setting1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/18764a61-ea2b-2644-c170-a4d2d7c321aa.png)

属性マッピングを編集
![221_IAMIdentityCenter-setting2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/205b3d08-48df-4c14-7deb-2752e78a2f73.png)

以下のように入力を行い、「変更の保存」を押下します。
![222_IAMIdentityCenter-setting3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/4a14ce56-1b1f-9aa4-770b-419aa5da86aa.png)

次に、「ユーザーとグループを割り当てる」を押下します。
![223_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/2f03e710-2b0a-5729-28e4-f7c081138b03.png)

作成しておいた「SampleQiitaGroup」を選択して、「ユーザーを割り当て」を押下します。
![224_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/23a7cc92-eb58-9aa4-621b-951914a01ae4.png)

割り当てられたユーザーとグループに「SampleQiitaGroup」が追加されていればOKです。
![225_comp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/8e10b7c3-92fb-026c-a638-53373504d5a1.png)


## AWS VPN Client のDLとセットアップ

以下URLから、VPN接続を行うためのクライアントアプリ（AWS VPN Client）をDLします。
当方はMacのため、Mac用のものをDLして進めます。
https://aws.amazon.com/jp/vpn/client-vpn-download/

AWS VPN Clientにて利用するため、赤枠の「クライアント設定をダウンロード」を押下して、「.ovpn」ファイルをダウンロードしておきます。
![300_DL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/47e5e8e1-bcc2-3f98-7b07-8763c12bc5dd.png)

AWS VPN Clientを起動して、赤枠のプロファイルを管理を選択します。
![400_VPNClient1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/76964b18-a32b-06dc-86fe-e4a98bf16a67.png)

「プロファイルを追加」を選択します。
![401_CP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/5e47e6f5-da1a-1a97-4b57-6e32bddec76c.png)

先ほどダウンロードした「.ovpn」ファイルを選択します。
![402_CP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/141f1fb0-fd12-30aa-51cf-9a456b2daa3e.png)

表示名を入力して、「プロファイルを追加」を押下します。
![403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/e93e9c57-cd1d-2226-fe67-8cad1bf2a3e2.png)


## Client VPN 接続

プロファイルの追加完了後、「接続」を押下してVPN接続を試行します。
![404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/49c5f6b6-2674-7580-ef7f-72c59e83e2b0.png)

認証用の画面が開かれるので、「sample-qiita」ユーザーで認証を行います。
![405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/92bc7cd2-dae2-f393-9660-b436fbf65d48.png)

![406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/b734c2e2-04b7-04a3-7c09-8a3b7809c8a2.png)

![407.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/b1433162-003e-1393-a5ce-69527abe7cd9.png)

VPNの接続が完了します。
![408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/f0fa0900-2dc0-f40f-f22c-4a7d42bbe13e.png)


## 非公開サーバーへSSH接続
起動し直したので「qiita-server」のプライベートIPv4を確認しておきます。
![500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/b1aaa89f-9eb2-f6cc-c59a-bba3c152eb09.png)

sshの設定ファイルを編集しておきます。
HostNameのIPはqiita-severのプライベートIPアドレスを指定します。IdentityFileにはqiita-server作成時に指定したキーペアの「.pem」ファイルを指定します。
※「`xx`」及び「`/xx/xx`」の部分は各自の環境に合わせて変更してください。
```shell:~/.ssh/config
Host qiita-server
  HostName 172.25.xx.xx
  User ec2-user
  IdentityFile /xx/xx.pem

```

「.pem」ファイルのパーミッションを変更しておきます。
※「`/xx/xx`」の部分は各自の環境に合わせて変更してください。
```shell
chmod 0600 /xx/xx.pem
```
※SSH接続時に、以下のエラーが出るためです。
```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/xx/xx.pem' are too open.
It is required that your private key files are NOT accessible by others.
```

sshでqiita-server に接続してみましょう。
```shell
ssh qiita-server
```

インターネットの検索時はNATゲートウェイの固定IP「57.181.73.255」を利用していることが確認できました。またSSHを利用して非公開サーバーに接続ができています。
![501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/38ce1cb9-70f8-ddb1-86e8-aa4105a0372c.png)

VPNの接続をOFFにすると、非公開サーバーである「qiita-server」への接続は失敗することを確認します。また、利用中のグローバルIPも当方の自宅のものに戻っています。
![502.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/be3fa886-edf0-c20a-4a0d-2f0ac7ac8d41.png)

VPN接続時に、qiita-serverへの通信の流れと、インターネット検索時の通信の流れをイメージにすると以下のようになります。通信先が「0.0.0.0/0」の場合はNATゲートウェイを経由して外に出ることができ、通信先が「172.25.0.0/16」の場合は、local内からqiita-serverを見つけだすことができます。
![503image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2990943/45d822ce-bccb-5de7-645f-785ae672e2e5.png)

以上で、IAM Idenitity CenterでSSOできるユーザーを利用して、ClientVPN接続後、非公開サーバーへSSH接続できる環境構築完了です。

## 最後に
本記事で利用したリソースの中でいくつか作成したままだと料金がかかるものがありますので、削除忘れなどにご注意ください。
IAM Identity CenterとClientVPNを利用してみたい方への一助になれば幸いです。

## 参考文献
記事の作成にあたり、以下の情報が大変参考になりました。

・認証と認可に AWS SSO と AWS クライアント VPN を使用する
https://aws.amazon.com/jp/blogs/networking-and-content-delivery/using-aws-sso-with-aws-client-vpn-for-authentication-and-authorization/
・AWS SSO を用いた AWS Client VPN の認証と承認
https://aws.amazon.com/jp/blogs/news/using-aws-sso-with-aws-client-vpn-for-authentication-and-authorization/
・シングルサインオン (SAML 2.0 ベースのフェデレーション認証)
https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/federated-authentication.html
・[AWS Client VPN] VPC を経由して固定のIPでインターネットへアクセスする
https://dev.classmethod.jp/articles/aws-client-vpn-with-static-ip/
・VPC の DNS 属性
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-dns.html#AmazonDNS