証明書を利用してConnect-AzureADコマンドレットを実行

皆さんこんにちは。国井です。
以前、PowerShellでAzure ADを使うときにセキュリティの面から

$cred=Get-Credential
$cred.password | ConvertFrom-SecureString | Set-Content "password.dat"
$password = Get-Content c:\password.dat | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential "admin@xxxx.onmicrosoft.com", $password
Connect-AzureAD -Credential $credential

のようなことはやるべきでないと紹介しました。
もし、Connect-AzureADコマンドレットの認証を自動化させたいのであれば
証明書を利用して認証するように構成すると認証プロセスの自動化ができるので
このやり方を今日は紹介します。

アプリの登録の作成

証明書を利用してConnect-AzureADコマンドレットを実行するときに最初にやることは
[アプリの登録]を作成し、サービスプリンシパルをAzure ADの中に作っておくことです。

Azure AD管理センターから[アプリの登録]を新規作成します。Webアプリケーションではないので、名前だけ入力すればOKです(リダイレクトURIの指定は不要です)。
ここでは、アプリの登録の名前を「Graph API」としておきました。
続いてアプリの登録を利用するための証明書を登録します。
(Connect-AzureADコマンドレットではクライアントシークレットは使えません!)
証明書はコマンドレットを実行する予定のコンピューターで以下のコマンドレットを実行し、作成しておいてください。

##
## Create self signed certificate
##
$cert = New-SelfSignedCertificate -Subject "CN=SelfSignedCert" -CertStoreLocation "Cert:\CurrentUser\My"  -KeyExportPolicy Exportable -KeySpec Signature
$cert
##
## Export new self signed certificate as .cer file
##
$cerfile = ".\SelfSignedCert.cer"
Export-Certificate -Cert $cert -FilePath $cerfile

以上により出来上がったSelfSignedCert.cerファイルを開き、拇印の値を[アプリの登録]-[証明書とシークレット]の[証明書のアップロード]をクリックして、登録してください。

image

サービスプリンシパルの確認

[アプリの登録]から作成したサービスプリンシパルの実体はエンタープライズアプリケーションに作られます。
Azure AD管理センターの[エンタープライズアプリケーション]からGraph APIの名前を付けたエンタープライズアプリケーションにアクセスし、
オブジェクトIDとアプリケーション IDを確認しておいてください。

サービスプリンシパルにユーザー管理者ロールの割り当て

サービスプリンシパルを使ってConnect-AzureADコマンドレットの認証を行った場合、サービスプリンシパルの権限でPowerShellを操作することになるので、
サービスプリンシパルにユーザー管理者ロールを割り当てておく必要があります。ただし、ロールの割り当て画面からはサービスプリンシパルに割り当てができないのでPowerShellから割り当てを行う必要があります。
グローバル管理者で一度、Connect-AzureADコマンドレットで接続し、

Get-AzureADDirectoryRole | Where-Object {$_.DisplayName -eq "User Account Administrator"}
$Role = Get-AzureADDirectoryRole | Where-Object {$_.DisplayName -eq "User Account Administrator"}
Add-AzureADDirectoryRoleMember -ObjectId $Role.ObjectId -RefObjectId '<サービスプリンシパルのオブジェクトID>'

以上を実行すれば、サービスプリンシパルにユーザー管理者のロールを割り当てできます。
(※私のテナントではグローバル管理者をユーザー管理者ロールに入れないとコマンドレットが実行できない現象がありました。その場合、”User Account Administrator”部分を”Global Administrator”と書き換えてください)

いよいよ接続

ここまでで準備は完了です。実行してみましょう。
2行目のテナントIDはConnect-AzureADコマンドレットを実行した時に表示されるので、前に接続したときの情報を控えておき、ここに入力してください。

$cert = Get-ChildItem -path cert:\CurrentUser\My | Where-Object {$_.Thumbprint –eq '<証明書の拇印>'}
Connect-AzureAD -CertificateThumbprint $cert.thumprint -TenantId '<テナントID>' -ApplicationId '<アプリの登録のアプリケーションID>'

これでPowerShellでAzure ADを操作できるようになりました。
アプリの登録を使ってAPIアクセスするときはAPIアクセス許可を割り当てて運用しますが、
Connect-AzureADコマンドレットの場合はロールとして何が割り当てられているかでPowerShell内でできることが決まります。
そのため、サービスプリンシパルをロールに割り当てるという作業が必要になるのです。

次回、PowerShellでちょっとしたことを行うのですが、そのときに必要になるテクニックなので、覚えておいてください。