AWSマネジメントコンソールをDiscord認証でSSO設定する手順 - Part 1
2024-12-03
azblob://2024/12/02/eyecatch/2024-12-03-discord-sso-part1-000.jpg

本記事は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の認証を通す仕組みを構築します。

AWSからKeycloakを経由してDIsocrdにログイン要求を行う

前提条件

  • 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 IDCLIENT SECRET を控えておきます。

CLIENT SECRET は初期状態では非表示になっているため、リセットして表示させてください。


Discord ApplicationのClient IDとClient Secret取得
Redirects の項目には、後ほど Keycloak 側で取得する Redirect URI を入力します。この段階では未確定のため、Keycloak の設定が完了した後に追加してください。

KeycloakにDiscord Applicationを登録

1. Keycloak の管理コンソールで、左ペインの 「Identity providers」 を開き、一覧から Discord を選択します。

2. 先ほど控えておいた CLIENT IDCLIENT SECRET を入力します。

3. ページ下部にある 「Guild Id(s) to allow federation」 には、対象とする Discord サーバの Guild ID を入力します。この設定を有効にすることで、指定したサーバに所属しているユーザーのみがログインできるようになります。

※この設定を省略すると、Discord のアカウントさえ持っていれば誰でも Keycloak アカウントを作成できてしまうため、必ず設定してください。


Guild ID は Discord の詳細設定から開発者モードを有効にしたうえでサーバーアイコンを右クリックで取得できます。
KeycloakにDiscordプロバイダーを登録

4. Keycloak の Discord Identity Provider 設定画面で表示されている Redirect URI をコピーします。

5. Discord Developer Portal で作成したアプリケーションの Redirects 項目に、この URI を入力し、設定を保存します。

ここまでの設定が完了すると、Keycloak に Discord を使ったログイン機能が追加されています。

ブラウザ上で、https://ドメイン名:8443/realms/master/account にアクセスするとDiscordでログインできるようになっているのがわかります。
ログイン画面にDiscordが増えている
もしログイン画面が表示されない場合は、Keycloak 管理コンソールの右上に表示されているユーザー名をクリックし、一度ログアウトしてから再度試してください。

これで、Discord の認証情報を使用して Keycloak にアカウントを作成できるようになりました。次回の Part2 では、今回 Keycloak に作成したアカウントを使用して、AWS のマネジメントコンソールにSSOする手順を説明します。お楽しみに!