🐕

Azモジュールにも「Microsoft Graph化」の影響がある

2022/01/12に公開

はじめに

Azure ADの操作に必要なAPIは、元々「Azure AD Graph API」が使われていましたが、「Microsoft Graph API」に置き換わる予定になっています。

公式ドキュメント上は、2022/6までにMicrosoft Graphに移行せよとなっています。
https://docs.microsoft.com/ja-jp/graph/migrate-azure-ad-graph-overview

しかしどうやら2022/6を待たずして、「Azure AD Graph」を利用している機能に影響が出ているものがあるようで、今回はそれでハマった話を共有します。

アップデートされた内容

ハマったのはAzure Powershell、Azモジュールで利用するコマンドです。
クラウド操作系のSDKでは、ユーザー側のインターフェースは言語に合ったコマンドが用意されていますが、裏側(クラウドとのインターフェース)はREST APIになっているというのは一般的な構成かと思います。
Azモジュールにおいてもそうなっていたようでしたが、「Azure AD Graph API」で実装されていた特定のコマンドで、2021/12にされたアップデート(v7.0.0)により「Microsoft Graph API」に変更されたものがあるようです。
Azure AD GraphとMicrosoft Graphで100%仕様が引き継がれていないことから、Azモジュールにおいても「見た目上のコマンドは変わってないけど、引き数や戻り値が変更になった」というパターンが存在します。

「New-AzADServicePrincipal」で受けた影響

私の運用している環境では、上記のコマンドを使ってサービスプリンシパルを作成するにあたり、これまで下記のようなコマンドで、「初期PW」および「有効期限」を指定して作成していました。

$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{ StartDate=Get-Date; EndDate=$spkey_enddate; Password=$APPLICATION_PW}
$sp = New-AzADServicePrincipal -DisplayName $userName `
        -PasswordCredential $credentials 

ところが、2021/12頃のUpdateでAzモジュールがバージョン7.0.0になり、
New-Objectの作成に失敗するようになります。

Cannot find type [Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential]: verify that the assembly containing this type is loaded.

(2022/1/12現在、既に更新されてしまってますが…!)ドキュメントを見ると、
https://docs.microsoft.com/en-us/powershell/azure/create-azure-service-principal-azureps?view=azps-7.0.0
サービスプリンシパルの作成にあたり、初期パスワードは指定できなくなりランダム文字列で作成される。サービスプリンシパルの作成後、下記の方法で取得せよと書いてありました。

$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
$UnsecureSecret = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

ところが、このNew-AzADServicePrincipalの戻り値には「Secret」というプロパティは含まれておらず。

初期値の設定もできないし、作成されたはずの初期値が取得できない。詰んだ。

という年末年始を過ごしました…

対処方法

Azureのサポートに問い合わせたところ、下記となっていることが分かりました。

  • 1/4にリリースされたv7.1.0で修正済み、
  • 「$sp.PasswordCredentials.SecretText」でシークレットを取得可能

公式ドキュメントも新バージョンで公開されています
https://docs.microsoft.com/en-us/powershell/azure/create-azure-service-principal-azureps?view=azps-7.1.0

背景

この動作変更、冒頭に書いた通り、裏で使われるAPIがAAD graphからmicrosoft graphに切り替わったためとのこと。(サポートの方曰く)
確かに、microsoft graphの公式ドキュメントを見ると、サービスプリンシパルの作成時に「初期パスワードの指定」は出来なくなっています。

https://docs.microsoft.com/ja-jp/graph/api/serviceprincipal-post-serviceprincipals?view=graph-rest-1.0&tabs=http

引用するとこんなメッセージが。

servicePrincipals 作成時に passwordCredential を追加することはサポートされていません。 servicePrincipal のパスワードを追加するには、addPassword メソッドを使用します。

この仕様自体は別に良いのですが、ちょっとした破壊的変更ですよね。AAD graphからmicrosoft graphに意識して変えた時はテストもするので良いのですが、別のSDKに包まれてるとこんなところの変更気付かないですよね…

おわりに

今回の件はgithub上でもissueが上がり色々と議論が行われており、かなり多くの人がハマっていたようでした。情報収集も大事ですね。
cloud shell上のモジュールも最新化されてましたので、もうハマる人はいないんじゃないか?と思いつつ…他に居るかは分かりませんが、運悪くたどり着いた方のためにも、備忘として残します。

Discussion