プロジェクト

全般

プロフィール

機能 #882

完了
NO NO

Kanidm で SSO

機能 #882: Kanidm で SSO

nop_thread さんが2ヶ月前に追加. 約2ヶ月前に更新.

ステータス:
終了
優先度:
通常
担当者:
開始日:
2025/12/13
期日:
進捗率:

100%

一時中断:
いいえ
pinned:
いいえ
リマインド予定日:
前回確認日:
2025/12/17
管理外残件あり:
いいえ

説明

試してみる。

機能 #120: クラスタ用 Single Sign-On が欲しい のときは却下したが、現状では宅内 root CA が概ね問題なく動いていること、いいかげんサービス数が増えてきてセッション切れの頻度が増したり Firefox がサブドメインを区別せず滅茶苦茶なログイン情報を提示してきたりなどでダルくなってきたことから、そろそろ SSO の試しどきだと判断した。

手順メモ: #note-12


関連するチケット 2 (0件未完了2件完了)

関連している 鯖缶 - 機能 #120: クラスタ用 Single Sign-On が欲しい却下nop_thread

操作
関連している 鯖缶 - braindump #568: Ceph の運用を考える終了nop_thread

操作

NO nop_thread さんが2ヶ月前に更新 操作 #1

  • 関連している 機能 #120: クラスタ用 Single Sign-On が欲しい を追加

NO nop_thread さんが2ヶ月前に更新 操作 #2

NO nop_thread さんが2ヶ月前に更新 操作 #3

  • pinnedいいえ から はい に変更
  • 前回確認日2025/12/05 から 2025/12/06 に変更

NO nop_thread さんが2ヶ月前に更新 · 編集済み 操作 #4

HA 構成で動かすなら #568 は前提にしたいかも。
とはいえ Kanidm 自体が冗長構成をサポートしているので最初はそのまま動かすでも問題ないのかもしれないが。

NO nop_thread さんが2ヶ月前に更新 操作 #5

  • 関連している braindump #568: Ceph の運用を考える を追加

NO nop_thread さんが2ヶ月前に更新 操作 #6

  • 前回確認日2025/12/06 から 2025/12/13 に変更

nop_thread さんは #note-4 で書きました:

とはいえ Kanidm 自体が冗長構成をサポートしているので最初はそのまま動かすでも問題ないのかもしれないが。

Deployment - Kanidm Administration によれば、今のところ対称な replication にノードを参加させるにはコマンド実行のみならず複数段階の設定の編集などが必要そうな雰囲気があり、あまり自動化フレンドリーではない。
(非対称な (一方的な pull しかしない) 構成ならもう少し楽そうだが、それで満足できるかというとたぶんそうでもない。)

一旦は Proxmox VE 側で HA するのが良かろう。

NO nop_thread さんが2ヶ月前に更新 操作 #7

  • リマインド予定日2025/12/06 から 2025/12/13 に変更

NO nop_thread さんが2ヶ月前に更新 · 編集済み 操作 #8

  • ステータス新規 から 進行中 に変更
  • 開始日2025/12/13 にセット

Kanidm サーバが立った。

手始めに、 Nextcloud サーバ2つで SSO できるようにした。
既存ユーザと merge させるためには、 Nextcloud 側の「属性マッピング」で "User ID mapping" を preferred_username にして、かつ Kanidm 側でも kanidm system oauth2 prefer-short-username {client_name} で short username (kanidm person getname として見えている値、 web UI では Name として見えている値) を使うようにする必要があった。
勿論この設定では Kanidm 側のユーザ名と Nextcloud 側で使っているユーザ名が一致していないと意図した通りに機能しない。
カスタムの属性と値を自由に設定する機能は Custom fields · Issue #3493 · kanidm/kanidm で話が進んでいるようだが、すぐに来そうな感じではなさそう。

OIDC の規格 (Final: OpenID Connect Core 1.0 incorporating errata set 2 section 5.1, section 5.7) では「安定しているのは subiss だけで、 name とか preferred_username とか email とかは使い回しや変更のリスクがあるから ID に使うな」とされている。
そうは言ってもねえ。はやく Kanidm 側での対応を待ちたいものだ。

NO nop_thread さんが2ヶ月前に更新 · 編集済み 操作 #12

サービス追加の手順:

  1. kanidm group create {GROUP_NAME} {MANAGER_USER} でサービスを作る。
    • GROUP_NAME{SERVICE_NAME}_users のような感じで統一している。必須ではないが。
    • MANAGER_USER は省略可能だが、指定しない理由は今のところ特に思い当たらない。
  2. kanidm group add-members {GROUP_NAME} {USER} でログインを許可するユーザをグループに追加する。
  3. kanidm system oauth2 create {CLIENT_ID} {DISPLAY_NAME} {LANDING_PAGE_URL} でクライアントを登録する。
    • CLIENT_IDDISPLAY_NAME は面倒なので両方ともドメインを使うことが多い。
    • DISPLAY_NAMELANDING_PAGE_URL はそれぞれ、 Kanidm の web UI のアプリ一覧のリンクで使われる名前と URI。
  4. kanidm system oauth2 add-redirect-url {CLIENT_ID} {REDIRECT_URL} で redirect URL を登録する。
    • redirect URL はクライアントから指定されたものを使う。
  5. kanidm system oauth2 update-scope-map {CLIENT_ID} {GROUP_NAME} email profile openid などで scope map を登録する。
    • openid は必須。他はクライアントの要請次第。
  6. kanidm system oauth2 update-sup-scope-map {CLIENT_ID} {GROUP_NAME} [scopes]... で supplemental scope map を登録する。
    • 今のところ必要になったことはない。
  7. クライアントを設定する。
    • discovery endpoint: https://{IDM_DOMAIN}/oauth2/openid/{CLIENT_ID}/.well-known/openid-configuration
    • authorization endpoint: https://{IDM_DOMAIN}/oauth2/authorise
    • token endpoint: https://{IDM_DOMAIN}/oauth2/token
    • user endpoint: https://idm.example.com/oauth2/openid/{CLIENT_ID}/userinfo
    • client secret: kanidm system oauth2 show-basic-secret {CLIENT_ID} で取り出せる。
    • PKCE code challenge method: S256 (非対応の場合のオプションもある)
    • OIDC token signing algorithm: ES256 (非対応の場合のオプションもある)

