みなさんこんにちは。 以前、Azure以外の場所にある「サーバー」をAzure Arcに接続する方法について以下のブログ記事でご紹介いたしました。
・Azure Arcに接続してみよう - サーバー(Windows)編
・Azure Arcに接続してみよう - サーバー(Linux)編
上記ブログ記事ではご説明しませんでしたが、サーバーをAzure Arcに接続することによってマネージドIDが作成されます。 AzureにおけるマネージドIDの概要についてはこちらで説明されておりますが、Microsoft Entra ID (Azure AD)の認証が必要なAzureリソースへのアクセスにマネージドIDを利用することによって、コードに資格情報を含める必要がなくなる、ユーザーが資格情報を管理する必要がなくなるといったメリットがあります。
※マネージドIDには「システム割り当て」と「ユーザー割り当て」の2種類あり、「ユーザー割り当て」はユーザーがマネージドIDのライフサイクルを管理する必要があります。 本ブログ記事ではシステム割り当てマネージドIDを扱います。
マネージドIDの仕組みについてはAzure VMを例としてこちらで説明されていますので、併せてご参照頂きますと利用方法やメリットなどよりイメージしやすくなるかもしれません。
マネージドIDの利用例としては、Azure VMからストレージアカウントに対してマネージドIDを利用してアクセスすることが可能です。(Microsoft LearnでAzure VM向けのチュートリアルが公開されています。 Windowsの場合はこちら、Linuxの場合はこちらをご参照ください。)
前述の通りAzure Arc対応サーバーにおいてもマネージドIDが存在します。 サーバーをAzure Arcに接続した後にMicrosoft Entra ID (Azure AD)を確認すると、以下のようにマネージドIDが作成されていることが確認できます。 これによってAzureリソースにアクセスすることができるという訳です。
今回はこのマネージドIDを利用してAzure Arc対応サーバーからBLOBにアクセスしてみます。 なお、今回はAzure Arc対応サーバーからストレージアカウントのコンテナーにあるテキストファイルを閲覧できるようにしてみたいと思います。 (Microsoft Learnで公開されているAzure VM向けのチュートリアルと同様のことをAzure Arc対応サーバーで実現できるか試してみます。)
検証環境
今回利用する環境ではUbuntu 20.04 LTSをAzure Arc対応サーバーとしています。 本サーバーはオンプレミスに存在しています。
今回はAzure Arc対応サーバー上でcurlならびにjqを利用します。
また、「himds」グループのメンバーで操作を行います。(Azure Arc対応サーバーでマネージドIDを利用する際の前提条件によるものです。 詳細についてはこちらをご参照ください。)
ストレージアカウント、コンテナーの作成
Azure Arc対応サーバーからのアクセス先を用意します。 まずはストレージアカウントを作成します。
こちらのストレージアカウントにコンテナーを作成します。
作成したコンテナーに動作確認用のテキストファイルをアップロードしました。
コンテナーのアクセス許可
Azure Arc対応サーバーのマネージドIDにアクセス許可を付与します。 今回はBLOBの閲覧ができればよいため「ストレージ BLOB データ閲覧者」ロールを割り当てます。
トークンの取得とBLOBへのアクセス
Azure VMの場合、自身のメタデータを取得するためにAzure VM内からAzure Instance Metadata Service (IMDS) へアクセスすることが可能です。(IMDSの詳細についてはこちらをご参照ください。) Azure VMの場合、IMDSエンドポイントのIPアドレスとして「169.254.169.254」を利用します。 従って、curlを使用してマネージドIDのトークンを取得する場合は以下のようなコマンドを実行します。("-H Metadata:true"はこちらに記載の通りSSRF攻撃対策です。)
curl -H Metadata:true "http://169.254.169.254/metadata/identity/oauth2/token(以下省略)"
一方でAzure Arc対応サーバーの場合、Hybrid Instance Metadata Service (HIMDS)を利用します。 エンドポイントは「http://localhost:40342」(または「http://127.0.0.1:40342」)です。
curl -H Metadata:true "http://localhost:40342/metadata/identity/oauth2/token(以下省略)"
今回はMicrosoft Learnで紹介されている手順を参考にトークンを取得します。(こちらのMicrosoft LearnではAzure Key Vaultへのアクセスについて説明されていますが、本ブログ記事ではBLOBにアクセスするため"resource"の指定が異なっています。)
チャレンジトークンの取得
Azure Arc対応サーバー上で以下のコマンドを実行します。
challenge_token_path=$(curl -s -D - -H Metadata:true ¥
"http://localhost:40342/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https%3A%2F%2Fstorage.azure.com" |
grep Www-Authenticate | cut -d "=" -f 2 | tr -d "[:cntrl:]")
challenge_token=$(sudo cat $challenge_token_path)
リソーストークンの取得
続いて以下のコマンドを実行します。
resource_token=$(curl -s -H Metadata:true ¥
-H "Authorization: Basic $challenge_token" ¥
"http://localhost:40342/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https%3A%2F%2Fstorage.azure.com" |
jq -r .access_token)
BLOBへのアクセス
リソーストークンを使用してAzure上のBLOBにアクセスできるか確認します。 Azure Arc対応サーバー上で以下のコマンドを実行します。 x-ms-versionで指定するバージョンについてはこちらをご参照ください。
curl -H "x-ms-version: 2023-08-03" -H "Authorization: Bearer $resource_token" ¥
"https://<StorageAccount>.blob.core.windows.net/<Container>/<File>"
テキストファイルの内容が返ってくることが確認できました。
まとめ
今回はAzure Arc対応サーバーのマネージドIDを利用してAzure上のBLOBにアクセスしてみました。 Azure VMの場合はMicrosoft Learnにチュートリアルが用意されていますが、Azure Arc対応サーバーの場合はHIMDSのエンドポイントをはじめ異なる点がありますのでご留意ください。
以前に投稿したブログ記事「Azure Arc対応サーバーを管理してみよう - 監視編」でAzure Monitorエージェントを扱いましたが、この時にも実はマネージドIDが利用されていました。 こちらに記載されている通り、ワークスペースの認証のために利用されているようです。 Azure Monitorエージェントを扱った際はユーザーがマネージドIDを意識する場面はありませんでしたので、本ブログ記事ではストレージアカウントを利用してAzure Arc対応サーバーのマネージドIDを意識した操作を行ってみました。
SB C&SはAzureを取り扱われているパートナー企業様へ様々なご支援のメニューを用意しております。 メニューの詳細やAzureに関するご相談等につきましては以下の「Azure相談センター」をご確認ください。
Azure相談センター
https://licensecounter.jp/azure/
※ 本ブログは弊社にて把握、確認された内容を基に作成したものであり、製品の動作や仕様について担保・保証するものではありません。サービスや製品の動作、仕様等に関しては、予告なく変更される場合があります。
Azureに関するブログ記事一覧はこちら
著者紹介
SB C&S株式会社
ICT事業本部 技術本部 第1技術部 4課
中原 佳澄