概要
AWS Identity Centerに登録したユーザーを利用して、AWS Client VPNでSAML2.0ベースの認証を行い、外部から接続できないサブネットに起動させた非公開サーバーへSSH接続するところまで行います。
上述した非公開サーバーとは、踏み台サーバーや、デプロイ用のサーバー、社内でのみ利用するようなサーバーを想定しています。
記事を書こうと思った経緯
社内でIAMIdenitityCenter+ClientVPNを利用しているので、個人的に気になって構築を始めてみたのですが、なかなか大変だったので、社内の技術共有も兼ねて構築手順を全部見れる記事を作ろうと考えました。
対象読者
以下のような方にはメリットがあるかもしれません。
・IAMIdenitityCenter+ClientVPNってどんな感じで構築するのかざっと全体を知りたい方
・踏み台サーバーなどの接続を安全に行いたい方法を検討中の方(※ClientVPN以外にも安全な方法はあると思いますので1つの手段として捉えていただければ幸いです)
構築後のイメージ
全体をイメージしやすいように、本記事内で構築するイメージを以下に示します。
※白い矢印はVPN接続時の通信の流れとなります。
本記事はハンズオンに近い形で記載しているため、基本的には同じ手順で進められます。
また、作成後に料金が発生するAWSリソースがいくつか利用します。事前に記事内のリソースがいくらかかるのか確認しておくことを推奨します。
それでは、構築を始めていきましょう。
IAM Identity Center ユーザーを準備
事前にIAM Identity Centerを利用できるようにしておきます。参考
認証を行うユーザーを準備します。
今回は「sample-qiita」というユーザーを作ることにします。
「sample-qiita」が所属するグループを作成します。
「グループを作成」の左にある更新ボタン押下後、上記で作成したグループを選択します。
ユーザーが追加されました。メールアドレスは未検証の状態です。
招待メールが来るので、「Accept Invitation」を押下します。
メールアドレスが検証済となり、パスワードの設定画面が表示されますので、そのままパスワードの設定を行います。
今回は、PowerUserAccessを設定したいので、カスタム許可セットを選択します。
PowerUserAccessを選択します。
許可セット名は任意ですが、今回は「SampleQiitaPermissionSet」とし、セッション時間は12時間を選択します。
許可セット「SampleQiitaPermissionSet」が作成されます。
ここから、「SampleQiitaGroup」グループに所属する「sample-qiita」ユーザーは、SSOログイン後、管理アカウントのマネージメントコンソールにログインできるように設定していきます。
IAM Identity Center の AWS アカウントにアクセスし、管理アカウントのリンク(赤矢印部分)を押下します。
このアカウントに、アクセスできるグループと許可セットを割り当てたいので、赤枠の「ユーザーまたはグループを割り当て」を押下します。
「sample-qiita」ユーザーの所属する「SampleQiitaGroup」グループを選択して「次へ」を押下します。
「SampleQiitaGroup」グループには、先ほど作成した許可セット「SampleQiitaPermissionSet」を設定したいので、「SampleQiitaPermissionSet」を選択します。
正常に割り当てられました。
ここまでで、「SampleQiitaGroup」グループに所属する「sample-qiita」ユーザーは、「SampleQiitaPermissionSet」で許可された操作ができる状態で、SSOログインできるようになっています。実際にこれからログインを行なってみます。
IAM Identity Centerのダッシュボードから赤枠の「AWSアクセスポータルのURL」に記載されたリンクへ飛びます。
ログインを行い、MFAの設定後以下のような画面になります。
管理アカウントに、割り当てた許可セットを利用して、マネージメントコンソールに入れるようになりました。
ネットワーク関連の構築
これから行う大まかな流れとしては、VPC作成後に、パブリックサブネットとプロテクトサブネット、プライベートサブネットの三つを作成します。プライベートサブネットは今回利用せず、パブリックサブネットはローカル通信とインターネットゲートウェイへの通信を確保させ、プロテクトサブネットはローカル通信とNATゲートウェイへの通信経路を確保させます。
操作はroot権限でマネージメントコンソールから行い、東京リージョンで作業します。
作成されたVPCを確認
※ローカル通信の経路が設定されたメインルートテーブルは自動作成されています。
サブネットを作成します。VPC IDは先ほど作成した「qiita-vpc」を選択します。
パブリックサブネットとプロテクトサブネット、プライベートサブネットを作成します。
作成されたサブネットを確認します。
「qiita-public-1a」「qiita-protect-1a」「qiita-private-1a」が作成されています。用途別に用意しているだけで冗長性などは考慮していません。
VPCを選択後、赤枠のメインルートテーブルのリンクを押下します。
名称が設定されていないので、「qiita-vpc-main-rtb」と名称を変更しておきます。
インターネットゲートウェイを作成します。
NATゲートウェイ構築時にVPCにインターネットゲートウェイがアタッチされている必要があるため事前に作成します。
「qiita-igw」という名前でインターネットゲートウェイを作成します。
作成したインターネットゲートウェイをqiita-vpcにアタッチさせます。
「qiita-vpc」を選択して、「インターネットゲートウェイのアタッチ」を押下します。
ルートテーブルの作成
各サブネットに関連づける用途で3つルートテーブルを作成します。
パブリックサブネットに関連づけるためのルートテーブル「qiita-vpc-public-rtb」を作成
プロテクトサブネットに関連づけるためのルートテーブル「qiita-vpc-protect-rtb」を作成
プライベートサブネットに関連づけるためのルートテーブル「qiita-vpc-private-rtb」を作成
「qiita-vpc-public-rtb」のルート編集へ向かいます。
「qiita-vpc-public-rtb」にインターネットゲートウェイへの通信経路を追加します。
NATゲートウェイを作成します。
※今回はVPN経由の通信を行う際に、NATゲートウェイを経由して固定IPを利用したいので「ElasticIPを割り当て」を押下して固定IPを取得します。
作成後、3分くらいでAvaillableに切り替わります。
※切り替わらない場合は、VPNにインターネットゲートウェイがアタッチされているか確認してみると良いかもしれません。
NATゲートウェイが利用可能になったので、「qiita-vpc-protect-rtb」のルートを編集しに向かいます。
外向きの通信であれば、先ほど作成したNATゲートウェイに向かわせるように経路を追加します。
「qiita-vpc-public-rtb」の「サブネットの関連づけを編集」に向かいます。
「qiita-vpc-public-rtb」に、「qiita-public-1a」を関連づけます。
同様に、「qiita-vpc-protect-rtb」に、「qiita-protect-1a」を関連づけ、「qiita-vpc-private-rtb」に、「qiita-private-1a」を関連づけます。
ここまでの作業で以下のようなリソースマップになっていればOKです。
非公開サーバーの準備
非公開サーバー(EC2)を用意していきます。
これから作成する非公開サーバーの名前は「qiita-server」とします。
「qiita-server」に設定するセキュリティグループを作成します。
今回以下のようなルールでセキュリティグループを作成します。
※名称は「qiita-server-sg」とします。
※ClientVPN経由でSSHするだけであれば、アウトバウンドルールのSSH,HTTP,HTTPSのルールは不要です。「qiita-server」にてyumやgithubの利用予定があるため今回設定しています。
非公開サーバー「qiita-server」を作成していきます。
今回は新しくキーペアを作成します。
※既存のキーペアがあればそちらを利用いただいても問題ありません。
※「.pem」ファイルはSSH接続の際に必要になるため、自分がわかる場所に保管しておいてください。
VPCは作成した「qiita-vpc」を選択します。
サブネットは作成した「qiita-protect-1a」を選択します。
セキュリティグループは作成した「qiita-server-sg」を選択します。
Route53でドメイン登録
ClientVPNでACMの証明書を利用するので、ACMのパブリック証明書を発行したいと思います。
ただ、自動更新してくれるAWSが発行する証明書を利用したいので、証明書をインポートするのではなく、今回はRoute53で独自ドメインを購入します。購入後、そのドメインでACMのパブリック証明書を発行します。
まだ、ステータスが「進行中」なことを確認します。
※この時点では、ドメインの登録はできていません。
AWSからメールが来るので、メールアドレスの検証を行い
ステータスが「成功」になればOKです。
ACMでパブリック証明書を発行
ドメインが登録できたので、ACMでパブリック証明書を発行していきます。
Amazon Certificate Managerから、「リクエスト」を押下します。
ACMの検証に必要なCNAMEレコードを作成するために、ドメイン名のリンク(赤枠部分)を押下します。
Route53で作成されたCNAMEレコードが確認可能です(赤枠部分)。
しばらくすると、ステータスが「発行済み」になります。
これでパブリック証明書の発行は完了です。
Client VPN 利用準備
IAM Identity Center でアプリケーションを作成
IAM Identity Center の「アプリケーションを追加」を押下します。
「設定するアプリケーションがある」「SAML2.0」を選択します。
後ほど使うため「IAM Identity Center SAML メタデータファイル」のダウンロードリンクからXMLファイルをダウンロードしておきます。
「アプリケーションACS URL」にhttp://127.0.0.1:35001
を入力し、
「アプリケーションSAML対象者」にurn:amazon:webservices:clientvpn
を入力後、
「送信」を押下します。
※以下を参考に入力を行っています。
https://aws.amazon.com/jp/blogs/networking-and-content-delivery/using-aws-sso-with-aws-client-vpn-for-authentication-and-authorization/
IAM IDプロバイダ 追加
先ほどダウンロードしたXMLファイル(SAML メタデータファイル)をファイル選択部分で選びます。他の項目はスクショを参考に入力後、「プロバイダを追加」を押下します。
Client VPN Endpoint 作成
スクショを参考に入力を行います。
※クライアント IPv4 CIDR はVPN接続したユーザーに割り当てられるIPの範囲と思われます。今回はVPCのIPレンジと被らないように「172.26.0.0/22」を設定しています。
※接続ログ記録の部分で、選択しているロググループは記事外で作成したものです。同じようにしたい場合は、CloudWatchにて「client-vpn」というロググループを作成していただければ同じように進められます。
スクショを参考に入力を行います。
入力完了後に、「クライアントVPNエンドポイントを作成」を押下します。
※「DNSサーバー1 IPアドレス」には、VPC「qiita-vpc」の「Amazon Route 53 Resolver」がある「172.25.0.2」を指定しています(参考)。今回の構築では、非公開サーバーへIPアドレスでSSH接続を行うので未指定でも問題ありません。
※VPCは「qiita-vpc」を、セキュリティグループはデフォルトのセキュリティグループを指定しています。
クライアントVPNエンドポイントが作成されました。状態は「Pending associate」です。
状態をActiveにさせるために、赤枠を押下してサブネット「qiita-protect-1a」と紐付けします。
qiita-vpcとqiita-protect-1aを選択して、「ターゲットネットワークと関連づける」を押下します。しばらくすると状態がActiveになるはずです。
以下、IAM Identity Centerで作成したグループ「SampleQiitaGroup」のグループIDを、コピーしておきます。
コピーしておいたグループIDをアクセスグループIDにペーストして、アクセスを有効にする送信先ネットワークに「0.0.0.0/0」を指定して、「認証ルールを追加」を押下します。
VPNに接続した状態で普通にGoogle検索なども行いたいので、ルートを作成します。
IAM Identity Center アプリケーション 追加作業
作成しておいた「SampleQiitaGroup」を選択して、「ユーザーを割り当て」を押下します。
割り当てられたユーザーとグループに「SampleQiitaGroup」が追加されていればOKです。
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」ファイルをダウンロードしておきます。
AWS VPN Clientを起動して、赤枠のプロファイルを管理を選択します。
Client VPN 接続
プロファイルの追加完了後、「接続」を押下してVPN接続を試行します。
認証用の画面が開かれるので、「sample-qiita」ユーザーで認証を行います。
非公開サーバーへSSH接続
起動し直したので「qiita-server」のプライベートIPv4を確認しておきます。
sshの設定ファイルを編集しておきます。
HostNameのIPはqiita-severのプライベートIPアドレスを指定します。IdentityFileにはqiita-server作成時に指定したキーペアの「.pem」ファイルを指定します。
※「xx
」及び「/xx/xx
」の部分は各自の環境に合わせて変更してください。
Host qiita-server
HostName 172.25.xx.xx
User ec2-user
IdentityFile /xx/xx.pem
「.pem」ファイルのパーミッションを変更しておきます。
※「/xx/xx
」の部分は各自の環境に合わせて変更してください。
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 に接続してみましょう。
ssh qiita-server
インターネットの検索時はNATゲートウェイの固定IP「57.181.73.255」を利用していることが確認できました。またSSHを利用して非公開サーバーに接続ができています。
VPNの接続をOFFにすると、非公開サーバーである「qiita-server」への接続は失敗することを確認します。また、利用中のグローバルIPも当方の自宅のものに戻っています。
VPN接続時に、qiita-serverへの通信の流れと、インターネット検索時の通信の流れをイメージにすると以下のようになります。通信先が「0.0.0.0/0」の場合はNATゲートウェイを経由して外に出ることができ、通信先が「172.25.0.0/16」の場合は、local内からqiita-serverを見つけだすことができます。
以上で、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