Azure Storage Shared Access Signature(SAS)でIPアドレスを指定する

2021.09.17

いわさです。

Azureストレージには、Shared Access Signature(SAS) という機能があり、署名付きのアクセスURIのようなものがあります。 Amazon S3の署名付きURLと似ていますよね。

これまで、セキュリティリスクになる可能性もあり、メリット・デメリットをしっかり把握した上で使うもので、安易に使うものではないくらいに思っていました。
ドキュメントを見てみると、SASを使用する際のベストプラクティスについて記載があります。
しっかり理解した上で利用したいものです。

さて、このSASですが、アクセス元IPアドレスの制限を出来ることを最近知りましたので試してみました。

使い方はSAS生成時にIPアドレスを指定するだけ

Azureポータル上でSASの生成を行う際に、IPアドレスを指定出来ます。

なお、IPアドレスは範囲を指定することが可能です。

たとえば、sip=168.1.5.65 または sip=168.1.5.60-168.1.5.70 です。

つかってみる

.NET Coreのコンソールアプリで試してみます。

以下のクイックスタートを参考にプロジェクトを作成しましょう。
なお、私はVisual Studio 2019 for Macにて試しました。

iwasa.takahito@hoge BlobQuickStartV12 % dotnet new console -n BlobQuickstartV12
準備しています...
テンプレート "Console Application" が正常に作成されました。

作成後の操作を処理しています...
BlobQuickstartV12/BlobQuickstartV12.csproj で ' dotnet restore ' を実行しています...
  復元対象のプロジェクトを決定しています...
  /Users/iwasa.takahito/src/BlobQuickStartV12/BlobQuickstartV12/BlobQuickstartV12.csproj を復元しました (73 ms)。
正常に復元されました。
iwasa.takahito@hoge BlobQuickStartV12 % cd BlobQuickstartV12 
iwasa.takahito@hoge BlobQuickstartV12 % dotnet add package Azure.Storage.Blobs 
  復元対象のプロジェクトを決定しています...
  Writing /var/folders/d_/_8lb414x7_sg_kc6y534t_s40000gn/T/tmpqwZTmX.tmp
info : パッケージ 'Azure.Storage.Blobs' の PackageReference をプロジェクト '/Users/iwasa.takahito/src/BlobQuickStartV12/BlobQuickstartV12/BlobQuickstartV12.csproj' に追加しています。
info :   CACHE https://api.nuget.org/v3/registration5-gz-semver2/azure.storage.blobs/index.json
info : /Users/iwasa.takahito/src/BlobQuickStartV12/BlobQuickstartV12/BlobQuickstartV12.csproj のパッケージを復元しています...
info : パッケージ 'Azure.Storage.Blobs' は、プロジェクト '/Users/iwasa.takahito/src/BlobQuickStartV12/BlobQuickstartV12/BlobQuickstartV12.csproj' のすべての指定されたフレームワークとの互換性があります。
info : ファイル '/Users/iwasa.takahito/src/BlobQuickStartV12/BlobQuickstartV12/BlobQuickstartV12.csproj' に追加されたパッケージ 'Azure.Storage.Blobs' バージョン '12.10.0' の PackageReference。
info : 復元をコミットしています...
info : MSBuild ファイル /Users/iwasa.takahito/src/BlobQuickStartV12/BlobQuickstartV12/obj/BlobQuickstartV12.csproj.nuget.g.props を生成しています。
info : アセット ファイルをディスクに書き込んでいます。パス: /Users/iwasa.takahito/src/BlobQuickStartV12/BlobQuickstartV12/obj/project.assets.json
log  : /Users/iwasa.takahito/src/BlobQuickStartV12/BlobQuickstartV12/BlobQuickstartV12.csproj を復元しました (158 ms)。

エントリポイントにSASと一緒にベタ書きします。
試すだけなので。

using System;
using System.Threading.Tasks;
using Azure.Storage.Blobs;

namespace BlobQuickstartV12
{
    class Program
    {
        static async Task Main()
        {
            string blobSasUrl = "https://iwasa20210915.blob.core.windows.net/?sv=2020-08-04&ss=bfqt&srt=sco&sp=rwdlacupitfx&se=2021-09-15T16:10:32Z&st=2021-09-15T08:10:32Z&spr=https&sig=SN%hogehoge%fuga%2piyok4%3D";
            var blobServiceClient = new BlobServiceClient(new Uri(blobSasUrl), null);
            string containerName = "quickstartblobs" + Guid.NewGuid().ToString();
            BlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync(containerName);
        }
    }
}

実行してみましょう。

コンテナが生成されました。

許可されていないIPアドレスだとエラーになる

許可されてないIPアドレスから実行すると以下のように403エラーとなります。

さいごに

今回はアカウントSASを利用しましたが、ベストプラクティスでは可能であればユーザー委任SASを使うことが推奨されています。
また、ユーザー委任SASでないとしても、有効期間を短くしたり、サービスSASのアカウントポリシーを定義する。アクセス先のリソースを絞り込むなど、どのクラウドサービスでも同様に最小権限の法則に従ったほうが良いですね。