Azure Attribute-Based Access Control (Azure ABAC)で、きめ細やかにストレージの権限を管理しよう!

クラウドにはセキュリティを保護するサービスで様々なものがありますよね。今回は新たなセキュリティ機能としてプレビュー提供された、Attribute-based access conto(ABAC)を紹介します。Role-Base Access Controlの拡張機能になるので、何が追加でできるようになるのかをまとめて、実際に動かしてみたいと思います。いろいろな手段を組み合わせてサービスやデータを保護していくわけですがその中の一つに加えてもらえたらと思います。それでは、さっそく見ていきましょう。

Attribute-based access control(ABAC)とは?

もともとクラウドには、IAMやRBACなどのIDとロールベースのアクセスコントロールという機能があります。IAM は Identity and Access Managementの略称で、ID管理の仕組みとクラウドリソースへのアクセス管理の仕組みが統合されたサービスです。「誰が」「どのリソースに対して」、「何ができるのか」を定義することで保護します。RBAC は Role-based access controlの略称で、IAMのアクセス管理の部分を担っています。Role-basedと書いてある通り、IDにRole=役割(何ができるのかをまとめたもの)を付与してリソースでできることを限定することで保護します。ちなみに、AzureでIdentity Managementは、Azure Active Directoryが担っています。

それでは、Attribute-based access control(ABAC) とは何なのでしょうか。Attributeは属性という意味ですので、利用者がリソースに付与した属性に対して、アクセス権限を付与することができるようになるということです。直感的には以下の図が理解しやすいと思います。

簡単に解説すると
・Chandraさんはリソースグループに対して、blobストレージの参照権限を持っています
・さらにblobストレージに対して、ProjectタグにCascadeの値を持ったものだけ参照できるというConditionが追加されています
・結果、Chandraさんは、タグとしてProject=Cascadeが付与されたBlobのみ参照することが許可されます。
となります。

この通りABACはRBACの拡張機能として実装されており組み合わせて利用します。
それでは現時点でABACが利用できるロールや属性をまとめてみましょう。

ABACが利用できるロール一覧

  • Storage Blob Data Contributor
  • Storage Blob Data Owner
  • Storage Blob Data Reader
  • storage blob data actionsのカスタムロール

条件に付与できるの属性一覧

  • Container name
  • Blob path
  • Blob index tags keys
  • Blob index tags

これで、だいたいやれることはイメージできたのではないでしょうか。
それでは次にどのようなシナリオで利用できるのかを考えてみましょう。

ABACのメリットとは?

マイクロソフトが上げている3つのポイントを元に考えてみたいと思います。

  • ポイント1 きめ細かいアクセス権限の付与が可能になること
    • Blobストレージのコンテナやパスで権限を付与するには、特定のBlobのSASを発行する必要があります。SASは受け取る人を特定することはできず、IP制限をしたりSASを配布する人を限定することで権限付与をしていました。ABACを利用することで、利用者を特定した上でできることを適切に管理できるようになります。
  • ポイント2 RBACの付与数の制限値2000の回避手段やそもそもの付与数の削減手段になること
    • ストレージへのアクセス権を付与するために、ストレージ自体を分けて権限を付与したり、SASを分けて発行して別のアプリケーションで管理したりすることが必要でした。個別アカウントや利用者でストレージを指定しての権限付与は、管理が煩雑になり運用に高い負荷を与えます。ABACを利用することで条件をロジックとして組むことができるので、個別に権限を付与するよりもシンプルに設定できます。
  • ポイント3 業務的な意味をもたせたアクセス権限管理ができること
    • プロジェクト名やチーム名などを属性としいて付与することで、利用者の変化のときに柔軟に権限変更ができます。業務的な意味をリソースやデータに付与できるためアプリケーションでの実装する範囲を減らせそうですね。

設定してみよう!

