SAMLを試す
このスクラップについて
SAMLやOIDCを試したかったので、Keycloakを使用して動かしてみるメモ
version
- keycloak: 21.1.1
SAMLの検証用プログラム
まずは動作を確認したいので動作プログラム用のリポジトリを作成した
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
のデモプログラムにちょこっと手を加えただけ
KeycloakでSAMLのIdPを構築する
Keycloakを使ってSAMLをテストする系の記事は色々あったんだけど、ちょっと古いのかスクショのUIなどがちょいちょい違っていたりハマりどころがあって実際に動かせるようになるまで結構時間がかかった。
ので今回はハマらないようにRealmの設定をexportしておいた。
んでexportしたRealmの設定+exportされないユーザー情報などをdocker composeでkeycloakを起動した際に自動で読み込むようにしておいてkeycloak側を設定しないくてもSAMLのログインの動作確認ができるようにしておいた。
ので動作確認の手順をやるだけで誰でも動作確認できるはず。
Keycloakの設定手順
上記はdocker composeを起動するだけでkeycloakに設定が読み込まれるようにしてあるが、手動で設定するなら下記のように設定する。
Keycloakにアクセス
docker composeを起動したら http://localhost:8080/admin にアクセスする。
アクセスするとログイン画面が表示される。
下記のドキュメントと同じ内容でkeycloakを立ち上げているのでログインユーザーとパスワードは admin:admin
となる。
新規にRealmを作成する
Keycloak(や他の類似ツールも?)は1つのKeycloakサーバーで「Realm」という単位で復数のSAMLやOIDCのサーバーを立ち上げることができるよう。
元からあるRealm(master)を利用しても良い気もするけど、一通り自分で作った方が勉強になる気もするので作成した。
下記のような感じで新規のRealmを作成する。
必要な各種リソースを作成する
SAMLログインの検証で利用する各種リソースを作成する。
-
roleの作成
はじめにroleを作成する
-
グループの作成
検証用のユーザーが所属するグループを作成する。
そしてグループに先程作成したroleを割り当てる。
-
ユーザーの作成
次に検証用のユーザーを作成する。
作成したらパスワードを設定する。
-
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 -
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
参考
- https://github.com/keycloak/keycloak-quickstarts - keycloakのexample集
- https://github.com/keycloak/keycloak/blob/main/quarkus/container/Dockerfile - keycloakのDockerfile
- https://qiita.com/ymstshinichiro/items/f0b231d4bf5d020f7e3b
- https://qiita.com/sibakenY/items/113ef1439aaaa1e86184
- https://qiita.com/ogawa_pro/items/7b5989243e5339d65203
- https://qiita.com/gebo/items/766855b346324c8d61df
- https://www.onelogin.com/jp-ja/learn/oidc-vs-saml
SAMLについて
自分で細かくまとめられてないけどここらへんを読んでおけば良さそう
- https://qiita.com/taxin/items/bc66fc8d26f804202d7d
- https://tech-blog.rakus.co.jp/entry/20230301/saml
- https://tech-blog.rakus.co.jp/entry/20230210/sso
- https://devblog.thebase.in/entry/2022/10/03/180000
- https://tech.techtouch.jp/entry/saml
- https://zenn.dev/wadahiro/articles/61d39d263dd9e8
- https://milestone-of-se.nesuke.com/product/oss/saml/
- https://blog.cybozu.io/entry/4224
- https://techinfoofmicrosofttech.osscons.jp/index.php?SAMLの仕様を読む。
- http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html
- https://tex2e.github.io/rfc-translater/html/rfc7522.html
- https://en.wikipedia.org/wiki/Security_Assertion_Markup_Language
- https://en.wikipedia.org/wiki/Single_sign-on
- http://saml.xml.org/saml-specifications