SAMLを実装しようと思った目的・背景
- インフラ勉強会 において、使われているWordpressとGrowi Wikiの認証を共通化して、Single Sign On(SSO)を実装しようと思ったため。
- 実装までの変遷は下の方に記載しておきます。
検証した最終バージョン
- Keycloak ver.4.0.0 Final (※構築済みとする)
- Growi ver.3.2.4 (※構築済みとする)
- Docker ver.18.03.1-ce
- Docker-compose ver.1.21.2
設定項目
Growi
- Growiにおいて、Admin権限で管理を開きます。
- アプリの設定
- サイトURL: https://wiki.examle.com
- ここは環境変数として、セキュリティ設定でも使われているので大事な設定です。
- サイトURL: https://wiki.examle.com
- セキュリティ設定
- Passport 認証機構: 有効化
- SAML: ON
Keycloak
- Keycloakにおいて、Growi用のRelmを作成する。
- Name: wiki (任意)
- Keycloakにおいて、Growi用のRelmを作成する。
- 言語設定(日本語)をしたい方は、 Realm Settings --> Theme
- Internationalization Enabled: ON
- Default Locale: ja
- 言語設定(日本語)をしたい方は、 Realm Settings --> Theme
- Keycloakにおいて、クライアントを追加する。
- 右端にある[作成]ボタンから追加
- クライアントID: wiki.examle.com
- クライアントプロトコル: saml
- クライアント SAML エンドポイント : https://wiki.examle.com/passport/saml/callback
- GrowiのセクションでメモしたコールバックURL
- 右端にある[作成]ボタンから追加
- Keycloakにおいて、クライアントの設定をする。
※設定は最低限であるため、必要に応じてカスタマイズしてください。- 設定
- 名前 : wiki(任意)
- 有効 : オン (デフォルト)
- AuthnStatement を含める : オン
- ドキュメントを署名する : オン
- アサーションを署名する : オン
- 署名アルゴリズム : RSA_SHA1
- SAML Signature Key Name : KEY_ID
- 正規化方式 : EXCLUSIVE
- POST Binding を強制 : オン
- Name ID フォーマットを強制 : オン
- Name ID フォーマット : username
- ルート URL : https://wiki.example.com/
- 有効なリダイレクト URI : https://wiki.example.com/*
- SAML エンドポイントの詳細設定
- アサーションコンシューマサービスの POST Binding URL : https://wiki.example.com/
- アサーションコンシューマサービスの Redirect Binding URL : https://wiki.examle.com/passport/saml/callback
- ログアウトサービスのRedirect Binding URL : https://wiki.examle.com/passport/saml/callback
※設定項目多く画像を小さくしました。画像を別リンクで開いてご覧ください。
- 設定

Growi
- セキュリティ設定
- SAML 設定
- エントリーポイント: https://keycloak.examle.com/auth/realms/wiki/protocol/saml
-
https://keycloak.example.com/auth/realms/wiki/protocol/saml/descriptor を参照の上、
SingleSignOnService
のLocation
URLを記述
-
https://keycloak.example.com/auth/realms/wiki/protocol/saml/descriptor を参照の上、
- 発行者: wiki.examle.com
- エントリーポイント: https://keycloak.examle.com/auth/realms/wiki/protocol/saml
- Attribute Mapping
- Identifier: id
- Username: username
- 新規ログイン時、username が一致したローカルアカウントが存在した場合は自動的に紐付ける: レ
- Mail: email
- 姓: firstName
- 名: lastName
- Options
- Certificate: https://keycloak.example.com/auth/realms/wiki/protocol/saml/descriptor を参照の上、
のdsig:X509Certificate
の内容を記述 (※右端までコピーすること)
- Certificate: https://keycloak.example.com/auth/realms/wiki/protocol/saml/descriptor を参照の上、
- SAML 設定

ログインテスト
- growi wiki のログインページにおいて、[OAuth]ボタンを下から上にマウスカーソルでなぞり、[ログイン with SAMLSAML]ボタンを押す。


署名アルゴリズムを強化したい向け
2018年10月末現在ハードコードするしかないです。※Github Issue #615が実装された際にはそちらで設定が可能な予定
- Keycloak - クライアント - 設定
- 署名アルゴリズム : RSA_SHA256
- Growi
- 場所:./src/server/service/passport.js:446
- 値:
signatureAlgorithm: 'sha256'
SAML認証トラブルシュートにおけるお役立ち情報
- ターミナルログ
- Keycloak
- Growi
- SAMLデバッグツール
- Growi
- 環境変数
-
DEBUG
をDEBUG=growi:models:external-account,growi:routes:login-passport,growi:service:PassportService
のように設定した後、起動すると認証周りのデバッグログが多く出て原因箇所を特定しやすい。 (by yuki@weseek slack)
-
- 環境変数
SAML認証実装までの変遷
- 今年2018年6月ごろから検証を開始。
- 今年2018年6月ごろにはGrowi WikiにはSAMLの機構がなかった。
- Github Issueで上げました。今後のことを考え、英語でIssue #542を記述。
- 2018年9月 SAML認証が実装されましたが、検証したところ、うまく動きませんでした。
- 状況をGrowi Slackに報告し、不具合と認定されました。
- 2018年10月初旬にSAML認証の不具合が改善され、かつSAML認証のX.509証明書の機能も実装されました。
special thanks
- miya
- inductor
- yuki@weseek
※なお今後の予定としては、Azure ADでも認証ができるか遊んでみる予定です。