こんにちは
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
最近、本業でSAML認証に絡んだ検証をしないといけなくなり、ちょっと環境を作りたくなったのでKeycloakとGrowiをデプロイして勉強していきたいと思います。
※メモベースなので雑いのですが、そのうち整備します。
Keycloakとは
Red Hatによって開発されたオープンソースのアイデンティティ・アクセス管理(IAM: Identity and Access Management)ソフトウェア。Webアプリケーションやサービスに対して、最小限の労力で認証機能を追加し、セキュリティを確保することが可能になる。
今回構築する環境
Linuxに環境を用意するのが面倒だったので、今回はWindows11にWSLとDockerDesktopをインストールして、そこでデプロイをしております。
構築
Keycloakのデプロイ
C:\Users\ohtsu>docker run -d -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:26.0.6 start-dev
Growi
MongoDBのデプロイ
C:\Users\ohtsu>docker run -d --name growi-mongodb --restart unless-stopped -v growi-mongodb-data:/data/db -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=password mongo:7
Growiのデプロイ
C:\Users\ohtsu>docker run -d --name growi --restart unless-stopped --link growi-mongodb:mongodb -p 3000:3000 -e MONGO_URI=mongodb://admin:password@mongodb:27017/growi?authSource=admin -e PASSWORD_SEED=changeme -e FILE_UPLOAD=local weseek/growi:7
KeycloakでSAML環境用意 #1
http://localhost:8080にアクセスします。
以下の画面が表示されるので、admin:adminでログインします。
以下のような画面が表示されます。
画面左上のKeycloakを押下して、Create realmを押下します。
growiという名前のrealmを作成します。
growiという名前のrealmがアクティブになっていることを確認します。
画面左のClientsを押下してCreate Clientを押下します。
Client Type:SAML
Client ID:growi
Name:growi
として作成していきます。
※スクショだと少しミスってますが、Client IDはgrowiにします。
Root URL: http://localhost:3000/
Home URL: http://localhost:3000/
Valid redirect URIs: http://localhost:3000/*
Master SAML Processing URL: http://localhost:3000/passport/saml/callback※
※これはGrowi側で定義されているものを記載する。
こちらで作成をしていきます。
作成されたことを確認します。
Clients > Growi > Settings > SAML capabilitiesを見ます。
デフォルトですが、以下のようになっていることを確認します。
Name ID format: username
Force POST binding: ON
Include AuthnStatement : ON
同じくSignature and Encryption配下のようになっていることを確認します。
Sign documents: ON
Sign assertions: ON
Signature algorithm: RSA_SHA256
SAML Signature Key Name : KEY_ID
Canonicalization Method : EXCLUSIVE
Keysタブを見てみます。
デフォルトだとこのように鍵が作成されております。
Client Signature requiredをOffにしておきます。

GrowiでのSAML環境用意
http://localhost:3000にアクセスします。
Growiアカウントを作成します。
Growiのウェルカムページが表示されます。
設定画面からアプリ設定を開きます。
Databaseにhttp://localhost:3000と入力して更新をかけます。
設定画面からセキュリティ設定を開きます。
SAMLが無効化されているので、有効化します。
有効化した後の結果です。
コールバックURLはKeycloakのAccess settingsで使用しています。
アプリ設定で設定を事前にしておくことでコールバックURLはスクショのようなものではなくhttp://localhost:8080/realms/growi/protocol/samlのようなものになっていると思います。
KeycloakのRealm settingsのKeysからRS256のCertuficateをコピーします。
http://localhost:8080/realms/growi/protocol/samlをGrowiのエントリーポイントにペーストします。

