Zugriff auf Anwendungsdaten mithilfe von parametrisierten sicheren Ansichten sichern und steuern

Parametrisierte sichere Ansichten bieten Datensicherheit und Zeilenzugriffssteuerung für Anwendungen. Sie filtern Abfrageergebnisse basierend auf der Identität des Anwendungsnutzers.

In dieser Anleitung wird beschrieben, wie Sie parametrisierte sichere Ansichten in AlloyDB for PostgreSQL einrichten, Datenbankrollen und ‑berechtigungen konfigurieren, um den Zugriff auf Basistabellen einzuschränken, und die Datensicherheit überprüfen. Die Beispiele in diesem Dokument dienen nur zur Veranschaulichung.

Was sind parametrisierte sichere Ansichten?

Als allgemeine Best Practice sollte Ihre Anwendung mit einem Dienstkonto ausgeführt werden, das den minimal erforderlichen Zugriff auf Ihre Datenbank hat. Wenn Ihre Anwendung beispielsweise nicht in Ihre Datenbank schreiben soll, sollte sie eine Rolle mit Lesezugriff verwenden. Sie sollten diese Zugriffssteuerungen auf Datenbankebene konfigurieren.

Wenn Ihre Anwendung eine detailliertere Sicherheit erfordert, als der Standardzugriff auf Datenbankebene zulässt, können Sie parametrisierte sichere Ansichten verwenden, um dafür zu sorgen, dass Nutzer nur die Daten sehen, für die sie autorisiert sind. Parametrisierte sichere Ansichten bieten dynamische Datensicherheit und Zeilenzugriffssteuerung, die für mandantenfähige SaaS-Anwendungen geeignet sind, ohne dass für jeden Endnutzer der Anwendung separate Datenbankrollen erforderlich sind.

Die Verwendung parametrisierter sicherer Ansichten bietet drei Hauptvorteile:

  • Dynamische Datensicherheit und Zugriffssteuerung auf Zeilenebene: Filtert Abfragen mithilfe von Endnutzerkennungen, sodass Nutzer unabhängig von der Formulierung der Abfrage nur auf die Daten zugreifen können, für die sie autorisiert sind.
  • Einfachere Rollenverwaltung: Es wird eine einzige freigegebene Datenbankrolle für alle Anwendungsnutzer verwendet, anstatt separate Datenbankrollen für jeden einzelnen Nutzer zu verwalten.

Ziele

  • Parametrisierte sichere Ansichten mit benannten Ansichtsparametern erstellen
  • Datenbankrolle erstellen, die von der Anwendung verwendet wird, um eine Verbindung zur Datenbank herzustellen und auf parametrisierte sichere Ansichten zuzugreifen
  • Der neuen Rolle Berechtigungen für parametrisierte sichere Ansichten gewähren und den Zugriff auf Basistabellen aufheben
  • Verbindung mit der neuen Rolle herstellen und bestätigen, dass auf die eingeschränkten Tabellen nicht zugegriffen werden kann
  • Abfragen für die parametrisierten sicheren Ansichten mit der Funktion execute_parameterized_query() oder der QueryData API ausführen

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.

Neuen Nutzern von Google Cloud steht möglicherweise eine kostenlose Testversion zur Verfügung.

Löschen Sie die von Ihnen erstellten Ressourcen, um weitere Kosten zu vermeiden, wenn Sie die Aufgaben in diesem Dokument abgeschlossen haben. Weitere Informationen finden Sie unter Bereinigen.

Hinweis

Bevor Sie parametrisierte sichere Ansichten erstellen, müssen Sie die folgenden Voraussetzungen erfüllen.

Abrechnung und erforderliche APIs aktivieren

  1. Wählen Sie in der Google Cloud Console ein Projekt aus.

    Zur Projektauswahl

  2. Die Abrechnung für Ihr Google Cloud Projekt muss aktiviert sein.

  3. Aktivieren Sie die Cloud APIs, die zum Erstellen von AlloyDB for PostgreSQL und zum Herstellen einer Verbindung erforderlich sind.

    1. API aktivieren

    2. Klicken Sie im Schritt Confirm project (Projekt bestätigen) auf Next (Weiter), um den Namen des Projekts zu bestätigen, an dem Sie Änderungen vornehmen möchten.

    3. Klicken Sie im Schritt APIs aktivieren auf Aktivieren, um Folgendes zu aktivieren:

      • AlloyDB for PostgreSQL API
      • Knowledge Catalog API
      • Data Analytics API with Gemini (geminidataanalytics.googleapis.com)

