クラウド基盤に対して人が介在しない何かしらの自動化や処理をリクエストする場合、クラウド基盤とやり取りをするクライアントには何かしらの認証方法が必ずあります。Azure の場合は、個人的にはマネージド ID で認証する方法が最優先で、サービスプリンシパルを使うのはマネージド ID が使えないケースだけに限ると思います。そして、サービスプリンシパルには証明書認証とパスワード認証があるわけですが、パスワード認証よりは証明書認証の方が扱いが面倒くさい分、少しだけマシな気がします。という事で、Azure AD サービスプリンシパルを証明書認証で使ってみました。
自己証明書とサービスプリンシパルを一緒に作成
リソースグループを作成して、サービスプリンシパル作成時に共同作成者として割り当てます。
サービスプリンシパル作成時に自己証明書も自動生成します。
bash
# リソースグループを作成します
az group create \
--name mnrspcert-rg \
--location japaneast
# 自己証明書とサービスプリンシパルを一緒に作成し共同作成者としてリソースグループに割り当てます
az ad sp create-for-rbac \
--name mnrspcert \
--role Contributor \
--create-cert \
--years 100 \
--scopes $(az group show \
--name mnrspcert-rg \
--query id \
--output tsv)
下記のような実行結果が表示されます。
bash
{
"appId": "c4c7978d-0000-0000-0000-e867bf1fa77e",
"displayName": "mnrspcert",
"fileWithCertAndPrivateKey": "/Users/testuser/tmpoz565dcm.pem",
"password": null,
"tenant": "f51181ef-0000-0000-0000-9bf13f4dceba"
}
Azure ポータルで確認すると RBAC は下記のように表示されます。
サービスプリンシパルの証明書は下記のように表示されます。
証明書認証で Azure CLI にログイン
先ほど自動生成された自己証明書を使って Azure CLI で認証します。
bash
# サービスプリンシパルでログインします
az login \
--service-principal \
--username c4c7978d-0000-0000-0000-e867bf1fa77e \
--tenant f51181ef-0000-0000-0000-9bf13f4dceba \
--password "/Users/testuser/tmpoz565dcm.pem"
下記のような実行結果が表示されます。
bash
[
{
"cloudName": "AzureCloud",
"homeTenantId": "f51181ef-0000-0000-0000-9bf13f4dceba",
"id": "25695fc8-0000-0000-0000-f98a857adbe2",
"isDefault": true,
"managedByTenants": [],
"name": "<subscription name>",
"state": "Enabled",
"tenantId": "f51181ef-0000-0000-0000-9bf13f4dceba",
"user": {
"name": "c4c7978d-0000-0000-0000-e867bf1fa77e",
"type": "servicePrincipal"
}
}
]
サービスプリンシパルで Azure リソースを作成
ストレージアカウントを作成してみます。
bash
# ストレージアカウントを作成します
az storage account create \
--name mnrspcertstor \
--resource-group mnrspcert-rg \
--sku Standard_LRS
# 作成されたストレージアカウントを表示します
az storage account list \
--output table
後片付け
bash
# 通常の対話形式でログインし直します
az login
# サービスプリンシパルを削除します
az ad sp delete \
--id c4c7978d-0000-0000-0000-e867bf1fa77e
# リソースグループを削除します
az group delete \
--name mnrspcert-rg \
--yes
# 自己証明書を削除します
rm -f /Users/testuser/tmpoz565dcm.pem
参考