ALBとCognitoでプライベートサブネットのサービスに特定ユーザーのみアクセスできるようにしてみた
ゲームソリューション部の えがわ です。
プライベートサブネットに配置している外部公開していないサービスに対して、協力会社やリモートワークなどで外部環境からアクセスが必要になるケースがあります。
今回は、最低限の構成で特定のユーザーのみに限定したアクセス制御を実装してみたので、同じような記事はありますが、備忘録として残します。
前提
- ACM(AWS Certificate Manager)に証明書を設定済み
構成図
今回の構成図はこちらです。
プライベートサブネットに配置しているサービスに対して、特定のユーザーがアクセスできるようにします。
ALBを配置し、任意のパスに対してCognitoで認証を設定します。
なお、認可の設定はないため、複数のサービスがある場合はアプリケーションレイヤーで制御するか、サービス毎にユーザープールを作成する必要があります。
よりセキュアにするために、WAFを追加することをお勧めします。
検証用サービスの準備
想定サービスとして、EC2で最低限のWebサービスを起動しておきます。
mkdir ~/ins1
cat > ~/ins1/index.html << EOF
<!DOCTYPE html>
<html>
<body>
<h1>Ins 1</h1>
</body>
</html>
EOF
python3 -m http.server 8000
Cognitoユーザープールの作成
Cognitoのユーザープールを作成します。
email + パスワードでログインできるように、以下の設定にします。
特定のユーザーのみアクセス可能としたいため、自己登録を無効にします。
セキュリティを向上させるため、MFAも有効にします。
コンソールからログイン可能なユーザーを登録します。
アプリケーションクライアントのログインページセクションの「許可されているコールバック URL」を以下に設定しておきます。
https://{your-domain}/oauth2/idpresponse
ターゲットグループの作成
ALB用のターゲットグループを作成しサービスを起動しているEC2を登録します。
Application Load Balancer(ALB)の作成
次にALBを作成します。
ALB作成時にはターゲットグループの設定が必須となっていますが、この段階ではルールの設定ができません。
HTTPやHTTPSを許可しているセキュリティグループを設定すると、ルールを設定するまで外部に公開されてしまうため、ALB作成時にはダミーターゲットグループを設定するか、何も許可していないセキュリティグループを設定しておくことをお勧めします。
今回は何も許可していないセキュリティグループを設定しています。
リスナールールの設定
設定したルートに対してルールを設定します。
「ユーザーを認証」にチェックを入れ、Amazon Cognito
を選択します。
ユーザープール、ユーザープールドメイン、アプリケーションクライアントを設定して保存します。
これで、リスナールールが設定できました。
次に、セキュリティグループを変更してアクセスできるようにします。
Route53の設定
Route53のレコードを作成し、ALBへルーティングさせます。
動作確認
実際にアクセスしてみます。
ドメインにアクセスすると、Cognitoのログイン画面が表示されます。
作成したユーザーでログインします。初回ログイン時は、メールで送られてきた仮パスワードでログインし、新しいパスワードを設定します。
MFAを有効にしているため、認証アプリを使用する必要があります。
認証が完了すると、対象のWebページが表示されました。
さいごに
今回は、ALBとCognitoを組み合わせて、プライベートサブネットのサービスに対するアクセス制御を実装してみました。
CognitoはALBと簡単に連携できるので、簡単にアクセス制御を行うことが可能です。
ですが、冒頭にも記載していますが、認可の設定はないため、複数のサービスがある場合はアプリケーションレイヤーで制御するか、サービス毎にユーザープールを作成する必要があります。
どなたかの参考になれば幸いです。