ブログ

ryuzeeによるブログ記事。不定期更新

Keycloakを使ってAWSにSSO接続する方法

みなさんこんにちは。@ryuzeeです。

たくさんのAWSアカウントを持っていたり、さまざまな外部サービスを使っていたりすると面倒なのが、アカウント自体の管理です。 今日はKeycloakを使って、たくさんのAWSアカウントにSSO接続するようにしてみたいと思います。

Keycloakとは

Keycloakは認証・認可のためのオープンソースソフトウェアです。最新のバージョンは4.1.0です。 より詳細については@ITの記事がわかりやすいです。

Keycloakの導入

KeycloakはJavaで書かれており、動作にはアプリケーションサーバが必要です。 アプリケーションで利用可能なデータベースは、MySQL、PostgreSQL、MariaDB、そして主に開発や試用用途のH2です。

また、公式のDockerイメージも用意されており、それを使えばアプリケーションサーバの設定などは不要です。 今回は簡単にするため、Dockerを使ってみましょう。

docker-composeを使うのが簡単で、以下から入手できます。

ここでは、PostgreSQLを使います。

wget https://github.com/jboss-dockerfiles/keycloak/raw/master/docker-compose-examples/keycloak-postgres.yml
docker-compose -f keycloak-postgres.yml

とすれば起動します。起動後にhttp://localhost:8080にアクセスして以下のような画面が表示されればOKです。

Keycloakへのログイン

画面のAdministration Consoleをクリックして管理者画面にログインします。 管理者アカウントの初期ユーザーとパスワードはdocker-composeの中で、KEYCLOAK_USERKEYCLOAK_PASSWORDで定義されているので、それを使います。

ログイン後には以下のような画面が表示されます。

ここは特にいじる箇所がないので、AWSのSSOの設定に進みましょう。

AWSのSAML情報を取得する

まず、AWSのSAML情報を以下のコマンドで取得し、ローカルに保存します。

wget https://signin.aws.amazon.com/static/saml-metadata.xml

クライアントを追加する

Clientsにアクセスすると、以下のようにクライアントの一覧が表示されます。 画面右側にあるCreateボタンをクリックします。

クライアントの追加画面が下のように表示されます。

  • Importを選択し、先程ダウンロードしたsaml-metadata.xmlを指定します
  • Base URLには/auth/realms/master/protocol/saml/clients/amazon-awsを指定します
  • IDP Initiated SSO URL Nameにはamazon-awsを指定します

それが終わったらSaveボタンをクリックします。 以下のような画面が表示されるはずです。

AWSのSAML Provider用の設定ファイルを取得する

Installation タブにアクセスし、SAML Metadata IDPSSODescriptorを選択します。 以下のように表示されますので、Downloadをクリックしてファイルを保存します。 client-tailored-saml-idp-metadata.xmlという名前のファイルができたことを確認しておきます。

AWS(統合したいアカウントそれぞれ)上でSAML Providerの設定をする

SSO接続したいAWSアカウントの設定を行います。

  • マネジメントコンソールでIAMにアクセスし、Identity providers(日本語だとIDプロバイダ)を選択します
  • Create Providerをクリック。Provider TypeSAMLを選択します
  • Provider Nameには適当な名前を指定します
  • Metadata Documentには先ほどKeycloakからダウンロードしたXML(client-tailored-saml-idp-metadata.xml)を指定します

なお、awscliを利用する場合は以下のようなコマンドで作成できます(nameオプションは自分の好みにします)。

aws iam create-saml-provider --saml-metadata-document file://./client-tailored-saml-idp-metadata.xml --name docker-keycloak

ここで作成されたSAMP ProviderのARN(arn:aws:iam::211111666666:saml-provider/docker-keycloakのようなもの)は後で使いますので控えておきます(※1)。

AWS(統合したいアカウントそれぞれ)上にIAM Roleを作成する

次に、SSO経由でログインしたユーザーに割り当てるIAM Roleを作成します。

