パスワードレス認証のためのマネージド ID
VM または App Service にシステム割り当てマネージド ID を割り当て、Key Vault と Blob Storage への RBAC アクセスを付与して、アプリケーション コードからシークレットを排除します。
「パスワードレス認証のためのマネージド ID」はCoddyKit上の無料Azure Fundamentalsレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAzure Fundamentals学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Azure Fundamentalsコースには全4レッスンが含まれています。
保存された認証情報の問題
従来、アプリケーションは、構成ファイルや環境変数に保存された接続文字列またはAPIキーを使用して、StorageやKey VaultなどのAzureサービスに接続していました。これらの認証情報は、誤ってソース管理にコミットされたり、ログに露出したり、侵害の際に盗まれたりする可能性があります。Managed Identityを使用すると、アプリケーションが認証情報を保存する必要が完全になくなります。代わりにAzure自体がリソースに代わってトークンを発行・更新し、アプリケーションは実行時にAzureへ現在のトークンを要求するだけです。
マネージド IDとは
Managed Identityは、Azureリソース(VM、App Service、Function Appなど)に関連付けられた、Microsoft Entra IDで自動的に管理されるサービス プリンシパルです。AzureプラットフォームがIDの認証情報を作成・維持し、定期的にローテーションするため、コードがパスワードやシークレットを扱うことはありません。リソース上で実行されるアプリケーションは、Azure Instance Metadata Service(IMDS)のエンドポイント(http://169.254.169.254)を呼び出して短期間有効なOAuthトークンを取得し、そのトークンをAzureサービスに提示します。
# Get a token from IMDS (runs inside an Azure VM or App Service)
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://storage.azure.com/' \
-H 'Metadata: true'システム割り当てとユーザー割り当て
マネージド IDには2種類あります。システム割り当ては単一のAzureリソースに紐付けられます。リソースで有効にすると作成され、リソースを削除すると自動的に削除されます。ユーザー割り当ては、個別に作成してから1つ以上のAzureリソースに関連付ける、独立したEntra IDのIDです。ユーザー割り当てIDは、複数のサービス(例:複数のFunction App)で同じIDとRBAC権限を共有する必要がある場合に便利で、ロール割り当ての重複を避けられます。
# Enable system-assigned managed identity on an App Service
az webapp identity assign \
--resource-group myRG \
--name myWebApp
# Create and assign a user-assigned identity
az identity create --name mySharedIdentity --resource-group myRG
az webapp identity assign \
--resource-group myRG \
--name myWebApp \
--identities mySharedIdentityRBAC権限を付与する
マネージド IDを有効にした後は、対象のAzureリソースに対するRBAC権限を付与する必要があります。たとえば、App ServiceからBLOBを読み取れるようにするには、ストレージアカウント上で、App Serviceのマネージド IDにStorage Blob Data Readerロールを割り当てます。RBACの割り当ては最小権限の原則に従い、必要最小限の権限だけを付与してください。絶対に必要な場合を除き、マネージド IDにOwnerまたはContributorを割り当てないでください。
# Get the managed identity object ID
PRINCIPAL_ID=$(az webapp identity show \
--resource-group myRG --name myWebApp \
--query principalId --output tsv)
# Assign Storage Blob Data Reader role
az role assignment create \
--assignee $PRINCIPAL_ID \
--role 'Storage Blob Data Reader' \
--scope '/subscriptions/<sub>/resourceGroups/myRG/providers/Microsoft.Storage/storageAccounts/mystorageacct'コードでDefaultAzureCredentialを使用する
Azure SDKには、複数の認証方式を決められた順序で自動的に試すDefaultAzureCredentialクラスが用意されています。認証方式には、環境変数、ワークロード ID、マネージド ID、Azure CLI、Visual Studioなどがあります。アプリケーションがAzure(App Service、VM、Function App)上で実行されると、DefaultAzureCredentialはコードを変更しなくても自動的にマネージド IDを使用します。ローカルでは、開発者はAzure CLIのセッションを使用して認証します。この1つの認証情報クラスで、条件分岐なしにあらゆる環境に対応できます。
# Python example using DefaultAzureCredential
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
credential = DefaultAzureCredential()
client = BlobServiceClient(
account_url='https://mystorageacct.blob.core.windows.net',
credential=credential
)
blobs = client.get_container_client('mycontainer').list_blobs()
for blob in blobs:
print(blob.name)Azure Key Vaultでマネージド IDを使用する
一般的なパターンとして、マネージド IDを使用して実行時にAzure Key Vaultのシークレットへアクセスします。データベースのパスワードをアプリケーション設定に保存する代わりに、Key Vaultに保存し、アプリのマネージド IDにそのVault上のKey Vault Secrets Userロールを付与します。アプリケーションは起動時に、DefaultAzureCredentialを使用してKey Vaultからシークレットを取得します。このパターンにより、シークレットがコード、構成ファイル、環境変数に保存されることはなく、Key Vaultにのみ存在し、必要なときだけ一時的に取得されます。
# Python: Read a Key Vault secret using managed identity
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
credential = DefaultAzureCredential()
client = SecretClient(
vault_url='https://mykeyvault.vault.azure.net/',
credential=credential
)
secret = client.get_secret('DatabasePassword')
print('Secret value retrieved successfully')Azure SQLアクセスにマネージド IDを使用する
Azure SQL DatabaseはEntra ID認証をサポートしているため、マネージド IDでユーザー名とパスワードを使わずにSQLへ認証できます。有効にするには、まずSQLサーバーにEntra ID管理者を設定し、次に対象データベースでマネージド IDの表示名に対するCREATE USERステートメントを実行して、適切なデータベースロールを付与します。アプリケーションはAzure SDKのDefaultAzureCredentialと、https://database.windows.net/をスコープとするアクセストークンを使用して、完全なパスワードレスで接続します。
-- In Azure SQL: create a user for the managed identity
CREATE USER [myWebApp] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [myWebApp];
ALTER ROLE db_datawriter ADD MEMBER [myWebApp];AKSワークロードにマネージド IDを使用する
Azure Kubernetes Serviceでは、個々のPodがWorkload Identity(AAD Pod Identityの後継)を使用してマネージド IDトークンを取得できます。ユーザー割り当てマネージド IDを作成し、それをAKSのOIDC発行者とフェデレーションして、Kubernetesサービスアカウントにアノテーションを付けます。するとAzure Workload Identity webhookが必要な環境変数を注入し、PodのDefaultAzureCredentialがトークンを取得できるようになります。これにより、Kubernetes Secretsオブジェクトにシークレットを保存せずに、コンテナ化されたマイクロサービスでもパスワードレス認証を利用できます。
# Create federated identity credential for AKS workload identity
az identity federated-credential create \
--name myFederatedCredential \
--identity-name mySharedIdentity \
--resource-group myRG \
--issuer $(az aks show --resource-group myRG --name myAKS --query 'oidcIssuerProfile.issuerUrl' -o tsv) \
--subject 'system:serviceaccount:default:myapp-sa' \
--audiences 'api://AzureADTokenExchange'マネージド IDアクセスを監査する
マネージド IDの認証情報は開発者から見えませんが、すべてのトークン発行イベントとリソースアクセスイベントは記録されます。Entra IDサインインログには、マネージド IDによるすべてのトークン要求について、アクセス対象のリソース、時刻、要求の成否などが記録されます。Azure StorageのアクティビティログとKey Vaultの監査ログには、トークンを使用して実行された具体的な操作が記録されます。これらのログは、マネージド IDに関するセキュリティ監査やインシデント調査に不可欠です。
# Query Entra ID sign-in logs for a managed identity
az monitor activity-log list \
--resource-group myRG \
--caller myWebApp \
--start-time 2024-06-01 \
--output table接続文字列から移行する
現在アプリケーションで接続文字列またはAPIキーを使用している場合は、次の3つの手順でマネージド IDへ移行します。手順1 — コンピューティングリソースでマネージド IDを有効にします。手順2 — 各対象サービス上で、そのIDに適切なRBACロールを割り当てます。手順3 — 接続文字列の代わりにDefaultAzureCredentialを使用するよう、アプリケーションコードを更新します。移行を確認したら、App Serviceの構成とKey Vaultから接続文字列を削除します。この移行は、最新のAzure SDKを使用するアプリケーションであれば、通常、コードを最小限変更するだけで完了できます。
セキュリティ上のメリットのまとめ
Managed Identityには、認証情報ベースの認証と比べて、4つの主要なセキュリティ上のメリットがあります。認証情報を保存しない — 盗まれたり、誤ってコミットされたりするものがありません。自動ローテーション — Azureが基盤となる証明書を、ダウンタイムなしでローテーションします。スコープを限定した権限 — 最小権限の原則に従い、必要なRBACロールだけをIDに付与します。完全な監査証跡 — すべてのアクセス試行がEntra IDとアクセス先サービスの監査ログに記録されます。新しいAzureサービス統合では、マネージド IDを標準の認証方式にする必要があります。
クイックチェック
このレッスンで学んだ Microsoft Azure Fundamentals(AZ-900)の概念について、理解度を確認します。
レッスンのまとめ
このレッスンでは、マネージド IDによって Azure リソースに自動管理される Entra ID の ID が付与され、保存された認証情報が不要になること、Azure SDK の DefaultAzureCredential が Azure 上ではマネージド ID を、開発環境では開発者の認証情報を透過的に使用すること、そして対象サービスに対する RBAC ロールの割り当てによって、その ID がアクセスできる対象を制御することを学びました。次は、アプリケーションコンポーネント間の疎結合なメッセージングを実現する Azure Service Bus について学びます。
AI チューターと学ぶ Azure Fundamentals — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「パスワードレス認証のためのマネージド ID」レッスンは無料ですか?
はい。「パスワードレス認証のためのマネージド ID」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Azure Fundamentalsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Azure Fundamentalsコースには全4レッスンが含まれています。
「パスワードレス認証のためのマネージド ID」で何を学びますか?
VM または App Service にシステム割り当てマネージド ID を割り当て、Key Vault と Blob Storage への RBAC アクセスを付与して、アプリケーション コードからシークレットを排除します。 ブラウザで直接実行するハンズオンコードでAzure Fundamentalsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Azure Fundamentalsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAzure Fundamentalsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「パスワードレス認証のためのマネージド ID」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAzure Fundamentalsレッスンでコードを書いて実行できますか?
はい。すべてのAzure Fundamentalsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- パスワードレス認証のためのマネージド ID
- 疎結合メッセージングのための Azure Service Bus
- Azure Container Apps
- エンドツーエンドの開発者ワークフロー