Erstellen und Verbindung zu einer Datenbank herstellen

  1. Cluster und primäre Instanz erstellen
  2. Verbindung zur Instanz herstellen und Datenbank erstellen

Erforderliche Rollen zuweisen und IAM-Datenbanknutzer erstellen

Wenn Sie sich mit Identity and Access Management (IAM) authentifizieren und queryData-Anfragen für parametrisierte sichere Ansichten ausführen möchten, konfigurieren Sie den IAM-Nutzer oder das IAM-Dienstkonto:

  1. Weisen Sie IAM_USER_EMAIL die folgenden IAM-Rollen in Ihrem Google Cloud -Projekt zu:

    • roles/geminidataanalytics.queryDataUser
    • roles/serviceusage.serviceUsageConsumer
    • roles/alloydb.databaseUser

    Weitere Informationen zum Zuweisen von IAM-Rollen finden Sie unter IAM-Richtlinienbindung für ein Projekt hinzufügen.

  2. Aktivieren Sie die IAM-Authentifizierung auf Ihrer AlloyDB-Instanz und fügen Sie IAM_USER_EMAIL als IAM-basierten Datenbanknutzer in Ihrem Cluster hinzu. Sie müssen diesen IAM-Datenbanknutzer erstellen, bevor Sie ihm die Datenbankrolle psv_user zuweisen können. Weitere Informationen zum Einrichten von IAM-Datenbanknutzern finden Sie unter IAM-Authentifizierung verwalten.

Umgebung vorbereiten

Um Abfragen für eine parametrisierte sichere Ansicht auszuführen, müssen Sie die Datenbank, die Datenbankrollen, die Erweiterung parameterized_views und das Anwendungsschema einrichten.

Datenbank-Flag aktivieren

Aktivieren Sie das Datenbank-Flag parameterized_views.enabled, mit dem die erforderlichen Erweiterungsbibliotheken geladen werden. Weitere Informationen finden Sie unter Datenbank-Flags einer Instanz konfigurieren.

Datenbank einrichten

  • Datenbank mit dem Namen database für die Anwendungsdaten und parametrisierten sicheren Ansichten erstellen Weitere Informationen finden Sie unter Datenbank erstellen.