またIAM Roleの画面で信頼関係を編集し、以下のようなポリシードキュメントに更新します。 Principalの値は各自異なります(アカウント番号やSAM Provierの名前など自分のものに合わせます)。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::211111666666:saml-provider/docker-keycloak"
      },
      "Action": "sts:AssumeRoleWithSAML",
      "Condition": {
        "StringEquals": {
          "SAML:aud": "https://signin.aws.amazon.com/saml"
        }
      }
    }
  ]
}

なお、CloudFormationで作成したい場合は、こちらからスクリプトをダウンロードし、中身を書き換えて(RoleNameなど)以下のように実行すると良いでしょう。

aws cloudformation create-stack --capabilities CAPABILITY_NAMED_IAM --stack-name sso-roles --template-body file://./sso-roles-cfn.yaml

ここで作成したIAM RoleのARNもあとで使いますので控えておきます(※2)。

以上ができたらKeycloak側に戻ります。

ロールの作成

新規でロールを作成するためにAdd Roleを選択します。 以下のような画面が表示されるので、

  • Nameの箇所にIAM RoleのARN、SAML ProviderのARNをカンマで結合して入力します(※1と※2を結合します)。
  • Descriptionの箇所は説明なので、適当に入れておきます。

入力が終わったらSaveをクリックします。

この作業もSSO対象のAWSアカウントの数だけ繰り返します。

Mapperの定義

次にMapperを定義します。Mappersを選択して、Createをクリックして3つの設定を作成します。

  • Session Role
    • Name:Session Role
    • Mapper Type:Role list
    • Role attribute name:https://aws.amazon.com/SAML/Attributes/Role
    • Friendly Name:Session Role
    • SAML Attribute Name Format:Basic
    • Single Role Attribute:ON
  • Session Name
    • Name:Session Name
    • Mapper Type:User Property
    • Property:username
    • Friendly Name:Session Name
    • SAML Attribute Name:https://aws.amazon.com/SAML/Attributes/RoleSessionName
    • SAML Attribute Name Format:Basic
  • Session Duration
    • Name:Session Duration
    • Mapper Type:Hardcoded attribute
    • Friendly Name:Session Duration
    • SAML Attribute Name:https://aws.amazon.com/SAML/Attributes/SessionDuration
    • SAML Attribute Name Format:Basic
    • Attribute value:28800

入力の結果、以下のようになればOKです。

続いてClient Scopesを選択し、Assigned Default Client Scopesの中にrole_listがある場合はRemove selectedをクリックして選択を解除します。 以下のようになれば大丈夫です。

スコープの設定

次にScopeにアクセスし、Full Scope Allowed をOffに設定します。

以上で、クライアントの設定は終了です。

ユーザー作成

続いてユーザーを作成して、権限を割り当てていきます。

左ナビゲーションのUsersを選択すると、一覧画面が表示されるので、Add userをクリックします。 そこで必要な情報を入力してSaveします。以下のような画面が表示されるはずです。

Rolle Mappingsタブに移動すると、左側にClient Rolesのプルダウンからurn:amazon:webservicesを選択します。 Available Rolesの中から当該のアカウントに割り当てたいロールを選択して、Add selectedを選択します。

この作業は利用するAWSアカウント分繰り返します。

また初期パスワードも設定します。Credentialsタブに移動して、Manage Passwordの項目を設定しておきます。

準備完了

以上で準備完了です。

http://localhost:8080/auth/realms/master/protocol/saml/clients/amazon-awsにアクセスして、ログインすると、AWSの画面が次のような感じで表示されれば成功です。

おまけ

このままだと、ローカルのPC上なので実用できないので、Azure上に環境を用意します。

Azure上に環境を作るときは、Azure Cloud Shellを活用するのが便利です。以下を貼り付けると10分くらいで環境が出来上がります(※パスワードなどは適宜変更します)。 なお、追加のパラメータでJDBCの設定をしておくとよさそうです。

