📊

サービス プリンシパルで MS Graph PowerShell にログイン

2023/04/16に公開
1

はじめに

Azure AD PowerShell や MSOnline PowerShell が間近に迫り、自動化するにはサービス プリンシパルで MS Graph PowerShell を操作する必要が出てきます。
しかしながら、MS Graph PowerShell はクライアントシークレットに対応していないようで (間違っていたらスイマセン) 、証明書でログインする必要があったので、まとめておきます。

MS Graph PowerShell のログイン方法を確認

ドキュメントの翻訳が追い付いてないみたいですが、公式はこちらです。
https://learn.microsoft.com/en-us/powershell/microsoftgraph/authentication-commands?view=graph-powershell-1.0

このうち、サービス プリンシパル (アプリ) でのアクセスはこちらのいずれかになるようです。

証明書の拇印

Connect-MgGraph -ClientId "YOUR_APP_ID" -TenantId "YOUR_TENANT_ID" -CertificateThumbprint "YOUR_CERT_THUMBPRINT"

証明書の名前

Connect-MgGraph -ClientId "YOUR_APP_ID" -TenantId "YOUR_TENANT_ID" -CertificateName "YOUR_CERT_SUBJECT"

ローカルの証明書を使用

$Cert = Get-ChildItem Cert:\LocalMachine\My\$CertThumbprint
Connect-MgGraph -ClientId "YOUR_APP_ID" -TenantId "YOUR_TENANT_ID" -Certificate $Cert

ということで、サービス プリンシパルと証明書を作成・登録はまずは行います。

サービス プリンシパル & 証明書

セキュリティ的にはあまり望ましくないですが、簡略化のために自己署名証明書を作成して、サービス プリンシパルに登録します。
https://learn.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-self-signed-certificate#create-and-export-your-public-certificate

以下 PowerShell コマンドで証明書を作成します。

$certname = "{certificateName}"    ## Replace {certificateName}
$cert = New-SelfSignedCertificate -Subject "CN=$certname" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256

次に証明書をエクスポートします。

Export-Certificate -Cert $cert -FilePath "C:\Users\admin\Desktop\$certname.cer"   ## Specify your preferred location

このエクスポートした証明書をサービス プリンシパルに登録します。登録後、拇印をコピーしておきます。

また、サービス プリンシパルに対して、操作する MS Graph の権限を付与しておきます。

ログインして操作

実際にログインして操作してみます。ClientId にはサービス プリンシパルのアプリケーション
(クライアント) ID を指定します。

Connect-MgGraph -ClientId "{servicePrincipal's Object}" -TenantId "{tenantId}" -CertificateThumbprint "F4FB09126A7BDB760290A0AFFE73139D29FA4F13"

以下の通り、ログインしてグループの一覧を取得することができました。

(補足) 証明書のエクスポート

上記の操作をした端末以外で利用する場合、秘密鍵込みの証明書をエクスポートして、実行端末や Automation などにインポートする必要があります。そのためのコマンドは以下になります。

$mypwd = ConvertTo-SecureString -String "{myPassword}" -Force -AsPlainText  ## Replace {myPassword}
Export-PfxCertificate -Cert $cert -FilePath "C:\Users\admin\Desktop\$certname.pfx" -Password $mypwd   ## Specify your preferred location
Microsoft (有志)

Discussion