発行者:growi
証明書は少し癖になりますので、細かく書きます。
証明書:KeycloakのKeysのRS256を貼り付けます。
これを
MIICmTCCAYECBgGa5JU3nDANBgkqhkiG9w0BAQsFADAQMQ4wDAYDVQQDDAVncm93aTAeFw0yNTEyMDMxNDE3NTVaFw0zNTEyMDMxNDE5MzVaMBAxDjAMBgNVBAMMBWdyb3dpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2BkqZUE3vGOkF3svKgrDCsXrmvPWyxc262JgIvyCvj0Hyhn0DAwEYmkTrKRHS33y7AyDzRT9X8akdmarO1B4tZeCnQp+IiUU6prQ0ERIjjbGwcQaUQ71Tlm5TillZP53RJj5oFLacAK96GvdTUh1NowwwYEHgazTN9RxigE4onCOl6BZzhAqNFAuqRi6rF4o3//XNhgcLG1UpGl0KHFHCgzUhci4BxoLK+rXLr+ymYFtwR8jFzwhcHIx/Z5fn+5jNFd8C3brtLMXZI97FwxdCVP+xP5002uGwAA0K6QU2U9Xe2acOIeswJKP7EAG9fHZkUImrGmPQEoaVpC2+lUIGQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCUu/KzFaW3Ye5RwoZJ08KRiRR08B4WTqlIJMro3HC2td/kX282BNWp9eGOf+d1YdPlQgHR/wBrQgWgmWu+tbO5MNpAbDjuPD7nJUty+DuAlJ54VjJa1VIXo0C1J6eAwwjzi/HRWS9iWI1LBQVvzUlqefRMTaHGMz3rVFp28cC31aYa52h9t75XhOPlyuEuqMHwU9WX+8ujJNMFC+Do3E72aPMjcgtm5VpeCOXBlq4O/lOtnFjOUw2qfVhSRd1lKfNUQ9NFFbU+HO6IuB/4wGT9TrSxnUzeYkdziNtsJQsDkSjzzqd3JdSH2ehMy5LUg0qhgp4GxcIpZNALyXZ4VsOU
こうします。前後に-----BEGIN CERTIFICATE-----と-----END CERTIFICATE-----を入れます
-----BEGIN CERTIFICATE-----
MIICmTCCAYECBgGa5JU3nDANBgkqhkiG9w0BAQsFADAQMQ4wDAYDVQQDDAVncm93aTAeFw0yNTEyMDMxNDE3NTVaFw0zNTEyMDMxNDE5MzVaMBAxDjAMBgNVBAMMBWdyb3dpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2BkqZUE3vGOkF3svKgrDCsXrmvPWyxc262JgIvyCvj0Hyhn0DAwEYmkTrKRHS33y7AyDzRT9X8akdmarO1B4tZeCnQp+IiUU6prQ0ERIjjbGwcQaUQ71Tlm5TillZP53RJj5oFLacAK96GvdTUh1NowwwYEHgazTN9RxigE4onCOl6BZzhAqNFAuqRi6rF4o3//XNhgcLG1UpGl0KHFHCgzUhci4BxoLK+rXLr+ymYFtwR8jFzwhcHIx/Z5fn+5jNFd8C3brtLMXZI97FwxdCVP+xP5002uGwAA0K6QU2U9Xe2acOIeswJKP7EAG9fHZkUImrGmPQEoaVpC2+lUIGQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCUu/KzFaW3Ye5RwoZJ08KRiRR08B4WTqlIJMro3HC2td/kX282BNWp9eGOf+d1YdPlQgHR/wBrQgWgmWu+tbO5MNpAbDjuPD7nJUty+DuAlJ54VjJa1VIXo0C1J6eAwwjzi/HRWS9iWI1LBQVvzUlqefRMTaHGMz3rVFp28cC31aYa52h9t75XhOPlyuEuqMHwU9WX+8ujJNMFC+Do3E72aPMjcgtm5VpeCOXBlq4O/lOtnFjOUw2qfVhSRd1lKfNUQ9NFFbU+HO6IuB/4wGT9TrSxnUzeYkdziNtsJQsDkSjzzqd3JdSH2ehMy5LUg0qhgp4GxcIpZNALyXZ4VsOU
-----END CERTIFICATE-----
入力結果は以下となります。
ID: id
username: username
メールアドレス: email
名:firstName
姓:lastName
これはKeycloak側の設定に合わせます。
KeycloakでSAML環境用意 #2
Clients > Client details > Dedicated scopes
Configure new mapperを押下します。
User Propertyを選択します。
| Name | Mapper Type | Property | Friendly Name | SAML Attribute Name | SAML Attribute NameFormat |
|---|---|---|---|---|---|
| username | User Property | username | username | username | Basic |
| id | User Property | id | id | id | Basic |
| User Property | Basic | ||||
| firstName | UserProperty | firstname | firstname | firstname | Basic |
| lastName | UserProperty | lastname | lastname | lastname | Basic |
全て作成後のMapperの画面
testユーザのパスワードを設定しておきます。



































