Sicherer Zugriff auf Daten in Azure Cosmos DB

GILT FÜR: SQL-API

Dieser Artikel bietet eine Übersicht über die Datenzugriffssteuerung in Azure Cosmos DB.

Azure Cosmos DB bietet drei Möglichkeiten, den Zugriff auf Ihre Daten zu steuern.

Zugriffssteuerungstyp Merkmale
Primärschlüssel Gemeinsamer geheimer Schlüssel, der jeden Verwaltungs- oder Datenvorgang zulässt. Dieser ist sowohl als Variante für Lese-/Schreibvorgänge als auch schreibgeschützte Variante verfügbar.
Rollenbasierte Zugriffssteuerung Differenziertes, rollenbasiertes Berechtigungsmodell, bei dem AAD-Identitäten (Azure Active Directory) für die Authentifizierung verwendet werden.
Ressourcentoken Differenziertes Berechtigungsmodell, das auf nativen Azure Cosmos DB-Benutzern und -Berechtigungen basiert.

Primärschlüssel

Primärschlüssel ermöglichen den Zugriff auf alle Verwaltungsressourcen für das Datenbankkonto. Jedes Konto umfasst zwei Primärschlüssel: einen primären und einen sekundären Schlüssel. Dank der Verwendung von zwei Schlüsseln können Sie Schlüssel neu generieren oder ersetzen und trotzdem ohne Unterbrechung auf Ihr Konto und Ihre Daten zugreifen. Weitere Informationen zu Primärschlüsseln finden Sie im Artikel zur Datenbanksicherheit.

Schlüsselrotation

Der Primärschlüssel kann ganz einfach gewechselt werden.

  1. Navigieren Sie zum Azure-Portal, um Ihren sekundären Schlüssel abzurufen.
  2. Ersetzen Sie den Primärschlüssel in Ihrer Anwendung durch Ihren sekundären Schlüssel. Stellen Sie sicher, dass alle Cosmos DB-Clients in sämtlichen Bereitstellungen umgehend neu gestartet werden und mit der Verwendung des aktualisierten Schlüssels beginnen.
  3. Rotieren Sie den Primärschlüssel im Azure-Portal.
  4. Überprüfen Sie, ob der neue Primärschlüssel mit allen Ressourcen funktioniert. Der Schlüsselrotationsvorgang kann je nach Größe des Cosmos DB-Kontos unterschiedlich lange dauern – von weniger als einer Minute bis hin zu mehreren Stunden.
  5. Ersetzen Sie den sekundären Schlüssel durch den neuen Primärschlüssel.

Rotation des Primärschlüssels im Azure-Portal: Veranschaulichung der NoSQL-Datenbanksicherheit

Codebeispiel für die Verwendung eines Primärschlüssels

Das folgende Codebeispiel veranschaulicht, wie mit einem Cosmos DB-Kontoendpunkt und einem Primärschlüssel eine DocumentClient-Instanz instanziiert und eine Datenbank erstellt wird:

//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);

Das folgende Codebeispiel veranschaulicht, wie mit dem Azure Cosmos DB-Kontoendpunkt und dem Primärschlüssel ein CosmosClient-Objekt instanziiert wird:

HOST = config.settings["host"]
MASTER_KEY = config.settings["master_key"]

DATABASE_ID = config.settings["database_id"]
CONTAINER_ID = config.settings["container_id"]
PARTITION_KEY = PartitionKey(path="/username")


# User that you want to give access to
USERNAME, USERNAME_2 = "user", "user2"

CONTAINER_ALL_PERMISSION = "CONTAINER_ALL_PERMISSION"
PARTITION_READ_PERMISSION = "PARTITION_READ_PERMISSION"
DOCUMENT_ALL_PERMISSION = "DOCUMENT_ALL_PERMISSION"


def create_user_if_not_exists(db, username):
    try:
        user = db.create_user(body={"id": username})
    except exceptions.CosmosResourceExistsError:
        user = db.get_user_client(username)

    return user


def create_permission_if_not_exists(user, permission_definition):
    try:
        permission = user.create_permission(permission_definition)
    except exceptions.CosmosResourceExistsError:
        permission = user.get_permission(permission_definition["id"])

    return permission


def token_client_upsert(container, username, item_id):
    try:
        container.upsert_item(
            {
                "id": item_id,
                "username": username,
                "msg": "This is a message for " + username,
            }
        )
    except exceptions.CosmosHttpResponseError:
        print("Error in upserting item with id '{0}'.".format(item_id))


def token_client_read_all(container):
    try:
        items = list(container.read_all_items())
        for i in items:
            print(i)
    except exceptions.CosmosResourceNotFoundError:
        print("Cannot read items--container '{0}' not found.".format(container.id))
    except exceptions.CosmosHttpResponseError:
        print("Error in reading items in container '{0}'.".format(container.id))


