チュートリアル:Linux VM のシステム割り当て ID を使用して SAS 資格情報で Azure Storage にアクセスする

Azure リソース用マネージド ID は、Microsoft Entra ID の機能です。 Azure リソースのマネージド ID をサポートする各 Azure サービスは、それぞれ固有のタイムラインの下で提供されます。 ご利用のリソースに対するマネージド ID の提供状態と既知の問題をあらかじめ確認しておいてください。

このチュートリアルでは、Linux 仮想マシン (VM) のシステム割り当てマネージド ID を使用して、ストレージの Shared Access Signature (SAS) 資格情報を取得する方法について説明します。 具体的には Service SAS 資格情報です。

Note

このチュートリアルで生成された SAS キーは、この VM に制限またはバインドされません。

サービス SAS は、アカウント アクセス キーを公開することなく、ストレージ アカウント内のオブジェクトへの制限付きアクセスを許可します。 期間を限定し、特定のサービスについて、アクセス権を付与することができます。 ストレージ SDK の使用時など、ストレージ操作を実行するときに、SAS 資格情報を通常どおりに使用できます。 このチュートリアルでは、Azure Storage CLI を使用して BLOB のアップロードとダウンロードを行う手順を示します。 学習内容は次のとおりです。

  • ストレージ アカウントの作成
  • ストレージ アカウントに BLOB コンテナーを作成する
  • Resource Manager で VM にストレージ アカウント SAS へのアクセス権を付与する
  • VM の ID を使用してアクセス トークンを取得し、それを使用して Resource Manager から SAS を取得する

前提条件

ストレージ アカウントの作成

まだお持ちでない場合は、この時点でストレージ アカウントを作成します。 この手順をスキップし、既存のストレージ アカウントのキーへのアクセス権を、VM のシステム割り当てマネージド ID に付与することもできます。

  1. Azure portal の左上隅にある [+/新しいサービスの作成] ボタンを選択します。

  2. [ストレージ][ストレージ アカウント] の順に選択すると、新しい [ストレージ アカウントの作成] パネルが表示されます。

  3. ストレージ アカウントの [名前] を入力します。この名前は後で使います。

  4. [デプロイ モデル][アカウントの種類] が "Resource Manager" と "汎用" にそれぞれ設定されている必要があります。

  5. [サブスクリプション][リソース グループ] が、前の手順で VM を作成したときに指定したものと一致していることを確認します。

  6. [作成] を選択します

    新しいストレージ アカウントの作成画面を示したスクリーンショット。

ストレージ アカウントに BLOB コンテナーを作成する

後で、新しいストレージ アカウントにファイルをアップロードおよびダウンロードします。 ファイルには Blob Storage が必要であるため、ファイルを格納する BLOB コンテナーを作成する必要があります。

  1. 新たに作成したストレージ アカウントに戻ります。

  2. 左側のパネルで、[Blob service] の下の [コンテナー] リンクを選択します。

  3. ページの上部にある [+ コンテナー] を選択すると、[新しいコンテナー] パネルがスライドして現れます。

  4. コンテナーに名前を付け、アクセス レベルを選択して、[OK] を選択します。 指定した名前は、後ほどチュートリアルで使用されます。

    ストレージ コンテナー作成画面を示したスクリーンショット。

VM のシステム割り当てマネージド ID にストレージ SAS を使用するためのアクセス権を付与する

Azure Storage では Microsoft Entra 認証がネイティブでサポートされます。そのため、VM のシステム割り当てマネージド ID を使用して Resource Manager からストレージ SAS を取得し、その SAS を使ってストレージにアクセスできます。 この手順では、ストレージ アカウントの SAS へのアクセス権を VM のシステム割り当てマネージド ID に付与します。 お使いのストレージ アカウントを含むリソース グループのスコープで、マネージド ID に [ストレージ アカウント共同作成者] ロールを割り当てます。

詳細な手順については、「Azure portal を使用して Azure ロールを割り当てる」を参照してください。

Note

ストレージの確認にアクセス許可を付与するために使用できるさまざまなロールの詳細については、Microsoft Entra ID を使用した BLOB とキューへのアクセスの承認に関するページを参照してください。

VM ID を使用してアクセス トークンを取得し、そのアクセス トークンを使用して Azure Resource Manager を呼び出す

チュートリアルの残りの部分では、以前に作成した VM から作業を行います。

これらの手順を完了するには、SSH クライアントが必要です。 Windows を使用している場合は、Linux 用 Windows サブシステムで SSH クライアントを使用することができます。 SSH クライアントのキーの構成についてサポートが必要な場合は、以下を参照してください。

SSH クライアントができたので、次の手順に進みます。

  1. Azure portal で [Virtual Machines] に移動し、Linux 仮想マシンに移動して、[概要] ページの上部にある [接続] を選択します。 VM に接続する文字列をコピーします。

  2. SSH クライアントを使用して VM に接続します。

  3. 次に、Linux VM の作成時に追加したパスワードの入力を求められます。 パスワードを入力すると、正常にサインインできます。

  4. CURL を使用して Azure Resource Manager のアクセス トークンを取得します。

    アクセス トークンの CURL 要求と応答を次に示します。

    curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true    
    

    Note

    前述の要求では、"resource" パラメーターの値は、Microsoft Entra ID で予期されるものと完全に一致している必要があります。 Azure Resource Manager のリソース ID を使用する場合は、URI の末尾にスラッシュを含める必要があります。 次の応答では、簡潔にするため access_token 要素が短縮されています。

    {
      "access_token":"eyJ0eXAiOiJ...",
      "refresh_token":"",
      "expires_in":"3599",
      "expires_on":"1504130527",
      "not_before":"1504126627",
      "resource":"https://management.azure.com",
      "token_type":"Bearer"
    }
    

