Azure Cosmos DB のデータへのアクセスをセキュリティで保護する

適用対象: NoSQL

この記事では、Azure Cosmos DB でのデータ アクセス制御の概要について説明します。

Azure Cosmos DB には、データへのアクセスを制御する方法が 3 つあります。

アクセス制御の種類 特性
主/セカンダリ キー 任意の管理操作またはデータ操作を行うことができる共有シークレット。 読み取り/書き込みと読み取り専用の両方の種類があります。
ロールベースのアクセス制御 (RBAC) 認証に Microsoft Entra ID を使用したきめ細かいロールベースのアクセス許可モデル。
リソース トークン ネイティブな Azure Cosmos DB のユーザーとアクセス許可に基づく、きめ細かいアクセス許可モデル。

主/セカンダリ キー

主/セカンダリ キーにより、データベース アカウントのすべての管理リソースへのアクセスが提供されます。 各アカウントは、主キーとセカンダリ キーという 2 つのキーで構成されます。 デュアル キーの目的は、キーを再生成またはロールできるようにし、アカウントとデータへの継続的なアクセスを提供することです。 プライマリ/セカンダリ キーの詳細については、「Azure Cosmos DB におけるデータベース セキュリティの概要」を参照してください。

アカウント キーを表示するには、左側のメニューで [キー] を選択します。 次に、各キーの右側にある [表示] アイコンを選択します。 [コピー] ボタンを選択して、選択したキーをコピーします。 キーごとに同じアイコンを選択することで後でキーを非表示にできます。これによってアイコンは更新され [非表示] ボタンになります。

Screenshot of the View account key for Azure Cosmos DB.

キーのローテーションと再生成

Note

次のセクションでは、NoSQL 用 API のキーをローテーションする手順と再生成する手順について説明します。 別の API を使用している場合は、MongoDB 用 APICassandra 用 APIGremlin 用 API、または Table 用 API の各セクションを参照してください。

キーの更新とキーの再生成に関してアカウントを監視するには、「キーの更新とキーの再生成に関する Azure Cosmos DB アカウントの監視」を参照してください。

キーのローテーションと再生成のプロセスは単純です。 まず、Azure Cosmos DB アカウントにアクセスするために、アプリケーションで主キーまたはセカンダリ キーのいずれかを一貫して使用していることを確認します。 次に、次のセクションの手順に従います。

  1. Azure portal で Azure Cosmos DB アカウントに移動します。

  2. 左側のメニューから [キー] を選択した後、セカンダリ キーの右側にある省略記号から [セカンダリ キーの再生成] を選択します。

    Screenshot that shows the Azure portal showing how to regenerate the secondary key.

  3. 新しいセカンダリ キーが Azure Cosmos DB アカウントに対して一貫して機能していることを確認します。 Azure Cosmos DB アカウントのサイズに応じて、キーの再生成にかかる時間は 1 分から数時間までさまざまです。

  4. アプリケーションで、主キーをセカンダリ キーに置き換えます。

  5. Azure portal に戻り、主キーの再生成をトリガーします。

    Screenshot that shows the Azure portal showing how to regenerate the primary key.

主キーを使用するコード サンプル

次のコード サンプルは、Azure Cosmos DB アカウント エンドポイントとプライマリ キーを使用して CosmosClient のインスタンスを作成する方法を示しています。

// Read the Azure Cosmos DB endpointUrl and authorization keys from config.
// These values are available from the Azure portal on the Azure Cosmos DB account blade under "Keys".
// Keep these values in a safe and secure location. Together they provide Administrative access to your Azure Cosmos DB account.

private static readonly string endpointUrl = ConfigurationManager.AppSettings["EndPointUrl"];
private static readonly string authorizationKey = ConfigurationManager.AppSettings["AuthorizationKey"];

CosmosClient client = new CosmosClient(endpointUrl, authorizationKey);

ロールベースのアクセス制御

Azure Cosmos DB が公開する組み込みの RBAC システムによって以下のことが可能になります。

  • Microsoft Entra ID を使用してデータ要求を認証します。
  • きめ細かいロールベースのアクセス許可モデルを使用してデータ要求を認可する。

Azure Cosmos DB RBAC は、次のような状況で理想的なアクセス制御方法です。

  • プライマリ キーなどの共有シークレットは使用したくなく、トークンベースの認証メカニズムを利用したい。
  • Microsoft Entra の ID を使用して要求を認証したい。
  • 各 ID がどのデータベース操作の実行を許可されるかを厳密に制限する、きめ細かなアクセス許可モデルが必要である。
  • 複数の ID に割り当てることができる "ロール" としてアクセス制御ポリシーを具現化したい。

Azure Cosmos DB RBAC の詳細については、「Azure Cosmos DB アカウントのロールベースのアクセス制御の構成」を参照してください。

Azure Cosmos DB for MongoDB の RBAC を構成するための情報とサンプル コードについては、Azure Cosmos DB for MongoDB でのロールベースのアクセス制御の構成に関するページを参照してください

リソース トークン

リソース トークンは、データベース内のアプリケーション リソースへのアクセスを提供します。 リソース トークン:

  • 特定のコンテナー、パーティション キー、ドキュメント、添付ファイルへのアクセスを提供します。
  • ユーザーが特定のリソースへのアクセス許可を付与されたときに作成されます。
  • アクセス許可リソースが POST、GET、または PUT 呼び出しによって操作されたときに再作成されます。
  • ユーザー、リソース、およびアクセス許可用に特別に構築されたハッシュ リソース トークンを使用します。
  • カスタマイズ可能な有効期間による時間の拘束があります。 既定の有効期間は 1 時間です。 ただし、トークンの有効期間が明示的に指定される場合もあります (最大 24 時間)。
  • 主キーの代わりに使用できる安全な代替手段を提供します。
  • クライアントが、付与されているアクセス許可に応じて、Azure Cosmos DB アカウント内のリソースの読み取り、書き込み、削除を行えるようにします。

リソース トークンは、プライマリ キーを使用して信頼することができないクライアントに、Azure Cosmos DB アカウント内のリソースへのアクセスを提供したい場合に、(Azure Cosmos DB ユーザーとアクセス許可を作成することによって) 使用できます。

Azure Cosmos DB リソース トークンは、クライアントが、あなたが付与されたアクセス許可に従って、プライマリ キーや読み取り専用キーなしで Azure Cosmos DB アカウント内のリソースの読み取り、書き込み、削除を行うことを可能にする安全な代替手段を提供します。

リソース トークンの要求、生成、およびクライアントへの配布を行うことができる一般的な設計パターンを以下に示します。

  1. 中間層サービスは、ユーザーの写真を共有するモバイル アプリケーションを提供するために設定します。

  2. 中間層サービスは、Azure Cosmos DB アカウントの主キーを持ちます。

  3. 写真アプリは、ユーザーのモバイル デバイスにインストールされます。

  4. ログイン時に、写真アプリは、中間層サービスを使用してユーザーの ID を確立します。 この ID 確立のしくみは完全にアプリケーションに依存します。

  5. いったん ID が確立されると、中間層サービスはその ID に基づいてアクセス許可を要求します。

  6. 中間層サービスから、リソース トークンが電話アプリに返されます。

  7. 電話アプリはリソース トークンを引き続き使用し、リソース トークンによって定義されたアクセス許可を使用して、リソース トークンによって許可された間隔で Azure Cosmos DB リソースに直接アクセスすることができます。

  8. リソース トークンの期限が切れると、それ以降の要求は、401 (承認されていない例外) を受け取ります。 この時点で、写真アプリは ID を再度確立し、新しいリソース トークンを要求します。

    Screenshot that shows an Azure Cosmos DB resource tokens workflow.

リソース トークンの生成と管理は、ネイティブの Azure Cosmos DB クライアント ライブラリによって処理されます。 ただし、REST を使用する場合は、要求/認証ヘッダーを作成する必要があります。 REST 用の認証ヘッダーの作成の詳細については、「Azure Cosmos DB リソースのアクセス制御」や、.NET SDK または Node.js SDK のソース コードを参照してください。

ブローカー リソース トークンを生成するために使用される中間層サービスの例については、「ResourceTokenBroker アプリ」を参照してください。

ユーザー

Azure Cosmos DB ユーザーは、Azure Cosmos DB データベースに関連付けらていれます。 各データベースには、0 人以上の Azure Cosmos DB ユーザーを含めることができます。 次のコード サンプルは、Azure Cosmos DB .NET SDK v3 を使用して Azure Cosmos DB ユーザーを作成する方法を示しています。

// Create a user.
Database database = client.GetDatabase("SalesDatabase");
User user = await database.CreateUserAsync("User 1");

Note

各 Azure Cosmos DB ユーザーには、そのユーザーに関連付けられたアクセス許可の一覧を取得するために使用できる ReadAsync() メソッドがあります。

アクセス許可

アクセス許可リソースは、ユーザーに関連付けられて特定のリソースに割り当てられます。 各ユーザーには、0 個以上のアクセス許可を含めることができます。 アクセス許可リソースによって、ユーザーが特定のパーティション キー内の特定のコンテナーまたはデータにアクセスするときに必要なセキュリティ トークンへのアクセスが提供されます。 アクセス許可リソースによって提供できるアクセス レベルとしては以下の 2 つが利用可能です。

  • All: ユーザーはリソースに対して完全なアクセス許可を持ちます。
  • Read: ユーザーは、リソースの内容を読み取ることだけはできますが、リソース上の書き込み、更新、または削除操作を実行することはできません。

Note