def token_client_read_item(container, username, item_id):
    try:
        item = container.read_item(item=item_id, partition_key=username)
        print(item)
    except exceptions.CosmosResourceNotFoundError:
        print("Cannot read--item with id '{0}' not found.".format(item_id))
    except exceptions.CosmosHttpResponseError:
        print("Error in reading item with id '{0}'.".format(item_id))


def token_client_delete(container, username, item_id):
    try:
        container.delete_item(item=item_id, partition_key=username)
    except exceptions.CosmosResourceNotFoundError:
        print("Cannot delete--item with id '{0}' not found.".format(item_id))
    except exceptions.CosmosHttpResponseError:
        print("Error in deleting item with id '{0}'.".format(item_id))


def token_client_query(container, username):
    try:
        for item in container.query_items(
            query="SELECT * FROM my_container c WHERE c.username=@username",
            parameters=[{"name": "@username", "value": username}],
            partition_key=username,
        ):
            print(json.dumps(item, indent=True))
    except exceptions.CosmosHttpResponseError:
        print("Error in querying item(s)")


def run_sample():
    client = cosmos_client.CosmosClient(HOST, {"masterKey": MASTER_KEY})

Rollenbasierte Zugriffssteuerung

Azure Cosmos DB bietet ein integriertes System für die rollenbasierte Zugriffssteuerung (Role-Based Access Control, RBAC), das folgende Möglichkeiten umfasst:

  • Authentifizieren Ihrer Datenanforderungen mit einer AAD-Identität (Azure Active Directory)
  • Autorisieren Ihrer Datenanforderungen mit einem differenzierten, rollenbasierten Berechtigungsmodell

Azure Cosmos DB-RBAC ist die ideale Zugriffssteuerungsmethode in folgenden Situationen:

  • Sie möchten keinen gemeinsamen geheimen Schlüssel wie den Primärschlüssel verwenden und bevorzugen einen tokenbasierten Authentifizierungsmechanismus.
  • Sie möchten Azure AD-Identitäten zum Authentifizieren Ihrer Anforderungen verwenden.
  • Sie benötigen ein differenziertes Berechtigungsmodell, um strikt einzuschränken, welche Datenbankvorgänge Ihre Identitäten ausführen dürfen.
  • Sie möchten Ihre Zugriffssteuerungsrichtlinien in Form von „Rollen“ umsetzen, die Sie mehreren Identitäten zuweisen können.

Weitere Informationen zur Azure Cosmos DB-RBAC finden Sie unter Konfigurieren der rollenbasierten Zugriffssteuerung für Ihr Azure Cosmos DB-Konto.

Ressourcentoken

Ressourcentoken ermöglichen den Zugriff auf die Anwendungsressourcen in einer Datenbank. Ressourcentoken:

  • Ermöglichen den Zugriff auf bestimmte Container, Partitionsschlüssel, Dokumente, Anhänge, gespeicherte Prozeduren, Trigger und benutzerdefinierte Funktionen.
  • Werden erstellt, wenn einem BenutzerBerechtigungen für eine bestimmte Ressource gewährt werden.
  • Werden neu erstellt, wenn durch einen POST-, GET- oder PUT-Aufruf eine Aktion für eine Berechtigungsressource ausgeführt wird.
  • Verwenden ein Hashressourcentoken, das speziell für den Benutzer, die Ressource und die Berechtigung erstellt wird.
  • Verfügen über einen anpassbaren Gültigkeitszeitraum. Die Gültigkeitsdauer beträgt standardmäßig eine Stunde. Die Tokengültigkeitsdauer kann aber explizit auf bis zu fünf Stunden festgelegt werden.
  • Stellen eine sichere Alternative zur Weitergabe des Primärschlüssels dar.
  • Ermöglichen Clients das Lesen, Schreiben und Löschen von Ressourcen im Cosmos DB-Konto gemäß den gewährten Berechtigungen.

Mit einem Ressourcentoken (durch Erstellung von Cosmos DB-Benutzern und -Berechtigungen) können Sie einem Client, dem Sie den Primärschlüssel nicht anvertrauen können, Zugriff auf Ressourcen in Ihrem Cosmos DB-Konto gewähren.

Cosmos DB-Ressourcentoken stellen eine sichere Alternative dar, um Clients das Lesen, Schreiben und Löschen von Ressourcen in einem Cosmos DB-Konto gemäß den gewährten Berechtigungen und ohne Primärschlüssel oder schreibgeschützten Schlüssel zu ermöglichen.

