1

Runbook の 1 つが使用しているサービス プリンシパルに関するアクセス許可の問題のトラブルシューティング/診断の一環として、ログをキャプチャできるように、同じ PowerShell コードをローカルで実行するよう Microsoft サポートから依頼されました。これを行うには、Runbook とまったく同じ方法で認証する必要があります。つまり、AzureRunAsConnectionが使用している証明書で認証する必要があります。

Azure Automation にのみ存在するいくつかのコマンドレットを Azure RM の同等のコマンドに交換した後 (たとえば、 andGet-AutomationConnectionに置き換える必要がGet-AzAutomationAccountありGet-AzAutomationConnection、 using に切り替える必要がありますFieldDefinitionValues)、スクリプトの認証部分は次のようになります::

Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$PSDefaultParameterValues['*:ErrorAction']='Stop'

'*** Authenticating with Azure'

$automationAccount = Get-AzAutomationAccount `
  -Name "MY_AUTOMATION_ACCOUNT" `
  -ResourceGroupName "MY_RESOURCE_GROUP"

$connection = $automationAccount | Get-AzAutomationConnection -Name "AzureRunAsConnection"

# Log-in to Az Account Management Graph API (for DNS updates)
Login-AzAccount -ServicePrincipal `
  -Tenant $connection.FieldDefinitionValues.TenantID `
  -ApplicationId $connection.FieldDefinitionValues.ApplicationID `
  -CertificateThumbprint $connection.FieldDefinitionValues.CertificateThumbprint

ただし、実行すると、次のエラーが発生します。

Login-AzAccount : No certificate was found in the certificate store with thumbprint
93FAB7F0BA11D08F8ABBAF5C587C77ECB058A8BB

が使用している証明書をエクスポートしAzureRunAsConnectionて、ローカル マシンにインポートできるようにする必要があるようです。ただし、Azure Automation が使用する証明書を更新したり、独自の証明書をアップロードしたりすることはできますが、現在の証明書を簡単に取得する方法はないようです。これが設計によるものであることはわかっていますが、セキュリティのためですが、このような場合は面倒です。

ハイブリッド ワーカー内で証明書をエクスポートする方法を説明している 2018 年の記事を見つけましたが、Azure Cloud Shell でもローカルでもコードが機能しませんでした (Get-AutomationCertificate未定義): https://www.lunavi.com/blog /how-to-download-an-azure-automation-connection-certificate-locally

Web 上の一部のガイドでは、BLOB ストレージ アカウントを作成してから、それにエクスポートするスクリプトを作成することを提案していますが、この再現のために 1 回だけ必要なものを作成するには、かなりの労力がかかるようです。

ローカル デバッグ/再現用にこの証明書を取得する最も簡単で簡単な方法は何ですか?

4

1 に答える 1

2

最後に、2018 年の記事を使用して、Runbook から証明書を消費可能な形式で取得する手っ取り早い方法を作成しました。

Runbook で実行されているスクリプトを変更して、先頭に次の行を追加しました。

"*** Exporting Run As Certificate for Debugging"
$cert = Get-AutomationCertificate -Name "AzureRunAsCertificate"
$certData = $cert.Export("pfx", 'MySuperSecurePassword')

throw ([Convert]::ToBase64String($certData))

これにより、証明書の内容をメッセージとして含む例外が発生します。次に、Runbook の "テスト ペイン" を介してこのコードを実行すると、上部に base64 形式でダンプされた証明書の内容が表示されます。 Base64 エンコード形式の証明書の内容

例外を使用するのは、1) Runbook の残りの部分が実行されないようにするため、および 2) メッセージが確実に表示されるようにするためです。例外をスローする前に Write-Host を実行しただけでは、スクリプトの実行が停止する前に出力がフラッシュされない可能性があることがわかりました。

次に、かっこ内の base64 でエンコードされた部分をコピーしてファイルに貼り付け[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String、PowerShell またはbase64 --decodeWSL でファイルの内容をデコードして PFX ファイルを取得できます。次に、その PFX ファイルを開き、ローカル ユーザー ストアにインポートします。 PFX のインポートに使用される設定

于 2021-02-19T18:36:49.123 に答える