参考:

NO nop_thread さんが2ヶ月前に更新 · 編集済み 操作 #14

イメージのビルド時に突っ込んでおくのが基本で、さもなくば update-ca-certificates をインストールして毎度呼び出せと。
だ、だるすぎる……。

NO nop_thread さんが2ヶ月前に更新 · 編集済み 操作 #16

nop_thread さんは #note-14 で書きました:

イメージのビルド時に突っ込んでおくのが基本で、さもなくば update-ca-certificates をインストールして毎度呼び出せと。
だ、だるすぎる……。

post_start がコンテナ内で実行されるものであれば、ここに全てを突っ込む手はあるかもしれない。
タイムラグについて保証はないらしいが……。

NO nop_thread さんが2ヶ月前に更新 · 編集済み 操作 #17

nop_thread さんは #note-16 で書きました:

nop_thread さんは #note-14 で書きました:

イメージのビルド時に突っ込んでおくのが基本で、さもなくば update-ca-certificates をインストールして毎度呼び出せと。
だ、だるすぎる……。

post_start がコンテナ内で実行されるものであれば、ここに全てを突っ込む手はあるかもしれない。
タイムラグについて保証はないらしいが……。

一応できたにはできた。

services:
  svc:
    #...
    volumes:
      - type: bind
        source: {{ HOST_ROOT_CA_PATH }}
        target: {{ GUEST_ROOT_CA_PATH }}
        read_only: true
    post_start:
      - command: cp {{ CONTAINER_ROOT_CA_PATH }} /usr/local/share/ca-certificates/
        user: root
      - command: update-ca-certificates
        user: root

bind mount で直接 /usr/local/share/ca-certificates/ に突っ込むでも良いが、まあとにかくできた。
これで wget 等も通るようになる。

ただ問題は、 urllib3 なんかを使っているとシステムの CA bundle を使ってくれないので結局アプリ側からは証明書エラーが出ることがある。
おそらくはサーバアプリの起動時にキャッシュされてしまってその後更新されたシステムの CA bundle を読んでくれていないせいだろう。
アプリの起動タイミング (というかフックの実行タイミング) の問題なので $REQUESTS_CA_BUNDLE/etc/ssl/certs/ca-certificates.crt とかにしても解決しない。
こまった。

NO nop_thread さんが2ヶ月前に更新 操作 #18

nop_thread さんは #note-17 で書きました:

ただ問題は、 urllib3 なんかを使っているとシステムの CA bundle を使ってくれないので結局アプリ側からは証明書エラーが出ることがある。
おそらくはサーバアプリの起動時にキャッシュされてしまってその後更新されたシステムの CA bundle を読んでくれていないせいだろう。
アプリの起動タイミング (というかフックの実行タイミング) の問題なので $REQUESTS_CA_BUNDLE/etc/ssl/certs/ca-certificates.crt とかにしても解決しない。
こまった。

いろいろ試していたら、以下のようにしてできた。

FROM mrmn/pdfding:{{ pdfding_docker_tag }}
COPY custom-root-ca.crt /usr/local/share/ca-certificates/
USER root
RUN update-ca-certificates
ENV REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
USER nonroot

どうも certifi の証明書を使っていてシステムの証明書ストアは見てくれていないような雰囲気があって、 $REQUESTS_CA_BUNDLE を設定することなしに (update-ca-certificates の実行だけで) 接続させることができなかった。
めんどくせえライブラリだな。 user preference を尊重せんかい。

NO nop_thread さんが約2ヶ月前に更新 操作 #19

  • 前回確認日2025/12/14 から 2025/12/15 に変更

NO nop_thread さんが約2ヶ月前に更新 操作 #22

  • 進捗率30 から 50 に変更
  • 前回確認日2025/12/15 から 2025/12/16 に変更

NO nop_thread さんが約2ヶ月前に更新 操作 #33

NO nop_thread さんが約2ヶ月前に更新 操作 #36

  • 進捗率50 から 80 に変更

ひととおりのサービスの登録は終わったので、あとは Kanidm 側でサービス名と一緒に表示するアイコンを追加してやれば完了。

NO nop_thread さんが約2ヶ月前に更新 操作 #37

  • ステータス進行中 から 終了 に変更
  • 進捗率80 から 100 に変更
  • pinnedはい から いいえ に変更
  • リマインド予定日 を削除 (2025/12/20)
  • 前回確認日2025/12/16 から 2025/12/17 に変更
  • 管理外残件ありいいえ にセット

アイコン設定完了。

他の形式にエクスポート: PDF Atom