本記事はFIXER Advent Calendar 2024( FIXER Advent Calendar 2024 ~tech編~ )12月3日の記事です。
はじめに
AWSマネジメントコンソール を Discord認証 で SSO(シングルサインオン)する方法を備忘録としてまとめました。長編になるため、Part1とPart2に分けて投稿してます。Part2は、12月16日 に公開予定です。
概要
AWSのIAM Identity Centerでは、SSO(シングルサインオン)のプロトコルとしてSAML2.0が使用されます。Microsoft Entra IDやGoogle WorkspaceなどのIdP(Identity Provider)を使用してIDを認証し、SP(Service Provider)であるAWSにログインすることが可能です。
しかし、AWSの公式ドキュメントで紹介されているIdPのほとんどはエンタープライズ向けであるため、個人利用には少しハードルが高いです。そこで、普段よく使っている Discord をIdPとして活用したいと考えました。しかし、Discord は OAuth2 にしか対応しておらず、そのままでは SAML を利用する AWS で SSO を実現することはできません。
そこで、Discordの代わりに Keycloak を利用することにしました。Keycloakを使ってDiscordのOAuth2で認証し、アカウントを作成します。そして、AWSをSP(Service Provider)、KeycloakをIdP(Identity Provider)としてSAML認証を設定します。これにより、AWSからKeycloakを中継してDiscordの認証を通す仕組みを構築します。
前提条件
- Ubuntu(Ubuntu Server 24.04 LTS (HVM), SSD Volume Type)
- Keycloak 26.0.5
- IAM Identity Centerを有効化済み
今回は、AWSのパブリックサブネット上にEC2インスタンスを構築します。
インターネットからアクセスできればよいため、AzureやGoogle Cloudなど他のクラウドプロバイダーを使用する場合や、Ubuntu以外のLinuxディストリビューションを選択する場合でも、大きな手順の違いはないと思われます。
なお、後の手順でHTTPS接続が必要になります。今回は本筋から外れるため手順を省略しますが、私はCloudflareでドメインを取得し、Let’s Encryptを使用して証明書を発行しました。
Keycloakの実行にはJavaが必要です。今回使用した「Ubuntu Server 24.04 LTS (HVM), SSD Volume Type」のAMIにはJavaが含まれていないため、事前に apt コマンドなどを使用してJava 21をインストールしてください。
Keycloakの導入
まずは、Keycloakを公式サイトからダウンロードし、展開します。ファイル形式はZIPでもTAR.GZでもどちらでも問題ありません。
次に、KeycloakでDiscordを扱えるようにするアドオンをGitHubからダウンロードします。このアドオンは、KeycloakとDiscordを統合するために必要な機能を提供します。
最後に、ダウンロードしたJARファイルを keycloak-26.0.5/providers ディレクトリにコピーします。以下のコマンドを実行してKeycloakを起動してください。
sudo keycloak-26.0.5/bin/kc.sh start-dev --bootstrap-admin-username admin --bootstrap-admin-password admin --https-certificate-file=<証明書のパス> --https-certificate-key-file=<秘密鍵のパス>
bootstrap-admin-username と bootstrap-admin-password は任意の値に設定して問題ありません。
設定後、ブラウザ上で、https://<ドメイン名>:8443 にアクセスし、管理コンソールを開きます。ログイン時には、オプションで指定したユーザー名とパスワード(今回の例では admin と admin)を使用してください。
一時的な管理者ユーザーである旨の警告が表示されますが、今回は検証目的のため、無視して問題ありません。
KeycloakとDiscordの連携
Discord Applicationの用意
1. Discord Developer Portal にアクセスします。
2. 左上の 「New Application」 をクリックし、新しいアプリケーションを作成します。名前は「AWS-SSO」など、適当なものを付けてください。
3. アプリケーションが作成できたら、左側のペインから 「OAuth2」 を選択します。
4. 表示された CLIENT ID と CLIENT SECRET を控えておきます。
※CLIENT SECRET は初期状態では非表示になっているため、リセットして表示させてください。
Redirects の項目には、後ほど Keycloak 側で取得する Redirect URI を入力します。この段階では未確定のため、Keycloak の設定が完了した後に追加してください。
KeycloakにDiscord Applicationを登録
1. Keycloak の管理コンソールで、左ペインの 「Identity providers」 を開き、一覧から Discord を選択します。
2. 先ほど控えておいた CLIENT ID と CLIENT SECRET を入力します。
3. ページ下部にある 「Guild Id(s) to allow federation」 には、対象とする Discord サーバの Guild ID を入力します。この設定を有効にすることで、指定したサーバに所属しているユーザーのみがログインできるようになります。
※この設定を省略すると、Discord のアカウントさえ持っていれば誰でも Keycloak アカウントを作成できてしまうため、必ず設定してください。
Guild ID は Discord の詳細設定から開発者モードを有効にしたうえでサーバーアイコンを右クリックで取得できます。
4. Keycloak の Discord Identity Provider 設定画面で表示されている Redirect URI をコピーします。
5. Discord Developer Portal で作成したアプリケーションの Redirects 項目に、この URI を入力し、設定を保存します。
ここまでの設定が完了すると、Keycloak に Discord を使ったログイン機能が追加されています。
ブラウザ上で、https://ドメイン名:8443/realms/master/account にアクセスするとDiscordでログインできるようになっているのがわかります。
もしログイン画面が表示されない場合は、Keycloak 管理コンソールの右上に表示されているユーザー名をクリックし、一度ログアウトしてから再度試してください。
これで、Discord の認証情報を使用して Keycloak にアカウントを作成できるようになりました。次回の Part2 では、今回 Keycloak に作成したアカウントを使用して、AWS のマネジメントコンソールにSSOする手順を説明します。お楽しみに!