ストレージ呼び出しを行うために Azure Resource Manager から SAS 資格情報を取得する

ここで、CURL を使用して、前のセクションで取得したアクセス トークンで Resource Manager を呼び出し、ストレージ SAS 資格情報を作成します。 SAS 資格情報を取得したら、ストレージのアップロード/ダウンロード操作を呼び出すことができます。

この要求のために、次の HTTP 要求のパラメーターを使用して SAS 資格情報を作成します。

{
    "canonicalizedResource":"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>",
    "signedResource":"c",              // The kind of resource accessible with the SAS, in this case a container (c).
    "signedPermission":"rcw",          // Permissions for this SAS, in this case (r)ead, (c)reate, and (w)rite.  Order is important.
    "signedProtocol":"https",          // Require the SAS be used on https protocol.
    "signedExpiry":"<EXPIRATION TIME>" // UTC expiration time for SAS in ISO 8601 format, for example 2017-09-22T00:06:00Z.
}

これらのパラメーターは、SAS 資格情報に対する要求の POST 本文に含まれます。 SAS 資格情報を作成するためのパラメーターの詳細については、List Service SAS REST リファレンスに関する記事を参照してください。

次の CURL 要求を使用して、SAS 資格情報を取得できます。 <SUBSCRIPTION ID><RESOURCE GROUP><STORAGE ACCOUNT NAME><CONTAINER NAME>、および <EXPIRATION TIME> の各パラメーターの値は、必ず実際の値に置き換えてください。 <ACCESS TOKEN> の値は、以前に取得したアクセス トークンに置き換えます。

curl https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE ACCOUNT NAME>/listServiceSas/?api-version=2017-06-01 -X POST -d "{\"canonicalizedResource\":\"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>\",\"signedResource\":\"c\",\"signedPermission\":\"rcw\",\"signedProtocol\":\"https\",\"signedExpiry\":\"<EXPIRATION TIME>\"}" -H "Authorization: Bearer <ACCESS TOKEN>"

注意

前述の URL のテキストでは大文字小文字が区別されるので、リソース グループに使用されている大文字小文字が正しく反映されていることを確認してください。 さらに、これは POST 要求であり、GET 要求ではないことを知っておくことが重要です。

CURL 応答は、SAS 資格情報を返します。

{"serviceSasToken":"sv=2015-04-05&sr=c&spr=https&st=2017-09-22T00%3A10%3A00Z&se=2017-09-22T02%3A00%3A00Z&sp=rcw&sig=QcVwljccgWcNMbe9roAJbD8J5oEkYoq%2F0cUPlgriBn0%3D"} 

Linux VM で、次のコマンドを使用して、BLOB ストレージ コンテナーにアップロードするサンプル BLOB ファイルを作成します。

echo "This is a test file." > test.txt

次に、SAS 資格情報を使用して CLI az storage コマンドで認証を行い、ファイルを BLOB コンテナーにアップロードします。 この手順では、VM に最新の Azure CLI をインストールする必要があります (まだインストールされていない場合)。

 az storage blob upload --container-name 
                        --file 
                        --name
                        --account-name 
                        --sas-token

応答:

Finished[#############################################################]  100.0000%
{
  "etag": "\"0x8D4F9929765C139\"",
  "lastModified": "2017-09-21T03:58:56+00:00"
}

さらに、Azure CLI を使用してファイルをダウンロードし、SAS 資格情報を使用して認証することもできます。

要求:

az storage blob download --container-name
                         --file 
                         --name 
                         --account-name
                         --sas-token

応答:

{
  "content": null,
  "metadata": {},
  "name": "testblob",
  "properties": {
    "appendBlobCommittedBlockCount": null,
    "blobType": "BlockBlob",
    "contentLength": 16,
    "contentRange": "bytes 0-15/16",
    "contentSettings": {
      "cacheControl": null,
      "contentDisposition": null,
      "contentEncoding": null,
      "contentLanguage": null,
      "contentMd5": "Aryr///Rb+D8JQ8IytleDA==",
      "contentType": "text/plain"
    },
    "copy": {
      "completionTime": null,
      "id": null,
      "progress": null,
      "source": null,
      "status": null,
      "statusDescription": null
    },
    "etag": "\"0x8D4F9929765C139\"",
    "lastModified": "2017-09-21T03:58:56+00:00",
    "lease": {
      "duration": null,
      "state": "available",
      "status": "unlocked"
    },
    "pageBlobSequenceNumber": null,
    "serverEncrypted": false
  },
  "snapshot": null
}

次のステップ

このチュートリアルでは、Linux VM のシステム割り当てマネージド ID を使用して SAS 資格情報で Azure Storage にアクセスする方法について説明しました。 Azure Storage SAS の詳細については、以下を参照してください。