Azureの操作を人間が手動で行うなら
az loginでブラウザ認証すれば済みますが、Linuxサーバーで動くスクリプトやCI/CDからAzureを操作したい場合は「Service Principal(サービスプリンシパル)」が必要になります。この記事では、
az ad sp create-for-rbacコマンドを使ってService Principalを作成し、Linuxの環境変数による認証設定と権限スコープの設計手順を解説します。cronジョブでの実用例と、パスワードのローテーション手順まで一通りカバーします。RHEL 9.4 / Ubuntu 24.04 LTS上のAzure CLI 2.60で動作確認済みです。この記事のポイント
・ az ad sp create-for-rbac でSPを作成し認証情報を取得できる
・ スコープはサブスクリプション全体でなくリソースグループ単位に絞るのが基本
・ AZURE_CLIENT_ID / SECRET / TENANT_ID の3変数でスクリプト認証が完結する
・ az ad sp credential reset でパスワードローテーションが可能
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Service PrincipalとManaged Identityの違いを整理する
AzureのService Principal(SP)は、アプリケーションやスクリプトがAzureリソースにアクセスするための「サービスアカウント」に相当します。Linux/Windows問わず、Azure外部の環境からAzure APIを呼び出す場合に使います。似た仕組みに「Managed Identity」がありますが、Managed IdentityはAzure VM・App Serviceなど「Azureの中で動いているリソース」専用で、資格情報の管理をAzureが自動で行います。一方のSPは、オンプレミスのLinuxサーバーやGitHub Actionsなど「Azure外部の環境」から使う場面に適しています。
| 認証方式 | 使いどころ | 資格情報管理 |
|---|---|---|
| Service Principal | 外部のLinuxサーバー・CI/CD・cronジョブ | 自分で管理(定期ローテーション推奨) |
| Managed Identity | Azure VM・App Service・AKS Pod内 | Azureが自動管理(資格情報不要) |
Service Principalを作成する手順
Azure対応セミナーの詳細を見る >>
1. 事前確認|サブスクリプションIDを取得する
Service Principalのスコープ(権限の及ぶ範囲)を指定するために、まずサブスクリプションIDを確認します。# 現在のサブスクリプションIDを確認する az account show --query id --output tsv # 出力例 # a1b2c3d4-e5f6-7890-abcd-ef1234567890 # 複数サブスクリプションがある場合は一覧表示する az account list --output table
2. Service Principalを作成する
az ad sp create-for-rbacコマンドでSPを作成します。--roleには付与するロール名を、--scopesには権限の有効範囲を指定します。(注意)
--scopesはサブスクリプション全体ではなく、対象のリソースグループに限定することを推奨します。不要な権限を広げないことがクラウドセキュリティの鉄則です。# リソースグループ単位でSPを作成する(最小権限の原則) az ad sp create-for-rbac --name "myDeploySP" --role Contributor --scopes /subscriptions/a1b2c3d4-e5f6-7890-abcd-ef1234567890/resourceGroups/myRG # 出力例(この情報はこの時点でしか表示されないため必ず保管する) # { # "appId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", # "displayName": "myDeploySP", # "password": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", # "tenant": "cccccccc-cccc-cccc-cccc-cccccccccccc" # }
appId・password・tenantの3つが認証に必要な情報です。passwordはこの時点でしか表示されません。必ずその場で安全な場所に保管してください。3. 作成したSPのロール割り当てを確認する
# SP情報をappIdで確認する az ad sp show --id bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb --output table # ロール割り当て一覧を確認する az role assignment list --assignee bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb --output table # 出力例(role assignment list) # Principal Role Scope # ------------- ----------- ------------------------------------------- # myDeploySP Contributor /subscriptions/.../resourceGroups/myRG
LinuxからService Principalで認証する方法
1. 環境変数による認証(スクリプト・自動化向け)
LinuxのシェルスクリプトやcronジョブからAzureを操作する場合は、環境変数に認証情報をセットしてからaz login --service-principalを実行します。ブラウザを必要としない非対話型の認証ができるため、自動化処理に向いています。シェルスクリプトで環境変数を扱う基本についてはLinux 基本コマンドの解説も参考にしてください。
# 認証情報を環境変数にセットする export AZURE_CLIENT_ID="bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb" export AZURE_CLIENT_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" export AZURE_TENANT_ID="cccccccc-cccc-cccc-cccc-cccccccccccc" # Service Principalとしてサインインする az login --service-principal --username "$AZURE_CLIENT_ID" --password "$AZURE_CLIENT_SECRET" --tenant "$AZURE_TENANT_ID" # ログインが成功したことを確認する az account show --output table
AZURE_CLIENT_SECRETをスクリプト内に直書きしないでください。.envファイルや、Azure Key Vaultに保管して参照する設計を採用することをお勧めします。2. cronジョブでService Principalを使う実用例
毎晩、AzureのVM一覧をTSVで取得してローカルに保存するスクリプトの例です。#!/bin/bash # /usr/local/bin/azure-daily-report.sh # 環境変数を外部ファイルから読み込む(スクリプトに直書きしない) source /etc/azure-sp.env # Service Principalでサインインする(--output none で余分な出力を抑制) az login --service-principal --username "$AZURE_CLIENT_ID" --password "$AZURE_CLIENT_SECRET" --tenant "$AZURE_TENANT_ID" --output none # VM一覧をTSVとして保存する az vm list --resource-group myRG --output tsv > /var/log/azure/vm-list-$(date +%Y%m%d).tsv echo "Azure VM一覧を更新しました: $(date)"
/etc/azure-sp.envの書式例です。このファイルのパーミッションは600に設定してください。# /etc/azure-sp.env(必ずchmod 600 /etc/azure-sp.envで保護する) AZURE_CLIENT_ID="bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb" AZURE_CLIENT_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" AZURE_TENANT_ID="cccccccc-cccc-cccc-cccc-cccccccccccc"
パスワードのローテーションと削除
1. SP秘密情報をリセット(ローテーション)する
Service Principalのパスワード(クライアントシークレット)は定期的にローテーションするべきです。az ad sp credential resetを使うと既存のパスワードを無効化して新しいパスワードを発行できます。# パスワードをリセットする(既存パスワードは無効化される) az ad sp credential reset --id bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb # 出力例(新しいpasswordを必ず保管してから/etc/azure-sp.envを更新する) # { # "appId": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", # "password": "新しいランダムパスワードが表示される", # "tenant": "cccccccc-cccc-cccc-cccc-cccccccccccc" # }
2. 不要になったSPを削除する
使わなくなったService Principalは速やかに削除します。不要な認証情報を放置することは重大なセキュリティリスクになります。# SPを削除する(appIdで指定する) az ad sp delete --id bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb
よくあるエラーと対処法
「Insufficient privileges to complete the operation」が出る場合SP作成にはAzure ADでのアプリケーション登録権限が必要です。自分のアカウントに「アプリケーション管理者」以上のAzure ADロールが付与されているか確認してください。サブスクリプションの「共同作成者」ロールだけでは不足します。
「az login --service-principal が失敗する」場合
AZURE_CLIENT_ID・AZURE_CLIENT_SECRET・AZURE_TENANT_IDの3つが正確に設定されているか確認してください。パスワードに特殊文字が含まれる場合、シェルのエスケープが必要なことがあります。直接引数として渡す場合は"..."で括ると安全です。ネットワーク的に
login.microsoftonline.com(Azure AD認証エンドポイント)へ到達できることも前提です。Linuxサーバーのアウトバウンド接続やポートの状態確認にはLinux ポート確認の全コマンドが役立ちます。「az role assignment list で何も表示されない」場合
スコープが限定的な場合、デフォルト表示では出てこないことがあります。
--allオプションを追加してすべてのスコープを表示してください。# スコープを問わず全ロール割り当てを表示する az role assignment list --assignee bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb --all --output table
本記事のまとめ
azコマンドによるService Principalの主要な操作を以下の表にまとめます。| やりたいこと | コマンド |
|---|---|
| SPを作成する(リソースグループ単位) | az ad sp create-for-rbac --name SP名 --role Contributor --scopes /subscriptions/ID/resourceGroups/RG名 |
| SPのロール割り当てを確認する | az role assignment list --assignee appId --output table |
| SPとしてサインインする | az login --service-principal --username appId --password パスワード --tenant テナントID |
| SPのパスワードをリセットする | az ad sp credential reset --id appId |
| SPを削除する | az ad sp delete --id appId |
Azure対応セミナーの詳細を見る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AzureのDNSゾーンとAWS Route 53を比較する|パブリックDNS管理とazコマンドによるAレコード・CNAMEの実践設定
- この記事の属するカテゴリ:Azureへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます