Managed Identity を使い Azure Cosmos DB の RBAC を構成する

このエントリは2025/02/16現在の情報に基づいています。将来の機能追加や変更に伴い、記載事項からの乖離が発生する発生する可能性があります。

この記事の目的

以前、Managed Identityを使ったCosmos DBのRBACを構成する記事を書いたが、現在では新たに組み込みロールが用意されているため、書き直すことにした。内容やコード自体は旧版と同じ。


以前からManaged Identityを使ったCosmos DBへのアクセスは可能であったが、Azure ADのアカウントを使ってCosmos DBのデータ プレーン操作に対するRBACが組み込みロールを使って構成できるようになっている。

データ プレーンのロールベースのアクセス制御と Azure Cosmos DB for NoSQL を使用する / Use data plane role-based access control with Azure Cosmos DB for NoSQL
https://learn.microsoft.com/azure/cosmos-db/nosql/security/how-to-grant-data-plane-role-based-access

なお、コントロールプレーンのRBACは以下のドキュメントを参照。

コントロール プレーンのロールベースのアクセス制御と Azure Cosmos DB for NoSQL を使用する / Use control plane role-based access control with Azure Cosmos DB for NoSQL
https://learn.microsoft.com/azure/cosmos-db/nosql/security/how-to-grant-control-plane-role-based-access

構成

旧版と同様、Function appからCosmos DB Java SDK v4を使いCosmos DBにアクセスするが、Function appのランタイムはJava 21を使う点だけが異なる。トポロジーは全く同じ。

準備

1) Function app

構成は旧版と同じ。

2) Cosmos DB

Database、Containerまでは旧版と同じだが、割り当てるロールとして、組み込みロールを使う(もちろんカスタムロールを作ってもよい)。まずはロールの定義リストを取得したいので、以下のコマンドを実行する。

$ az cosmosdb sql role definition list \
  -g <resource_group> \
  -a <cosmosdb_account>

すると以下のような結果が得られる。

[
  {
    "assignableScopes": [
      "/subscriptions/<subscriptionId>/resourceGroups/<resource_group>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmosdb_account>"
    ],
    "id": "/subscriptions/<subscriptionId>/resourceGroups/<resource_group>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmosdb_account>/sqlRoleDefinitions/00000000-0000-0000-0000-000000000001",
    "name": "00000000-0000-0000-0000-000000000001",
    "permissions": [
      {
        "dataActions": [
          "Microsoft.DocumentDB/databaseAccounts/readMetadata",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/executeQuery",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/readChangeFeed",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/read"
        ],
        "notDataActions": []
      }
    ],
    "resourceGroup": "cosmosdb",
    "roleName": "Cosmos DB Built-in Data Reader",
    "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions",
    "typePropertiesType": "BuiltInRole"
  },
  {
    "assignableScopes": [
      "/subscriptions/<subscriptionId>/resourceGroups/<resource_group>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmosdb_account>"
    ],
    "id": "/subscriptions/<subscriptionId>/resourceGroups/<resource_group>/providers/Microsoft.DocumentDB/databaseAccounts/<cosmosdb_account>/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002",
    "name": "00000000-0000-0000-0000-000000000002",
    "permissions": [
      {
        "dataActions": [
          "Microsoft.DocumentDB/databaseAccounts/readMetadata",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*"
        ],
        "notDataActions": []
      }
    ],
    "resourceGroup": "cosmosdb",
    "roleName": "Cosmos DB Built-in Data Contributor",
    "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions",
    "typePropertiesType": "BuiltInRole"
  }
]

ここで取得できたものが組み込みロールで、読み書き可能なものと、読み取り専用の2ロールが定義されている(実のところ、これらは旧版で作っていたカスタムロール)。

  • Cosmos DB Built-in Data Contributor
  • Cosmos DB Built-in Data Reader

あとは作成したManaged IdentityのPrincipal IDを使い、ロールに割り当てたらおしまい。スコープはルート (“/”) なので、Cosmos DBアカウントのIDを指定してもよいし、 “/” でもよい。

az cosmosdb sql role assignment create \
  -g <resource_group> \
  -a <cosmosdb_account> \
  -d <CosmosDB_BuiltIn_Role_Id> \
  -p <ManagedIdentity_PrincipalId> \
  -s "/"

このあたりは、以下のエントリでも触れている。

これでおしまい。

テスト

あとはFunctionsをテストするだけだが、内容自体は旧版と同じなので割愛する。コードはJava 21対応したものをGitHubで公開中。

CosmosDB_RBAC_Demo
https://github.com/anishi1222/CosmosDB_RBAC_Demo

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください