web-dev-qa-db-ja.com

AKSクラスターのサービスプリンシパルシークレットを見つけるにはどうすればよいですか?

さて、私はめちゃくちゃだったので、誤って実行しましたaz ad sp reset-credentials AKSクラスターが実行されているサービスプリンシパルに対して。そして今、次のようなエラーが発生しています。

ロードバランサーの作成エラー(再試行します):サービスtest/admin-apiのLBを取得中にエラーが発生しました:Azure.BearerAuthorizer#WithAuthorization: https://management.Azure.com/subscriptions/へのリクエストのトークンを更新できませんでした ****/resourceGroups/MC _ ****/providers/Microsoft.Network/loadBalancers?api-version = 2017-09-01:StatusCode = 0-Original Error:adal:Failed request failed。ステータスコード= '401'。レスポンスボディ:{"error": "invalid_client"、 "error_description": "AADSTS70002:資格情報の検証中にエラーが発生しました。AADSTS50012:無効なクライアントシークレットが提供されました。\ r\nトレースID:****\r\n相関ID:*** *\r\nタイムスタンプ:2018-08-23 12:01:33Z "、" error_codes ":[70002,50012]、" timestamp ":" 2018-08-23 12:01:33Z "、" trace_id ":" **** "、" correlation_id ":" **** "}

そして

イメージ "****。azurecr.io/****:****"のプルに失敗しました:rpcエラー:コード=不明desc =デーモンからのエラー応答:https://****.azurecrを取得します。 io/v2/****/manifests/****:無許可:認証が必要です

そこで、サービスプリンシパルが使用する元のクライアントシークレットを見つけて、サービスプリンシパルのキーとして再度追加できるようにします。これは、クラスター全体を再作成する以外に考えられる唯一のソリューションです。

何か案は?

11
PeterH

この問題を解決した人は誰でも、マイクロソフトからの更新されたソリューションがあります

https://docs.Microsoft.com/en-us/Azure/aks/update-credentials#update-aks-cluster-with-new-credentials

デフォルトでは、AKSクラスターは、1年の有効期限を持つサービスプリンシパルで作成されます

また、Azure CLI 2.0.68以降では、ユーザーが定義したパスワードでサービスプリンシパルを作成するための--passwordパラメーターは、弱いパスワードの誤った使用を防ぐためにサポートされなくなりました。サービスプリンシパルのパスワードを変更する最初の解決策が機能しなくなりました。

2
Iulian Paraian

結局、解決策は非常に簡単でした。

  • Azureポータルで、MC_<resourcegroup>_<aksName>_<region>という名前のリソースグループに移動します。
  • タイプ「仮想マシン」のリソースの1つをクリックします。
  • [コマンドを実行]までスクロールします

Run command

  • 「RunShellScript」を選択します
  • cat /etc/kubernetes/Azure.jsonと入力して[実行]をクリックします

このコマンドは、JSONファイルの内容を返します。必要なプロパティはaadClientSecretです

6
PeterH

それはあなたがやりたいと思う迷惑なことです。問題については、認証なしに画像をプルすることはできません。

まず、コンテナーレジストリのサービスプリンシパルを見つける必要があります。 Azureポータルでこれを実行し、レジストリパネルに移動すると、次のようなサービスプリンシパルを見つけることができます。

enter image description here

または、Azure CLIコマンドを使用して、次のようなレジストリIDを見つけることができます。

az acr show --resource-group groupName --name registryName --query id --output tsv

次に、コマンドを使用して、次のようなサービスプリンシパルIDを見つけます。

az role assignment list --scope registryID

必要なサービスプリンシパルを選択できます。

次に、コマンドkubectl get secretsおよびkubectl get secrets secretName -o yamlを使用してすべてのシークレットを取得し、シークレットのトークンを取得します。次に、1つずつ分析して、ユーザー名がサービスプリンシパルIDと同じかどうかを確認します。 JWTなどのツールを使用して、シークレットトークンを分析できます。結果は次のようになります。

enter image description here

ユーザー名が、見つけたサービスプリンシパルIDと同じ場合、それが必要なシークレットです。このステップは問題です。秘密を1つずつチェックする必要があります。そうしないと、チェックするためのより優れた方法が得られます。

ちなみに、サービスプリンシパルのパスワードは、作成したときに一度だけ確認できるようです。 Azureは再び表示しません。ただし、Kubernetesシークレットを作成すると、パスワードはそのシークレットに保存されます。

0
Charles Xu