ストアド プロシージャを実行するには、ユーザーは、内部でストアド プロシージャを実行するコンテナー上の All アクセス許可を持っている必要があります。

データ プレーン要求に関する診断ログを有効にすると、アクセス許可に対応する次の 2 つのプロパティがログに記録されます。

  • resourceTokenPermissionId: このプロパティは、指定したリソース トークンのアクセス許可 ID を示します。

  • resourceTokenPermissionMode: このプロパティは、リソース トークンの作成時に設定したアクセス許可モードを示します。 アクセス許可モードとして指定できるのは、AllRead などの値です。

アクセス許可を作成するコード サンプル

次のコード サンプルは、アクセス許可リソースを作成し、アクセス許可リソースのリソース トークンを読み取って、先ほど作成したユーザーにアクセス許可を関連付ける方法を示しています。

// Create a permission on a container and specific partition key value
Container container = client.GetContainer("SalesDatabase", "OrdersContainer");
await user.CreatePermissionAsync(
    new PermissionProperties(
        id: "permissionUser1Orders", 
        permissionMode: PermissionMode.All, 
        container: container,
        resourcePartitionKey: new PartitionKey("012345")));

ユーザーのアクセス許可を読み取るコード サンプル

次のコード スニペットは、作成したユーザーに関連付けられているアクセス許可を取得し、1 つのパーティション キーにスコープを指定して、そのユーザーの新しい CosmosClient のインスタンスを作成する方法を示しています。

// Read a permission, create user client session.
Permission permission = await user.GetPermission("permissionUser1Orders").ReadAsync();

CosmosClient client = new CosmosClient(accountEndpoint: "MyEndpoint", authKeyOrResourceToken: permission.Resource.Token);

RBAC とリソース トークンの違い

サブジェクト RBAC リソース トークン
認証 Microsoft Entra ID を使用します。 ネイティブな Azure Cosmos DB ユーザーに基づく。
リソース トークンを Microsoft Entra ID と統合するには、Microsoft Entra ID と Azure Cosmos DB ユーザーをブリッジするための追加作業が必要です。
承認 ロールベース: ロール定義は、許可されるアクションのマップを行い、複数の ID に割り当てることができます。 アクセス許可ベース: Azure Cosmos DB ユーザーごとに、データのアクセス許可を割り当てる必要があります。
トークンのスコープ Microsoft Entra トークンには、要求元の ID が含まれます。 この ID は、割り当てられているすべてのロールの定義と照合され、認可が実行されます。 リソース トークンでは、特定の Azure Cosmos DB ユーザーに付与された特定の Azure Cosmos DB リソースに対するアクセス許可が保持されます。 異なるリソース上の認可要求には、異なるトークンが必要な場合があります。
トークンの更新 Microsoft Entra トークンは、有効期限が切れると Azure Cosmos DB SDK によって自動的に更新されます。 リソース トークンの更新はサポートされていません。 リソース トークンの有効期限が切れた場合は、新しいリソース トークンを発行する必要があります。

ユーザーの追加とロールの割り当てを行う

ユーザー アカウントに Azure Cosmos DB アカウントの閲覧者アクセス権を追加するには、サブスクリプションの所有者が Azure Portal で以下の手順を実行します。

  1. Azure portal を開き、Azure Cosmos DB アカウントを選択します。

  2. [アクセス制御 (IAM)] を選択します。

  3. [追加]>[ロールの割り当ての追加] を選択して、[ロールの割り当ての追加] ページを開きます。

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

    設定
    Role Cosmos DB アカウント閲覧者。
    アクセスの割り当て先 ユーザー、グループ、またはサービス プリンシパルに割り当てます。
    メンバー アクセス権を付与したいディレクトリ内のユーザー、グループ、またはアプリケーション。

    Screenshot that shows the Add role assignment page in the Azure portal.

そのエンティティが Azure Cosmos DB リソースを閲覧できるようになります。

ユーザー データの削除またはエクスポート

データベース サービスとして、Azure Cosmos DB は、データベースまたはコンテナー内にあるすべてのデータの検索、選択、変更、削除を行うことを可能とします。 必要に応じて、提供されている API を使用し、何らかの個人データを検索および消去するために必要なロジックを定義することは自身の責任です。

各マルチモデル API (SQL、MongoDB、Gremlin、Cassandra、Table) は、カスタム述語に基づいてデータを検索および削除するメソッドを含むさまざまな言語の SDK を提供しています。 また、有効期限 (TTL) 機能を有効にして、追加のコストを発生させずに、指定した期間後に自動的にデータを削除することもできます。

Note

個人データの表示または削除については、「GDPR のための Azure データ サブジェクト要求」を参照してください。 GDPR の詳細については、Microsoft Trust Center の GDPR に関するセクションおよび Service Trust Portal の GDPR に関するセクションをご覧ください。

次のステップ