📊
サービス プリンシパルで MS Graph PowerShell にログイン
はじめに
Azure AD PowerShell や MSOnline PowerShell が間近に迫り、自動化するにはサービス プリンシパルで MS Graph PowerShell を操作する必要が出てきます。
しかしながら、MS Graph PowerShell はクライアントシークレットに対応していないようで (間違っていたらスイマセン) 、証明書でログインする必要があったので、まとめておきます。
MS Graph PowerShell のログイン方法を確認
ドキュメントの翻訳が追い付いてないみたいですが、公式はこちらです。
このうち、サービス プリンシパル (アプリ) でのアクセスはこちらのいずれかになるようです。
証明書の拇印
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
ということで、サービス プリンシパルと証明書を作成・登録はまずは行います。
サービス プリンシパル & 証明書
セキュリティ的にはあまり望ましくないですが、簡略化のために自己署名証明書を作成して、サービス プリンシパルに登録します。
以下 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
Discussion
プレビューですが v2 モジュールはクライアント シークレットに対応している他、マネージド ID での認証にも対応してます