AzureのService Principalをazコマンドで作成する方法|Linux環境変数による認証設定と権限設計の実践

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Azure > AzureのService Principalをazコマンドで作成する方法|Linux環境変数による認証設定と権限設計の実践
「AzureのCLIスクリプトを自動化したいが、毎回az loginするのは無理がある」「CI/CDパイプラインやcronジョブからAzureリソースを操作するにはどうすればいいのか」

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 でパスワードローテーションが可能


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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を作成する手順

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
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" # }

出力されるappIdpasswordtenantの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_IDAZURE_CLIENT_SECRETAZURE_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
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Azure対応セミナーの詳細を見る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。