広告

AzureマネージドID

Authentication

はじめに

本記事の一部の知識を理解するには、前提知識としてサービスプリンシパルの理解が必要です。
こちらの記事を参考にしていただければと思います。

AzureマネージドIDとは

Azure マネージド ID は、無料で使用できる Azure Active Directory (Azure AD) の機能です。 この機能により、アプリが Azure のリソースとサービスで認証されるようにするための ID が自動的に作成されます。
From Document

※以前はマネージドサービス ID (MSI) という名前でした。
※マネージドIDは特殊なサービスプリンシパルです。【2021/02/04修正】

公式ドキュメントはなかなか理解しづらいところがあると思いますので、以下で少し詳しく説明します。

【2021/02/04修正】
Azure マネージドIDは、Azureのリソースに紐づくAAD(Azure AD)のアカウント(ID)Azure Active Directory (Azure AD) の機能です。
マネージドIDを持つ有効にしたAzureのリソース上で実行するアプリは、このアカウント(マネージドID)マネージドIDによって作成されたアカウント(サービスプリンシパル)を使って自動的にAzureの認証をするので、アプリ内でAzureの認証をする必要がなくなります。
また、マネージドIDの権限はRBAC(ロールベースサクセス制御)で付与、変更することが可能です。(マネージドIDはAAD認証とRBACの組み合わせです。)

マネージドIDのメリットと制限

マネージドIDを使用すると、ざっと以下のようなメリットが得られます。

  • アプリ内(コード)で認証認可の処理が省ける
  • ユーザーパスワードの管理が不要になる
  • 認証情報漏洩リストを削減
  • 資格情報をローテーションしたり、証明書の有効期限切れを心配したりする必要はない
  • 作成が簡単

また、マネージドIDを使用するには以下の制限もあります。

  • Azureのリソースのみ使用可能
    • オンプレミスや他クラウドのリソースはサービスプリンシパルを使いましょう
  • マネージドIDをサポートするAzureサービスのみ使用可能

マネージドIDの種類

マネージドIDは以下2種類あります。

  • システム割り当てマネージドID
  • ユーザー割り当てマネージドID

それぞれどんなものなのか、特徴などを紹介していきます。

システム割り当てマネージドID

システム割り当てIDは、Azure サービス インスタンス (VM など) で直接有効にできるマネージドIDです。
システム割り当てIDを有効にすると、Azure Resource Manager(Azureの管理コンポーネント)を通じて Azure によってサービス プリンシパルが作成されます。

  • システム割り当てIDの特徴
    • Azureサービスインスタンスで簡単に有効するだけで作成可能(Azureリソースの一部となる)
      • マネージドIDを有効にすることで、AAD上にAzureリソースと同名のサービスプリンシパル(SPN)が作成される
    • システム割り当てIDは一つのAzureリソースのみ紐づくことが可能(一対一)
    • 紐づくAzureリソースが削除されると、システム割り当てIDも削除される

ユーザー割り当てマネージドID

ユーザー割り当てIDは、スタンドアロンの Azure リソースとして作成するマネージドIDです。
システム割り当てIDと違って、作成時はどのリソースとも紐づいていないため、使用するには紐づく作業が必要です。
ユーザー割り当てID作成(プロビジョニング)時すると、システム割り当てIDの場合と同じく、Azure によってサービス プリンシパルが作成されます。

  • ユーザー割り当てIDの特徴
    • 事前に手動で作成する必要がある。作成方法
    • 作成後はAzureのリソースと紐づく作業が必要(AzureリソースのマネージドID有効の画面で設定可能)
    • ユーザー割り当てIDは複数のAzureリソースに紐づくことが可能(多対一)
    • 紐づくAzureリソースが削除されると、ユーザー割り当てIDは削除されない(削除は手動で行う必要がある)
      • AzureADの「エンタープライズ アプリケーション」ページでマネージドIDが確認可能

マネージドIDの作成(VM例)

