【Azure】CLIでサービスプリンシパルを作成してみた

Azure Azure

Azureを操作するCLIとしては「AzurePowershell」と「AzureCLI」が提供されています。

今回はそれらのCLIを利用してサービスプリンシパルを作成してみました。

広告

1.AzureCLIで作成してみる

Azureには [az login] にてログインしている前提です。

今回はインターフェースとしてコマンドプロンプトを利用しました。

サービスプリンシパル作成コマンド(AzureCLI)

#サービスプリンシパルの作成
az ad sp create-for-rbac --name SP-CLI --role Reader

#サブスクリプションIDの取得(powershellの場合はパイプのあとを「select-string "`"id`""」に変更します。)
az account show | find "id"

「–role」ではサブスクリプションに対する権限も付与しています。

ここでは閲覧者権限を付与しており、共同作成者を付与したい場合は「Contributor」とするなど付与したい権限を指定できます。

コマンド実行結果

C:\>
C:\>az ad sp create-for-rbac --name SP-CLI --role Reader
The underlying Active Directory Graph API will be replaced by Microsoft Graph API in a future version of Azure CLI. Please carefully review all breaking changes introduced during this migration: https://docs.microsoft.com/cli/azure/microsoft-graph-migration
Starting from Azure CLI 2.35.0, --scopes argument will become required for creating role assignments. Please explicitly specify --scopes.
Creating 'Reader' role assignment under scope '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli
{
  "appId": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
  "displayName": "SP-CLI",
  "password": "7xAxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "tenant": "zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz"
}

C:\>
C:\>az account show | find "id"
WARNING: Unable to encode the output with cp1252 encoding. Unsupported characters are discarded.
  "id": "cccccccc-cccc-cccc-cccc-cccccccccccc",

C:\>

出力に表示されている[“password”]はシークレットの値のことです。

このシークレットの値は後から取得することは不可能なので、確実にコピーしておいてください

Azureポータルからシークレットの値を確認

Azureポータル上で確認してみるとサービスプリンシパルの作成、そしてシークレットまで作成されていることが確認できます。

シークレットの期限はデフォルトで1年間となっています。

2.AzurePowershellで作成してみる

[Connect-AzAccount] にてAzureにログインしている前提です。

サービスプリンシパル作成コマンド(AzurePowershell)

#サービスプリンシパルの作成
$sp = New-AzADServicePrincipal -DisplayName SP
#シークレットの取得
$sp.PasswordCredentials.SecretText

#テナントIDとサブスクリプションID取得
$json = ConvertTo-Json -InputObject (Get-AzContext)
$json = ConvertFrom-Json $json
$json.Account.Tenants
$json.Subscription.Id

サービスプリンシパルを作成するコマンド実行時のレスポンスにシークレット情報が含まれるので、「$sp」という変数に格納してシークレットを取得します。

ここでしか確認ができないので忘れずに取得してください。

powershellコマンド実行結果

以下のような出力となり、AzurwCLIでの作成時とは出力される情報が異なります

例えば、[テナントID]はサービスプリンシパル作成後の出力に出てきません

PS C:\> $sp = New-AzADServicePrincipal -DisplayName SP
PS C:\>
PS C:\> $sp.PasswordCredentials.SecretText
FKsxxxxxxxxxxxxxxxxxxxxxxxxxxx
PS C:\>
PS C:\> $json = ConvertTo-Json -InputObject (Get-AzContext)
PS C:\> $json = ConvertFrom-Json $json
PS C:\> $json.Account.Tenants
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
PS C:\> $json.Subscription.Id
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
PS C:\>

 ※この記事では上記出力時のシークレットは隠していますが、実際に実行した際にはすべて表示されます。

Azureポータルにおけるサービスプリンシパルの設定画面

Azureポータル上で確認してみるとサービスプリンシパルの作成、そしてシークレットまで作成されていることが確認できます。

シークレットの期限はデフォルトで1年間となっています。

[検証] レスポンスの中にしかシークレット情報はないのか?

気になったので調べてみました。

まず上記と同じようにサービスプリンシパルを作成しますが、レスポンスを変数には格納せず実行します。

New-AzADServicePrincipal -DisplayName SP2

その後、[Get-AzADServicePrincipal]を利用してサービスプリンシパルからシークレット情報を取得できるか試しみます。

$sp2 = Get-AzADServicePrincipal -DisplayName "SP2"
$sp2.PasswordCredentials.SecretText

[検証] 実行結果

以下のような出力結果となり、シークレット情報は取得できませんでした。

PS C:\> Get-AzADServicePrincipal -DisplayName "SP2"

DisplayName Id                                   AppId
----------- --                                   -----
SP2         tttttttt-tttt-tttt-tttt-tttttttttttt uuuuuuuu-uuuu-uuuu-uuuu-uuuuuuuuuuuu


PS C:\>
PS C:\>
PS C:\> $sp2 = Get-AzADServicePrincipal -DisplayName "SP2"
PS C:\> $sp2.PasswordCredentials.SecretText
PS C:\>

従って、結論はシークレット情報はサービスプリンシパル作成時のレスポンスの中にしかないでした。

また、既存のサービスプリンシパルにシークレットを追加するコマンドも不明なので、追加する場合にはAzureポータルから設定追加するしかないようです。

[参考] Azureポータルからシークレットを追加する方法

参考までにAzureポータルでのシークレット追加の方法もご紹介しておきます。

サービスプリンシパルの設定画面へ遷移

[AzureポータルTOPページ]‐[Azure Active Directory]へと画面遷移し、[アプリの登録]をクリックし、該当するサービスプリンシパルを選択します。

[アプリの登録]から該当するサービスプリンシパルを選択

シークレットの追加

[証明書とシークレット]を開き、[新しいクライアントシークレット]をクリックします。

[新しいクライアントシークレット]を選択

シークレット作成のポップアップにて「シークレット名」「シークレットの期限」を入力し、「追加」をクリックします。

シークレットの作成

期限は最長で24か月まで設定することが可能です。

シークレットの確認とシークレットの値の取得

シークレットが追加されたことを確認し、シークレットの値も取得します。
シークレットの値は作成直後の画面でしか取得できないため、ここで必ずコピーしてください。

シークレットの値の確認

画面をリロードすると以下のようにシークレットの値の一部しか表示されなくなります。

リロード後はシークレットの値は確認できない

さいごに

「作成後のシークレットが確認できる」という意味ではAzureCLIで作成したほうがシークレットの取得漏れがなくて良いのかなと思いました。

なので、私としてはサービスプリンシパルをコマンドで作成する場合にはAzureCLIを利用することをお勧めしておきます。^^

タイトルとURLをコピーしました