Azure Fundamentals · レッスン

パスワードレス認証のためのマネージド ID

VM または App Service にシステム割り当てマネージド ID を割り当て、Key Vault と Blob Storage への RBAC アクセスを付与して、アプリケーション コードからシークレットを排除します。

レッスン 1/413 ステップ

「パスワードレス認証のためのマネージド 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 mySharedIdentity

RBAC権限を付与する

マネージド 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パスワードレス認証のためのマネージド ID
  2. 疎結合メッセージングのための Azure Service Bus
  3. Azure Container Apps
  4. エンドツーエンドの開発者ワークフロー
← Azure Fundamentalsに戻る