Open3

SAMLを試す

ピン留めされたアイテム
bells17bells17

このスクラップについて

SAMLやOIDCを試したかったので、Keycloakを使用して動かしてみるメモ

version

  • keycloak: 21.1.1
bells17bells17

SAMLの検証用プログラム

まずは動作を確認したいので動作プログラム用のリポジトリを作成した

https://github.com/bells17/go-keycloak-example

READMEに書いた通り

1つ目のターミナルで下記コマンドを実行してdocker compose経由でKeycloakを起動する

$ make up

次に2つ目のターミナルで下記のコマンドを実行してGoで実装したSAMLのService Providerサーバーを起動する

$ make run-saml

起動して http://localhost:8000/hello にアクセスするとKeycloak側のログイン画面に飛ばされるのでログインを行う

  • user: sample
  • password: sample

ログインすると再度 http://localhost:8000/hello にリポジトリされて、下記のようにログインしたユーザーの情報が確認できる

ということでひとまず下記の環境で実際にSAMLによるログインができるところまで一通り確認ができた

  • keycloak: IdP(Identity Provider)
  • Go言語の検証アプリ: SP(Service Provider)

検証用のプログラムについて

利用したライブラリである russellhaering/gosaml2 のデモプログラムにちょこっと手を加えただけ

https://github.com/russellhaering/gosaml2/blob/51e598f4c748cea1cf98950aba8e26d9ced56959/s2example/demo.go

KeycloakでSAMLのIdPを構築する

Keycloakを使ってSAMLをテストする系の記事は色々あったんだけど、ちょっと古いのかスクショのUIなどがちょいちょい違っていたりハマりどころがあって実際に動かせるようになるまで結構時間がかかった。

ので今回はハマらないようにRealmの設定をexportしておいた。

https://github.com/bells17/go-keycloak-example/blob/main/keycloak/resource.json

んでexportしたRealmの設定+exportされないユーザー情報などをdocker composeでkeycloakを起動した際に自動で読み込むようにしておいてkeycloak側を設定しないくてもSAMLのログインの動作確認ができるようにしておいた。

https://github.com/bells17/go-keycloak-example/blob/main/docker-compose.yaml

ので動作確認の手順をやるだけで誰でも動作確認できるはず。

Keycloakの設定手順

上記はdocker composeを起動するだけでkeycloakに設定が読み込まれるようにしてあるが、手動で設定するなら下記のように設定する。

Keycloakにアクセス

docker composeを起動したら http://localhost:8080/admin にアクセスする。
アクセスするとログイン画面が表示される。

下記のドキュメントと同じ内容でkeycloakを立ち上げているのでログインユーザーとパスワードは admin:admin となる。

https://www.keycloak.org/getting-started/getting-started-docker

新規にRealmを作成する

Keycloak(や他の類似ツールも?)は1つのKeycloakサーバーで「Realm」という単位で復数のSAMLやOIDCのサーバーを立ち上げることができるよう。
元からあるRealm(master)を利用しても良い気もするけど、一通り自分で作った方が勉強になる気もするので作成した。
下記のような感じで新規のRealmを作成する。

必要な各種リソースを作成する

SAMLログインの検証で利用する各種リソースを作成する。

  1. roleの作成

    はじめにroleを作成する

  2. グループの作成

    検証用のユーザーが所属するグループを作成する。

    そしてグループに先程作成したroleを割り当てる。

  3. ユーザーの作成

    次に検証用のユーザーを作成する。

    作成したらパスワードを設定する。

  4. clientの作成

    検証用アプリケーション側(Service Provider)で使用するclientを作成する。

    また、今回検証用のプログラムは 8000 ポートで起動するので下記のように値を設定する。

    フィールド名
    Root URL http://localhost:8000
    Valid redirect URIs http://localhost:8000*
    Master SAML Processing URL http://localhost:8000/saml/metadata

  5. Client scopeの作成

    作成したclientでログインしたユーザー情報からグループなどの情報を取得できるようにするためにClient scopeの作成と設定を行う。

    作成したら、Client scopeのmapperを作成する。

    最後に作成したclient scopeをRealm roleに割り当てる。

Service Provider側の秘密鍵と証明書を設定する

各種リソースを作成したら、検証用アプリケーション(Service Privider)側に設定する秘密鍵と証明書を設定する。

  • まずは先程作成したclientの詳細ページから「Keys」タブに移動する
  • 移動したら「Certificate」フィールドがあるので、「Regenerate」ボタンを押す
  • 押すと秘密鍵がダウンロードされ、「Certificate」フィールドに表示される証明書情報が更新される

証明書の更新が終わったら検証用リポジトリの

  • sp.key: ダウンロードされた秘密鍵の情報に書き換える
  • sp.cert: 「Certificate」フィールドに表示されている内容を -----BEGIN CERTIFICATE----------END CERTIFICATE----- の間に設定する

ここまでで設定は完了であとは下記のコマンドでGoの検証プログラムを起動して動作確認できるはず

$ make run-saml

参考