TMC-SM へのログインが失敗する - "errcode: 3001 errmsg: Unauthorized requestid"
search cancel

TMC-SM へのログインが失敗する - "errcode: 3001 errmsg: Unauthorized requestid"

book

Article ID: 418181

calendar_today

Updated On:

Products

VMware Tanzu Mission Control

Issue/Introduction

免責事項:これは英文の記事「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" ...

Environment

TMC-SM v1.4.2 以下のバージョンで発生。

Cause

ブラウザ経由での認証時に TMC-SM の Pinniped は 認証プロバイダ(LDAP/ActiveDirectory/OIDC) と通信するが、認証対象ユーザーの属性値が多い場合(多数のグループに所属しているなど) その返り値が cookie 容量制限の 4KB を超えてしまう。結果として login-id-token が cookie に保存できず認証エラーとなってしまう。

Resolution

恒久対策

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

Additional Information