Datenbankrollen, die Erweiterung und das Anwendungsschema erstellen

  1. Rufen Sie in der Google Cloud Console die Seite „AlloyDB“ auf.

    Zu AlloyDB

  2. Wählen Sie einen Cluster aus der Liste aus.

  3. Klicken Sie im Navigationsmenü auf AlloyDB Studio.

  4. Melden Sie sich mit der Authentifizierung für das Administratorkonto in Studio an.

  5. Klicken Sie auf Authentifizieren. Im Bereich „Explorer“ wird eine Liste der Objekte in Ihrer Datenbank angezeigt.

  6. Klicken Sie auf Neuer SQL-Editor-Tab oder Neuer Tab, um einen neuen Tab zu öffnen.

  7. Wenn Sie parametrisierte Ansichten verwenden möchten, erstellen Sie die Erweiterung parameterized_views in Ihrer Datenbank:

    -- Requires parameterized_views.enabled set to true
    CREATE EXTENSION parameterized_views;
    

    Wenn die Erweiterung erstellt wird, erstellt die Datenbank auch ein Schema mit dem Namen parameterized_views. So sind die APIs im Namespace dieses Schemas enthalten und geraten nicht mit vorhandenen APIs in Konflikt.

  8. Melden Sie sich als Nutzer mit Superuser-Berechtigungen an, z. B. als integrierter postgres-Nutzer. Wenn Sie einen neuen Superuser erstellen möchten, z. B. admin_user, führen Sie die folgenden Befehle aus:

    CREATE ROLE admin_user WITH LOGIN PASSWORD '...';
    GRANT ALL PRIVILEGES ON DATABASE database TO admin_user;
    

    Weitere Informationen finden Sie unter CREATE USER.

  9. Erstellen Sie eine neue Datenbankrolle zum Ausführen von Abfragen für parametrisierte sichere Ansichten und gewähren Sie admin_user die Möglichkeit, diese Rolle zu verwalten. Dies ist eine AlloyDB-Rolle, die von der Anwendung verwendet wird. Sie dient dazu, eine Verbindung zur Datenbank herzustellen, sich anzumelden und Abfragen mit eingeschränktem Zugriff auf öffentliche Funktionen oder Objekte auszuführen.

    CREATE ROLE psv_user WITH LOGIN PASSWORD '...';
    GRANT psv_user TO admin_user WITH ADMIN OPTION;
    

    Weitere Informationen finden Sie unter CREATE USER.

  10. Stellen Sie eine Verbindung als Nutzer mit Administratorzugriff her.

    SET role TO admin_user;
    
  11. Erstellen Sie das Schema, das die Tabellen enthält.

    CREATE SCHEMA store;
    
  12. Tabellen erstellen und Daten einfügen

    CREATE TABLE store.checked_items(bag_id INT,timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT);
    
    INSERT INTO store.checked_items (bag_id, timestamp, loc_code, scan_type, location, customer_id) VALUES
    (101, '2023-10-26 10:00:00', 'ABC', 'I', 'Warehouse A', 123),
    (102, '2023-10-26 10:15:30', 'DEF', 'O', 'Loading Dock B', 456),
    (103, '2023-10-26 10:30:45', 'GHI', 'I', 'Conveyor Belt 1', 789),
    (104, '2023-10-26 11:00:00', 'JKL', 'O', 'Shipping Area C', 101),
    (105, '2023-10-26 11:45:15', 'MNO', 'I', 'Sorting Station D', 202),
    (106, '2023-10-26 12:00:00', 'PQR', 'O', 'Truck Bay E', 303);
    

Parametrisierte sichere Ansichten erstellen und Zugriffsberechtigungen einrichten

So erstellen Sie parametrisierte sichere Ansichten und richten die entsprechenden Zugriffsberechtigungen für die Basistabelle und die Ansichten ein:

  1. Rufen Sie in der Google Cloud Console die Seite „AlloyDB“ auf.

    Zu AlloyDB

  2. Wählen Sie einen Cluster aus der Liste aus.

  3. Klicken Sie im Navigationsmenü auf AlloyDB Studio.

  4. Melden Sie sich in Studio an und stellen Sie als admin_user-Nutzer eine Verbindung zur Datenbank database her.

  5. Klicken Sie auf Authentifizieren. Im Bereich „Explorer“ wird eine Liste der Objekte in Ihrer Datenbank angezeigt.

  6. Klicken Sie auf Neuer SQL-Editor-Tab oder Neuer Tab, um einen neuen Tab zu öffnen.

  7. So gewähren Sie eingeschränkten Zugriff auf die Ansicht:

    CREATE VIEW store.secure_checked_items WITH (security_barrier) AS
    SELECT bag_id, timestamp, location
    FROM store.checked_items t
    WHERE customer_id = $@app_end_userid;
    
  8. Gewähren Sie Zugriff auf die Ansicht.

    GRANT SELECT ON store.secure_checked_items TO psv_user;
    
  9. Gewähren Sie Zugriff auf das Schema, um auf die Ansicht zuzugreifen.

    GRANT USAGE ON SCHEMA store TO psv_user;
    
  10. Widerrufen Sie den direkten Zugriff auf die Basistabelle.

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    

    Hinweis: Der Inhaber der parametrisierten Ansicht muss SELECT-Berechtigungen für die Basistabellen haben. Außerdem muss der Nutzer der parametrisierten Ansicht die Berechtigung USAGE für das Schema der Ansicht und SELECT für die Ansicht haben. Beispiel: Der Nutzer admin_user ist Inhaber der parametrisierten Ansicht und hat daher SELECT-Berechtigungen für die Basistabellen, während der Nutzer psv_user die Berechtigung USAGE für das Schema store und die Berechtigung SELECT für die Ansicht haben muss.

  11. Achten Sie darauf, dass IAM_USER_EMAIL dem Cluster als IAM-Datenbanknutzer hinzugefügt wurde. Melden Sie sich als Nutzer postgres oder als admin_user an und weisen Sie dem IAM-authentifizierten Nutzer die Rolle psv_user zu:

    GRANT psv_user TO "IAM_USER_EMAIL";
    

    Ersetzen Sie IAM_USER_EMAIL durch die E-Mail-Adresse Ihres IAM-Nutzers.