Hier sehen Sie ein typisches Design, bei dem Ressourcentoken angefordert, generiert und an Clients übermittelt werden können:

  1. Ein Mid-Tier-Dienst dient zum Freigeben von Benutzerfotos für eine mobile Anwendung.

  2. Der Mid-Tier-Dienst verfügt über den Primärschlüssel des Cosmos DB-Kontos.

  3. Die Foto-App ist auf mobilen Endbenutzergeräten installiert.

  4. Bei der Anmeldung richtet die Fotoapp die Identität des Benutzers mit dem Mid-Tier-Dienst ein. Dieser Mechanismus der Identitätseinrichtung hängt nur von der Anwendung ab.

  5. Nachdem die Identität eingerichtet wurde, fordert der Mid-Tier-Dienst Berechtigungen auf Grundlage der Identität an.

  6. Der Mid-Tier-Dienst sendet einen Ressourcentoken an die Phoneapp zurück.

  7. Die Phoneapp kann weiterhin den Ressourcentoken für direkten Zugriff auf Cosmos DB-Ressourcen mit den Berechtigungen verwenden, die durch das Ressourcentoken für einen bestimmten Zeitraum definiert sind.

  8. Wenn das Ressourcentoken abläuft, tritt bei anschließenden Anforderungen die Ausnahme 401 (nicht autorisierter Zugriff) auf. An dieser Stelle richtet die Phoneapp die Identität erneut ein und fordert ein neues Ressourcentoken an.

    Workflow der Azure Cosmos DB-Ressourcentoken

Die Generierung und Verwaltung von Ressourcentoken wird von den nativen Cosmos DB-Clientbibliotheken übernommen. Bei Verwendung von REST müssen Sie allerdings die Anforderungs-/Authentifizierungsheader erstellen. Weitere Informationen zum Erstellen von Authentifizierungsheadern für REST finden Sie unter Zugriffssteuerung in der SQL-API von Azure Cosmos DB oder im Quellcode für unser .NET SDK oder Node.js SDK.

Ein Beispiel für einen Dienst der mittleren Ebene, der zum Generieren oder Vermitteln von Ressourcentoken dient, finden Sie unter der ResourceTokenBroker-App.

Benutzer

Azure Cosmos DB-Benutzer werden einer Cosmos-Datenbank zugeordnet. Jede Datenbank kann null oder mehr Cosmos DB-Benutzer enthalten. Das folgende Codebeispiel veranschaulicht das Erstellen eines Cosmos DB-Benutzers mit dem Azure Cosmos DB .NET SDK v3.

//Create a user.
Database database = benchmark.client.GetDatabase("SalesDatabase");

User user = await database.CreateUserAsync("User 1");

Hinweis

Jeder Cosmos DB-Benutzer verfügt über eine ReadAsync()-Methode, mit deren Hilfe die Liste mit den Berechtigungen abgerufen werden kann, die dem Benutzer zugeordnet sind.

Berechtigungen

Eine Berechtigungsressource ist einem Benutzer zugeordnet und einer bestimmten Ressource zugewiesen. Jeder Benutzer kann null oder mehr Berechtigungen enthalten. Eine Berechtigungsressource ermöglicht den Zugriff auf ein Sicherheitstoken, das der Benutzer beim Zugriff auf einen bestimmten Container oder bestimmte Daten in einem speziellen Partitionsschlüssel benötigt. Von einer Berechtigungsressource können zwei Zugriffsebenen bereitgestellt werden:

  • Alle: Der Benutzer verfügt über Vollzugriff auf die Ressource.
  • Lesen: Der Benutzer kann die Inhalte der Ressource nur lesen und keine Schreib-, Aktualisierungs- oder Löschvorgänge für die Ressource vornehmen.

Hinweis

Zum Ausführen von gespeicherten Prozeduren muss der Benutzer über uneingeschränkte Berechtigung für den Container verfügen, in dem die gespeicherte Prozedur ausgeführt wird.

Wenn Sie die Diagnoseprotokolle für Anforderungen auf Datenebene aktivieren, werden die beiden folgenden Eigenschaften entsprechend der Berechtigung protokolliert:

  • resourceTokenPermissionId: Diese Eigenschaft gibt die von Ihnen festgelegten Ressourcentokenberechtigungs-ID an.

  • resourceTokenPermissionMode: Diese Eigenschaft gibt den Berechtigungsmodus an, den Sie beim Erstellen des Ressourcentokens festgelegt haben. Der Berechtigungsmodus kann Werte wie „Alle“ oder „Lesen“ aufweisen.

Codebeispiel für die Berechtigungserstellung

Das folgende Codebeispiel veranschaulicht das Erstellen einer Berechtigungsressource, das Lesen des Ressourcentokens der Berechtigungsressource sowie das Zuordnen der Berechtigungen zum oben erstellten Benutzer.

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