マネージドIDの作成(或いは有効)をするは、Azure ポータルサイトで行うことができます。
ここでは、VMのマネージドID作成について、設定手順を簡単に記載しておきます。

  1. Azureポータルサイトにログインする
  2. 「Virtual Machine」一覧で、アプリがホストしているVMを選択する
  3. 「概要」ページの「設定」で、「ID」を選択する
  4. 「システム割り当てID」タブを選択し、「状態」を「オン」にして、「保存」をクリックする
    • 「ユーザー割り当てID」の場合、「追加」で事前用意したユーザー割り当てマネージドIDを選択し、「追加」をクリックする

マネージドIDの作成は以上で完了になりますが、必要に応じて、権限割り当ての作業も必要になります。権限の割り当てはAzure RBACで行えますので、手順についてこちらをご参考にしていただければと思います。

マネージドIDで認証を行う(開発の知識)

【2021/02/04追記】
マネージドIDの構成について、ご紹介しましたが、では「自動認証」って書いていたけど、マネージドIDはどう使うでしょうか。
この部分で、使い方について、簡単にご紹介します。

アプリがAzureリソースへアクセスするときに、サービスプリンシパルのアクセストークンで認証を行います。
マネージドIDが構成されているAzureリソース上では、サービスプリンシパルのアクセストークンを発行することが可能です。
発行したアクセストークンを使えば、マネージドID(サービスプリンシパル)権限通りのアクセスができるようになります。

サンプルコード(Powershell)

このサンプルはマネージドIDが構成されているAzure VM上で実行するものとなります。

# 自分のAPI URiにトークンリクエストを送信し、$response変数に応答内容を保持する。内容にアクセストークンが含まている
# マネージドIDが構成されたから、アクセストークンが発行できるようになる
# 注意:Uri最後の`/`は省略不可
$response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' -Method GET -Headers @{Metadata="true"}

# $response.Contentの内容をJSON形式に変換し、$content変数に渡す
$content = $response.Content | ConvertFrom-Json

# $contentのトークン部分のみ取り出して、$ArmToken変数に渡す
$ArmToken = $content.access_token

# トークンをHeaderにいれて、認証が必要なコンテンツをAPIで取得する
# このトークンを使えば、マネージドIDが持っている権限範囲で、任意のAzureリソースへのアクセスが可能になる
# 注意:URLは大文字小文字区別
(Invoke-WebRequest -Uri https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>?api-version=2016-06-01 -Method GET -ContentType "application/json" -Headers @{ Authorization ="Bearer $ArmToken"}).content

サンプルのように、マネージドIDが構成されているAzureリソース上で、サービスプリンシパのアクセストークンを発行して、他のリソースへアクセスするようにできます。

この例では、アクセストークンを直接扱う例となりますが、実際にC#などの言語のSDKでは、トークンで認証する部分を用意してくれてるので、簡単に認証ができます。
例えば、C#言語のDefaultAzureCredential Class とかです。

仕組み

Azure VMでマネージドIDを有効にし、認証するまでの流れは公式資料に分かり安い図がありましたので、ここで使わせて頂きます。

マネージドIDの仕組み

ステップ①~④はマネージドIDを有効にするときの動きで、⑤~⑦はサンプルコードの内容となります。

※ Azure Instance Metadata Serviceは、IaaS VMからのみアクセスできるREST APIエンドポイントのことです。

最後に

前回を続いて、サービスプリンシパルのAzureリソース専用バージョンと言えるマネージドIDをご紹介しました。
使い分けとして、Azureリソース上のアプリ認証はマネージドIDで、オンプレミスや他のクラウドのアプリからの認証はサービスプリンシパルでいいでしょう。
ここまで自動でできるものは、開発において、かなり使い勝手のいい機能ではないでしょうか。

ここまで読んでいただいて、お疲れ様でした。

参考サイト

【2021/02/04追記】

コメント

タイトルとURLをコピーしました