まずは段取りを整理しておきます。

  1. プレビューなので利用できるように機能を有効にする
    1. BlobIndexのプレビューを有効にする
    2. ABACのプレビューを有効にする – 特に不要でした。
  2. ストレージアカウントに設定を行う
    1. コンテナを作成し、ファイルをblobとしてindex tag付きでアップロードする
    2. ストレージの作成と認証をAzure ADベースにする
  3. 権限を利用者に付与する
    1. ロールを追加する(プレビュー)を利用して、対象メンバー、権限、条件を設定する
    2. 少し待つ(反映に時間がかかる)
  4. 確認してみる

それでは、はじめていきましょう!
1.のプレビュー機能のONからスタートです。BlobIndex機能をONにするazcliのコマンドは以下の通り。

# プレビュー機能を追加する
az feature register --namespace Microsoft.Storage --name BlobIndex
# プレビュー機能が追加されたか確認する
az feature list --namespace Microsoft.Storage

結果

変更中
{
    "id": "/subscriptions/0a60c63a-1bb8-4157-8702-eff1eafc6a87/providers/Microsoft.Features/providers/Microsoft.Storage/features/BlobIndex",
    "name": "Microsoft.Storage/BlobIndex",
    "properties": {
      "state": "Registering"
    }
}

変更完了後
{
    "id": "/subscriptions/0a60c63a-1bb8-4157-8702-eff1eafc6a87/providers/Microsoft.Features/providers/Microsoft.Storage/features/BlobIndex",
    "name": "Microsoft.Storage/BlobIndex",
    "properties": {
      "state": "Registered"
    }
}

2.ストレージアカウントの設定に進みましょう。
まずは、index tagをつけたblobを作成してみましょう。
blobとしてファイルをアップロードするときに設定する場合

アップロード済みのblobに追加する場合

画像を見ていただいて分かる通り、blobには「Metadata」と「Blob index tags」の2種類のKey Valueを付与することができます。今回利用するのは、Blob index tagsになりますのでご注意ください。

BLOB インデックス タグを使用して Azure BLOB データを管理および検索する (プレビュー)」に、「Blob index tags」の説明と「Metadata」との違いなど説明がありますのでご確認ください。

次に、ストレージアカウントへアカウントキーでのアクセスを無効にして、Azure Active Directoryのみによりアクセスできるように設定しましょう。

ストレージアカウントのSettingsのConfigurationを選択してもらうと、Allow storage account key accessという設定項目がありますので、Disableに設定してください。これでストレージアカウントに対してする設定は終了です。Blob index tagsにいくつかお好みの値を設定してみてください。

それでは、ABAC側の設定をしていってみましょう。
ストレージのAccess Control(IAM)を選択し、+ Addから「Add role assignment(Preview)を選択してください。

それでは、管理アカウントに「Storage Blob Data Owner」と「Storage Blob Data Contributor」を付与。参照アカウントに「Storage Blob Data Reader」を付与してみましょう。それでは管理アカウントから。管理アカウントには、Conditionを設定しませんでした。Data Owner側だけ記載しておきます。

次は参照アカウントです。Roleは「Storage Blob Data Reader」を選択してください。Conditionで「Read content from a blob with tag conditions」を選択します。

Build expressionで「Blob index tags [Values in key]」を選択することで、Blob index tagsで設定した内容を条件に記載します。ここの抽出条件であるオペレーターは様々な条件で抽出することができるようになっています。

これで設定は完了です。Conditionの設定が反映されるまでには少し時間がかかるようです。5分から10分?しばらくお待ち下さい。それでは最後に確認してみましょう。

権限がある場合

権限がない場合

まとめ

今回は、Azureに新しい権限管理の機能である「Attribute-Based Access Control」をご紹介してきました。クラウドのリソースはメタ情報を付与することで、サービスに影響を与えることなく、意味をもたせることができるようになっています。タグの戦略もありますので是非参考にされてください。

いつも読んでいただきありがとうございます。