Codebeispiel für das Lesen von Berechtigungen für einen Benutzer

Der folgende Codeausschnitt zeigt, wie die dem oben erstellten Benutzer zugeordnete Berechtigung abgerufen und ein neues CosmosClient-Element für den Benutzer instanziiert werden kann, das auf einen einzelnen Partitionsschlüssel festgelegt ist.

//Read a permission, create user client session.
PermissionProperties permissionProperties = await user.GetPermission("permissionUser1Orders")

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

Unterschiede zwischen RBAC und Ressourcentoken

Subject RBAC Ressourcentoken
Authentifizierung Mit Azure Active Directory (Azure AD). Basierend auf nativen Azure Cosmos DB-Benutzern.
Die Integration von Ressourcentoken in Azure AD erfordert zusätzliche Arbeit, um Azure AD-Identitäten und Azure Cosmos DB-Benutzer zu verbinden.
Autorisierung Rollenbasiert: Rollendefinitionen ordnen zulässige Aktionen zu und können mehreren Identitäten zugewiesen werden. Berechtigungsbasiert: Für jeden Azure Cosmos DB-Benutzer müssen Datenzugriffsberechtigungen zugewiesen werden.
Tokenbereich Ein AAD-Token trägt die Identität des Anforderers. Diese Identität wird mit allen zugewiesenen Rollendefinitionen abgeglichen, um die Autorisierung durchzuführen. Ein Ressourcentoken trägt die Berechtigung, die einem bestimmten Azure Cosmos DB-Benutzer für eine bestimmte Azure Cosmos DB-Ressource erteilt wurde. Autorisierungsanforderungen für unterschiedliche Ressourcen können unterschiedliche Token erfordern.
Tokenaktualisierung Das AAD-Token wird bei Ablauf automatisch von den Azure Cosmos DB-SDKs aktualisiert. Das Aktualisieren von Ressourcentoken wird nicht unterstützt. Wenn ein Ressourcentoken abläuft, muss ein neues ausgegeben werden.

Hinzufügen von Benutzern und Zuweisen von Rollen

Um Ihrem Benutzerkonto Azure Cosmos DB-Kontoleserzugriff hinzuzufügen, lassen Sie den Besitzer eines Abonnements die folgenden Schritte im Azure-Portal ausführen.

  1. Öffnen Sie das Azure-Portal, und wählen Sie Ihr Azure Cosmos DB-Konto aus.
  2. Klicken Sie auf die Registerkarte Zugriffssteuerung (IAM) aus, und klicken Sie dann auf + Rollenzuweisung hinzufügen.
  3. Wählen Sie im Bereich Rollenzuweisung hinzufügen im Feld Rolle die Option Cosmos DB-Rolle „Kontoleser“ aus.
  4. Wählen Sie im Feld Zugriff zuweisen zu die Option Azure AD-Benutzer, -Gruppe oder -Anwendung aus.
  5. Wählen Sie den Benutzer, die Gruppe oder die Anwendung aus, dem oder der Sie Zugriff gewähren möchten. Sie können das Verzeichnis nach Anzeigename, E-Mail-Adresse oder Objektbezeichner durchsuchen. Der ausgewählten Benutzer, die Gruppe oder die Anwendung wird in der Liste der ausgewählten Elemente angezeigt.
  6. Klicken Sie auf Speichern.

Die Entität kann jetzt Azure Cosmos DB-Ressourcen lesen.

Löschen oder Exportieren von Benutzerdaten

Mithilfe des Datenbankdiensts Azure Cosmos DB können Sie alle Daten, die sich in einer Datenbank oder Containern befinden, durchsuchen, auswählen, ändern und löschen. Es liegt jedoch in Ihrer Verantwortung, mithilfe der bereitgestellten APIs die Logik zu definieren, die erforderlich ist, um personenbezogene Daten zu finden und ggf. zu löschen. Jede API für mehrere Modelle (SQL, MongoDB, Gremlin, Cassandra, Tabelle) stellt SDKs für verschiedene Sprachen bereit, die Methoden zum Durchsuchen und Löschen von Daten basierend auf benutzerdefinierten Prädikaten bieten. Sie können darüber hinaus die TTL-Funktion (time-to-live) verwenden, um Daten nach einem festgelegten Zeitraum automatisch zu löschen, wodurch keine weiteren Kosten anfallen.

Hinweis

Informationen über Anzeigen oder Löschen von personenbezogenen Daten finden Sie unter Anträge betroffener Personen für Azure im Rahmen der DSGVO. Weitere Informationen zur DSGVO finden Sie im Abschnitt zur DSGVO im Microsoft Trust Center und im Abschnitt zur DSGVO im Service Trust Portal.

Nächste Schritte