export rand=$RANDOM
export resourcegroup=keycloak-$rand
export appservice_plan=appserviceplan$rand
export appservice_name=keycloak-app-$rand
export region='Japan West'
export appservice_instance=B1
export db_server_name=db$rand
export db_admin_user=adminuser
# !!!CHANGE VALUE!!!
export db_admin_password=CHANGE_ME_CHANGE_ME!
export db_sku=B_Gen4_1
export db_firewall_rule=db$rand
export db_name=keycloak$rand
export db_addr="$db_server_name.postgres.database.azure.com"
export db_vendor=postgres
export container_image=jboss/keycloak
export keycloak_user=admin
# !!!CHANGE VALUE!!!
export keycloak_password=CHANGE_ME_CHANGE_ME!

az group create \
   --name "$resourcegroup" \
   --location "$region"

az appservice plan create \
   --name "$appservice_plan" \
   --resource-group "$resourcegroup" \
   --sku "$appservice_instance" \
   --is-linux

az postgres server create \
   --resource-group "$resourcegroup" \
   --name "$db_server_name" \
   --location "$region" \
   --admin-user "$db_admin_user" \
   --admin-password "$db_admin_password" \
   --sku-name "$db_sku" \
   --storage-size 51200 \
   --version "9.6" \
   --ssl-enforcement "Disabled"

az postgres server firewall-rule create \
   --name "$db_firewall_rule" \
   --server "$db_server_name" \
   --resource-group "$resourcegroup" \
   --start-ip-address 0.0.0.0 \
   --end-ip-address 255.255.255.255

az postgres db create \
   --resource-group "$resourcegroup" \
   --server-name "$db_server_name" \
   --name "$db_name"

az webapp create \
   --resource-group "$resourcegroup" \
   --plan "$appservice_plan" \
   --name "$appservice_name" \
   --deployment-container-image-name "$container_image"

az webapp config appsettings set \
   --resource-group "$resourcegroup" \
   --name "$appservice_name" \
   --settings \
     PROXY_ADDRESS_FORWARDING=true \
     DB_VENDOR=$db_vendor \
     DB_DATABASE="$db_name" \
     DB_ADDR="$db_addr" \
     DB_USER="$db_admin_user@$db_server_name" \
     DB_PASSWORD="$db_admin_password" \
     KEYCLOAK_USER="$keycloak_user" \
     KEYCLOAK_PASSWORD="$keycloak_password" \
     JDBC_PARAMS="autoReconnect=true"

それでは。

アジャイルコーチングやトレーニングを提供しています

株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。