Datensicherheit prüfen

Melden Sie sich als IAM-authentifizierter Nutzer in der Datenbank an, um zu prüfen, ob der Zugriff auf die angegebenen Ansichten durch die parametrisierten sicheren Ansichten eingeschränkt wird. In AlloyDB übernehmen IAM-Nutzer die Berechtigungen der ihnen zugewiesenen Datenbankrollen.

  1. Melden Sie sich als IAM-authentifizierter Nutzer in der Datenbank an.

  2. Prüfen Sie, ob auf die Basistabelle zugegriffen werden kann.

    SELECT * FROM store.checked_items;
    ERROR:  permission denied for table checked_items
    
  3. Greifen Sie mit der Funktion execute_parameterized_query auf die parametrisierten sicheren Ansichten zu:

    SELECT * FROM parameterized_views.execute_parameterized_query(
      query => 'SELECT * from store.secure_checked_items',
      param_names => ARRAY ['app_end_userid'],
      param_values => ARRAY ['303']
    );
    
  4. Melden Sie sich mit gcloud auth application-default login als IAM_USER_EMAIL in der Google Cloud CLI an, damit gcloud auth application-default print-access-token ein Token für den eingeschränkten IAM-Datenbanknutzer generiert. Fragen Sie dann die parametrisierten sicheren Ansichten mit der Methode queryData und PSV-Parametern ab:

      curl -X POST \
        "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "x-goog-user-project: PROJECT_ID" \
        -H "Content-Type: application/json; charset=utf-8" \
        -d '{
          "prompt": "Show me the checked items.",
          "context": {
            "datasource_references": {
              "alloydb": {
                "database_reference": {
                  "project_id": "PROJECT_ID",
                  "region": "REGION",
                  "cluster_id": "CLUSTER_ID",
                  "instance_id": "INSTANCE_ID",
                  "database_id": "DATABASE_ID",
                  "table_ids": [
                    "store.secure_checked_items"
                  ]
                }
              }
            },
            "parameterized_secure_view_parameters": {
              "parameters": [
                {
                  "key": "app_end_userid",
                  "value": "303"
                }
              ]
            }
          },
          "generation_options": {
            "generate_query_result": true,
            "generate_natural_language_answer": true,
            "generate_explanation": true
          }
        }'

    Verwenden Sie das Feld table_ids in database_reference, damit QueryData nur SQL für die parametrisierte sichere Ansicht store.secure_checked_items generiert. Wenn Sie table_ids weglassen und die Datenbankrolle SELECT-Zugriff auf die Basistabelle store.checked_items hat, kann QueryData die Basistabelle möglicherweise direkt abfragen und die sichere Ansicht umgehen. Geben Sie den schemaqualifizierten Ansichtsnamen an, da nicht qualifizierte Namen in table_ids standardmäßig dem Schema public zugeordnet werden.

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Projekt-ID in Google Cloud .
    • REGION: die Region, in der sich Ihre AlloyDB for PostgreSQL-Instanz befindet.
    • CLUSTER_ID: die ID Ihres AlloyDB for PostgreSQL-Clusters.
    • INSTANCE_ID: die ID Ihrer AlloyDB for PostgreSQL-Instanz.
    • DATABASE_ID: die ID Ihrer AlloyDB for PostgreSQL-Datenbank, die in dieser Anleitung database lautet.

    Bereinigen

    Cluster löschen

    Wenn Sie den Cluster löschen, den Sie im Abschnitt Vorbereitung erstellt haben, werden auch alle von Ihnen erstellten Objekte gelöscht.

    1. Rufen Sie in der Google Cloud Console die Seite „AlloyDB“ auf.

      Zu AlloyDB

    2. Wählen Sie einen Cluster aus der Liste aus.

    3. Klicken Sie auf Cluster löschen.

    4. Geben Sie unter Cluster löschen den Namen des Clusters ein, um zu bestätigen, dass Sie den Cluster löschen möchten.

    Nächste Schritte