免責事項:これは英文の記事「TMC-SM login failure - "errcode: 3001 errmsg: Unauthorized requestid"」の日本語訳です。記事はベストエフォートで翻訳を進めているため、ローカライズ化コンテンツは最新情報ではない可能性があります。最新情報は英語版の記事で参照してください。
TMC-SM (Tanzu Mission Control Self-Managed) へのログインが失敗し、下記のエラーが Web ブラウザに表示。
errcode: 3001 errmsg: Unauthorized requestid: ########-####-####-####-########
TMC-SM が稼働する K8s Cluster にコンテキストを切り替えて、TMC-SM 関連Pod のエラーメッセージを確認。
# kubectl -n tmc-local logs deployment/landing-service-server | grep "id token not found"
{"component":"server-serve-http","http.host":"landing.<TMC_DOMAIN>","http.proto_major":2,...,"level":"error","msg":"errcode: 2004 errmsg: Unauthorized requestid: ####-####-####-######### cause: id token not found",...}
# kubectl -n tmc-local logs deployment/auth-manager-server | grep "the value is too long"
level=error msg="Could not save idtokenCookie" X-Request-ID=########-####-####-########## error="securecookie: the value is too long" ...
TMC-SM v1.4.2 以下のバージョンで発生。
ブラウザ経由での認証時に TMC-SM の Pinniped は 認証プロバイダ(LDAP/ActiveDirectory/OIDC) と通信するが、認証対象ユーザーの属性値が多い場合(多数のグループに所属しているなど) その返り値が cookie 容量制限の 4KB を超えてしまう。結果として login-id-token が cookie に保存できず認証エラーとなってしまう。
TMC-SM v1.4.3 以降へのアップグレード (k8s v1.30 以降が必要)
リリースノート - TMC-SM
Pinniped FederationDomain で 認証プロバイダからの返り値をフィルタして cookie 容量を抑える。
1. 環境に合わせて変数を設定
DISPLAY_NAME="TMC-SM" # Displayed title in the login page
# Select the IdP backend for your environment
KIND="ActiveDirectoryIdentityProvider" # "LDAPIdentityProvider" or "OIDCIdentityProvider" or "ActiveDirectoryIdentityProvider"
KIND_OBJECT_NAME="<DOMAIN>" # NAME of "kubectl -n tmc-local get $KIND"
TMC_GROUP_ADMIN="tmc-admin" # Value of idpGroupRoles.admin in the values.yaml
TMC_GROUP_MEMBER="tmc-member" # Value of idpGroupRoles.member in the values.yaml
2. Pinniped federationdomain を設定する Secret を作成
cat > federationdomain-overlay.yaml <<EOF
---
apiVersion: v1
kind: Secret
metadata:
name: pinniped-federationdomain-overlay
namespace: tmc-local
stringData:
overlay.yml: |
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"apiVersion":"config.supervisor.pinniped.dev/v1alpha1", "kind":"FederationDomain"}),expects="1+"
---
#@overlay/match expects="1+"
spec:
#@overlay/match expects="0+"
identityProviders:
- displayName: ${DISPLAY_NAME}
objectRef:
apiGroup: idp.supervisor.pinniped.dev
kind: ${KIND}
name: ${KIND_OBJECT_NAME}
transforms:
expressions:
- expression: 'groups.filter(g, g in ["${TMC_GROUP_ADMIN}", "${TMC_GROUP_MEMBER}"])'
type: groups/v1
EOF
kubectl apply -f federationdomain-overlay.yaml
3. 上記の Secret を Package に適用する Secret を作成
cat > tmc-package-overlay.yaml <<EOF
---
apiVersion: v1
kind: Secret
metadata:
name: tmc-package-overlay
namespace: tmc-local
stringData:
tmc-pkgi-overlay.yml: |
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"apiVersion":"packaging.carvel.dev/v1alpha1", "kind":"PackageInstall", "metadata": {"name": "tmc-local-stack"}}),expects="1+"
---
metadata:
#@overlay/match missing_ok=True
annotations:
#@overlay/match missing_ok=True
ext.packaging.carvel.dev/ytt-paths-from-secret-name.0: pinniped-federationdomain-overlay
EOF
kubectl apply -f tmc-package-overlay.yaml
4. tanzu-mission-control package と上記 Secret を紐づける
kubectl -n tmc-local patch pkgi tanzu-mission-control --type='merge' -p '{"metadata": {"annotations": {"ext.packaging.carvel.dev/ytt-paths-from-secret-name.0": "tmc-package-overlay"}}}'
5. federationdomain の設定が反映されたかを確認 (identityProviders: セクションが追加される)
kapp-controller が上記 Secret を使用して pinniped の設定を更新するのに最長5分待機
kubectl -n tmc-local get federationdomain pinniped -oyaml | yq .spec
6. pinniped-supervisor pod を Restart
kubectl -n tmc-local rollout restart deployment/pinniped-supervisor
7. tmc-local namespace 配下の Pod が Running かどうか確認
kubectl -n tmc-local get pkgi
kubectl -n tmc-local get pods
8. Cookie 容量オーバーで認証失敗したユーザーで TMC-SM ログインをリトライ
上記の一時回避策が機能しなかった、もしくは TMC-SM v1.4.3 以降にアップグレード済みの場合は設定を削除。
# 1. Pause tmc-local package
tanzu -n tmc-local package installed pause tmc-local-stack
# 2. Delete the Annotation and Secrets
kubectl -n tmc-local annotate pkgi tanzu-mission-control ext.packaging.carvel.dev/ytt-paths-from-secret-name.0-
kubectl -n tmc-local delete secret tmc-package-overlay
kubectl -n tmc-local delete secret pinniped-federationdomain-overlay
# 3. Unpause to reconcile the package
tanzu -n tmc-local package installed kick tmc-local-stack
# 4. Restart pinniped-supervisor
kubectl -n tmc-local rollout restart deployment/pinniped-supervisor
# 5. Check the setting is rollbacked correctly (identityProviders:section has been removed)
kubectl -n tmc-local get federationdomain pinniped -oyaml | yq .spec
# 6. Confirm that the reconciliation of all packages in tmc-local namespace
kubectl -n tmc-local get pkgi
kubectl -n tmc-local get pods