詳細はこちら
  • スクラム実践者が知るべき97のこと
  • 著者/訳者:Gunther Verheyen / 吉羽龍太郎 原田騎郎 永瀬美穂
  • 出版社:オライリージャパン(2021-03-23)
  • 定価:¥ 2,640
  • スクラムはアジャイル開発のフレームワークですが、その実装は組織やチームのレベルに応じてさまざまです。本書はスクラムの実践において、さまざまな課題に対処してきた実践者が自らの経験や考え方を語るエッセイ集です。日本語書き下ろしコラムを追加で10本収録
  • プロダクトマネジメント ―ビルドトラップを避け顧客に価値を届ける
  • 著者/訳者:Melissa Perri / 吉羽龍太郎
  • 出版社:オライリージャパン(2020-10-26)
  • 定価:¥ 2,640
  • プロダクト開発を作った機能の数やベロシティなどのアウトプットで計測すると、ビルドトラップと呼ばれる失敗に繋がります。本書ではいかにしてビルドトラップを避けて顧客に価値を届けるかを解説しています。
  • SCRUM BOOT CAMP THE BOOK 【増補改訂版】
  • 著者/訳者:西村直人 永瀬美穂 吉羽龍太郎
  • 出版社:翔泳社(2020-05-20)
  • 定価:¥ 2,640
  • スクラム初心者に向けて基本的な考え方の解説から始まり、プロジェクトでの実際の進め方やよく起こる問題への対応法まで幅広く解説。マンガと文章のセットでスクラムを短期間で理解できます。スクラムの概要を正しく理解したい人、もう一度おさらいしたい人にオススメ。
  • みんなでアジャイル ―変化に対応できる顧客中心組織のつくりかた
  • 著者/訳者:Matt LeMay / 吉羽龍太郎、永瀬美穂、原田騎郎、有野雅士
  • 出版社:オライリージャパン(2020-3-19)
  • 定価:¥ 2,640
  • アジャイルで本当の意味での成果を出すには、開発チームだけでアジャイルに取り組むのではなく、組織全体がアジャイルになる必要があります。本書にはどうやってそれを実現するかのヒントが満載です
  • レガシーコードからの脱却 ―ソフトウェアの寿命を延ばし価値を高める9つのプラクティス
  • 著者/訳者:David Scott Bernstein / 吉羽龍太郎、永瀬美穂、原田騎郎、有野雅士
  • 出版社:オライリージャパン( 2019-9-18 )
  • 定価:¥ 3,132
  • レガシーコードになってから慌てるのではなく、日々レガシーコードを作らないようにするにはどうするか。その観点で、主にエクストリームプログラミングに由来する9つのプラクティスとその背後にある原則をわかりやすく説明しています。
  • Effective DevOps ―4本柱による持続可能な組織文化の育て方
  • 著者/訳者:Jennifer Davis、Ryn Daniels / 吉羽 龍太郎、長尾高弘
  • 出版社:オライリージャパン( 2018-3-24 )
  • 定価:¥ 3,888
  • 主にDevOpsの文化的な事柄に着目し、異なるゴールを持つチームが親和性を高め、矛盾する目標のバランスを取りながら最大限の力を発揮する方法を解説します
  • ジョイ・インク 役職も部署もない全員主役のマネジメント
  • 著者/訳者:リチャード・シェリダン / 原田騎郎, 安井力, 吉羽龍太郎, 永瀬美穂, 川口恭伸
  • 出版社:翔泳社( 2016-12-20 )
  • 定価:¥ 1,944
  • 米国で何度も働きやすい職場として表彰を受けているメンローの創業者かつCEOであるリチャード・シェリダン氏が、職場に喜びをもたらす知恵や経営手法、より良い製品の作り方などを惜しみなく紹介しています
  • アジャイルコーチの道具箱 – 見える化の実例集
  • 著者/訳者:Jimmy Janlén / 原田騎郎, 吉羽龍太郎, 川口恭伸, 高江洲睦, 佐藤竜也
  • 出版社:Leanpub( 2016-04-12 )
  • 定価:$14.99
  • この本は、チームの協調とコミュニケーションを改善したり、行動を変えるための見える化の実例を集めたものです。96個(+2)の見える化の方法をそれぞれ1ページでイラストとともに解説しています。アジャイル開発かどうかに関係なくすぐに使えるカタログ集です
  • カンバン仕事術 ―チームではじめる見える化と改善
  • 著者/訳者:原田騎郎 安井力 吉羽龍太郎 角征典 高木正弘
  • 出版社:オライリージャパン( 2016-03-25 )
  • 定価:¥ 2,138
  • チームの仕事や課題を見える化する手法「カンバン」について、その導入から実践までを図とともにわかりやすく解説した書籍。カンバンの原則などの入門的な事柄から、サービスクラス、プロセスの改善など、一歩進んだ応用的な話題までを網羅的に解説します。
  • Software in 30 Days スクラムによるアジャイルな組織変革“成功"ガイド
  • 著者/訳者:Ken Schwaber、Jeff Sutherland著、角征典、吉羽龍太郎、原田騎郎、川口恭伸訳
  • 出版社:アスキー・メディアワークス( 2013-03-08 )
  • 定価:¥ 1,680
  • スクラムの父であるジェフ・サザーランドとケン・シュエイバーによる著者の日本語版。ビジネス層、マネジメント層向けにソフトウェア開発プロセス変革の必要性やアジャイル型開発プロセスの優位性について説明
  • How to Change the World 〜チェンジ・マネジメント3.0〜
  • 著者/訳者:Jurgen Appelo, 前川哲次(翻訳), 川口恭伸(翻訳), 吉羽龍太郎(翻訳)
  • 出版社:達人出版会
  • 定価:500円
  • どうすれば自分たちの組織を変えられるだろう?それには、組織に変革を起こすチェンジ・マネジメントを学習することだ。アジャイルな組織でのマネージャーの役割を説いた『Management 3.0』の著者がコンパクトにまとめた変化のためのガイドブック