機能 #882
完了Kanidm で SSO
nop_thread さんが2ヶ月前に追加. 約2ヶ月前に更新.
100%
説明
試してみる。
機能 #120: クラスタ用 Single Sign-On が欲しい のときは却下したが、現状では宅内 root CA が概ね問題なく動いていること、いいかげんサービス数が増えてきてセッション切れの頻度が増したり Firefox がサブドメインを区別せず滅茶苦茶なログイン情報を提示してきたりなどでダルくなってきたことから、そろそろ SSO の試しどきだと判断した。
手順メモ: #note-12
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 に変更
- 専用のドメインを決める (Choosing a Domain Name - Kanidm Administration)
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 get で name として見えている値、 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) では「安定しているのは sub と iss だけで、 name とか preferred_username とか email とかは使い回しや変更のリスクがあるから ID に使うな」とされている。
そうは言ってもねえ。はやく Kanidm 側での対応を待ちたいものだ。
NO nop_thread さんが2ヶ月前に更新 · 編集済み 操作 #12
サービス追加の手順:
-
kanidm group create {GROUP_NAME} {MANAGER_USER}でサービスを作る。-
GROUP_NAMEは{SERVICE_NAME}_usersのような感じで統一している。必須ではないが。 -
MANAGER_USERは省略可能だが、指定しない理由は今のところ特に思い当たらない。
-
-
kanidm group add-members {GROUP_NAME} {USER}でログインを許可するユーザをグループに追加する。 -
kanidm system oauth2 create {CLIENT_ID} {DISPLAY_NAME} {LANDING_PAGE_URL}でクライアントを登録する。-
CLIENT_IDとDISPLAY_NAMEは面倒なので両方ともドメインを使うことが多い。 -
DISPLAY_NAMEとLANDING_PAGE_URLはそれぞれ、 Kanidm の web UI のアプリ一覧のリンクで使われる名前と URI。
-
-
kanidm system oauth2 add-redirect-url {CLIENT_ID} {REDIRECT_URL}で redirect URL を登録する。- redirect URL はクライアントから指定されたものを使う。
-
kanidm system oauth2 update-scope-map {CLIENT_ID} {GROUP_NAME} email profile openidなどで scope map を登録する。-
openidは必須。他はクライアントの要請次第。
-
-
kanidm system oauth2 update-sup-scope-map {CLIENT_ID} {GROUP_NAME} [scopes]...で supplemental scope map を登録する。- 今のところ必要になったことはない。
- クライアントを設定する。
- 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(非対応の場合のオプションもある)
- discovery endpoint:
参考:
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 に変更
- 管理外残件あり を いいえ にセット
アイコン設定完了。