Entra IDに登録したアプリのシークレットの更新方法を模索しています。今回は「Microsoft Graph API」を使ってEntra IDのアプリを操作する方法についてご紹介します。
事前準備・前提
Microsoft Graph APIの実行を試した環境は以下の通りです。
OS | Windows11(Azure VM) |
Graph SDK | PowerShell |
PowerShell | 7.4.0 |
SDK認証方法 | 証明書 |
PowerShell実行 | VS Code(PowerShell Extension) |
Microsoft Graph PowerShell SDKのインストール
まずはSDKをインストールします。基本的な流れは以下のドキュメントを参考に進めていきますので、詳細はこちらをご確認ください。
実際に私が実行したコマンドを説明と共に以下に記載します。
// PowerShellGetの最新化
PS> Install-Module PowerShellGet
// SDkのインストール。必要なApplicationサブモジュールのみ。
// 認証に必要な「Microsoft.Graph.Authentication」は自動的にインストールされる。
PS> Install-Module Microsoft.Graph.Applications -Scope CurrentUser
// インストール確認
PS> Get-InstalledModule
・・・
2.11.1 Microsoft.Graph.Applications ・・・
2.11.1 Microsoft.Graph.Authentication ・・・
・・・
認証認可設定
Graph APIの認証にはEntra IDに登録したアプリの証明書を使います。基本的にはManaged Identityを利用するのがいいと思います。またアプリのシークレットだと認証時にパスワード(シークレット値)の入力が求められてしまうため、ユーザーの介入が不要な証明書にしています。
アプリの登録
アプリの登録に関しては省略します。必要に応じて以下の記事の「クライアント用のアプリ登録」を参考にしてください。(最後のシークレットの登録は不要です)
証明書の作成と登録
続いては認証に使用する証明書を作成します。以下の記事を参考に設定していきます。
まずは以下のコマンドで証明書の作成とエクスポートを行います。テスト用ですので自己証明書を利用します。名前などは適宜変更して実行してください。
$cert = New-SelfSignedCertificate -Subject "CN=MS Graph Test" -CertStoreLocation `
"Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 `
-KeyAlgorithm RSA -HashAlgorithm SHA256
Export-Certificate -Cert $cert -FilePath "./msgraph.cer"
実行が完了すると、Windowsの証明書ストアにSubjectに指定した名前で証明書が作成されていることが確認できます。また実行したフォルダには「msgraph.cer」がエクスポートされています。
続いて、エクスポートした「msgraph.cer」をアプリの証明書に登録します。以下のようにEntra IDのApp registrationsから作成したアプリを選択して、その証明書ページで証明書をアップロードします。
確認
証明書が登録できましたので、この証明書情報を利用してコマンドを実行してみます。
$clientId = $env:AZURE_CLIENT_ID
$tenantId = $env:AZURE_TENANT_ID
$cert = "CN=MS Graph Test"
Connect-MgGraph -ClientId $clientId -TenantId $tenantId -CertificateName $cert | Out-Null
Get-MgContext
TenantIDにご自身のテナントIDが、Auth TypeにAppOnlyが表示されていれば問題なくMicrosoft Graphに接続できています。では、試しに1つコマンドを実行してみましょう。
Get-MgApplication
おそらく「403」のエラーになったと思います。認可されていませんね。それもそのはずで、Microsoft Graph APIを実行するためには、実行元(今回はアプリ)に対して明示的にロールを割り当てる必要があります。今はまだそのロールを設定していません。
ロールの設定
では、具体的にどんなロールをアプリに設定すればいいのでしょうか。必要なロールは実行するAPIごとに異なりますが、以下のコマンドを使用することで確認できます。
Find-MgGraphCommand -command Get-MgApplication | Select-Object -First 1 -ExpandProperty Permissions
Name IsAdmin Description
---- ------- -----------
Application.Read.All True Read applications
Application.ReadWrite.All True Read and write applications
Application.ReadWrite.OwnedBy False Manage apps that this app creates or owns
Directory.Read.All True Read directory data
Directory.ReadWrite.All True Read and write directory data
それでは上記5つのロールを設定していきます。アプリの「API permissions」から以下のように「Add a permission」をクリックします。APIの種類で「Microsoft Graph」を選択し、タイプではユーザーの介入が不要なため「Application permissions」を選択します。
そしてpermissionsのリストから対象の5つを選択して追加します。
追加したら、「Grant admin consent for 既定のディレクトリ」をクリックして、各ロールに緑のチェックが付けば完了です。
動作確認
再度、「Get-MgApplication」などのコマンドを実行するとご自身の環境のアプリが表示されると思います。
シークレットの作成・削除
ようやくシークレットの更新に入ります。既存のシークレットを直接更新(期限を延長)することはできません。そのため、新規にシークレットを作成してから既存のシークレットを削除する流れになります。
シークレットの作成
作成するためのコードは以下のようになります。
$appId = $env:AZURE_APPLICATION_ID
$params = @{
passwordCredential = @{
displayName = "Cretaed by PowerShell"
endDateTime = (Get-Date).AddDays(1).ToString("yyyy-MM-ddThh:mm:ss")
}
}
Add-MgApplicationPassword -ApplicationId $appId -BodyParameter $params
引数のApplicationIdですが、ここはアプリのObject IDを指定します。Application(client) IDではないので注意です。期限はあえて短く設定していますが、ここは最長2年まで指定できます。
上記のコードを実行すると以下のようにシークレットが作成されます。(※databricksは無関係です)
シークレットの削除
// Application(client) ID
$clientId = $env:AZURE_CLIENT_ID
$appInfo = Get-MgApplicationByAppId -AppId $clientId
$checkDate = (Get-Date).AddDays(7).ToString("yyyy-MM-ddThh:mm:ss")
$secretInfo = $appInfo.PasswordCredentials | Where-Object { $_.EndDateTime -lt $checkDate }
$delParams = @{
keyId = $secretInfo.KeyId
}
Remove-MgApplicationPassword -ApplicationId $appId -BodyParameter $delParams
削除するためには、シークレットのkeyIdが必要です。そのため現在のシークレットを取得して、期限が1週間以内のものを削除するようにしています。
最後に
以上のように、Entra IDのアプリに関する操作は、「Microsoft Graph API」を使用できます。今回は簡単にシークレットの作成・削除の操作を確認しました。しかし、実際にはローテーションする際の命名規則やシークレットを使用しているシステムへの反映など他に考えることがたくさんあります。
それでも、APIの利用は自動化の1つの方法になると思います。また、SDKはPowerShell以外にもC#やPython、Goなど多くの言語が用意されているので、お好きな方法でお試しください。
コメント