Zugriff auf Anwendungsdaten sichern und steuern

Parametrisierte sichere Ansichten bieten Datensicherheit auf Zeilenebene und Zugriffssteuerung, indem Abfrageergebnisse basierend auf der Identität des Anwendungsnutzers gefiltert werden.

In dieser Anleitung wird beschrieben, wie Sie parametrisierte sichere Ansichten in Cloud SQL einrichten, Datenbankrollen und ‑berechtigungen konfigurieren, um den Zugriff auf Basistabellen einzuschränken, und die Datensicherheit überprüfen. Die in diesem Dokument enthaltenen Beispiele dienen nur zu Demonstrationszwecken.

Was sind parametrisierte sichere Ansichten?

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

Wenn Ihre Anwendung eine differenziertere Sicherheit als der standardmäßige Zugriff auf Datenbankebene erfordert, können Sie parametrisierte sichere Ansichten verwenden, um sicherzustellen, dass Nutzer nur die Daten sehen, für die sie autorisiert sind.

Die Verwendung parametrisierter sicherer Ansichten bietet zwei Hauptvorteile:

  • Dynamische Sicherheit auf Zeilenebene: Bei dieser Funktion werden Abfragen anhand von Endnutzer-IDs gefiltert, sodass Nutzer unabhängig von der Formulierung der Abfrage nur auf ihre autorisierten Daten zugreifen können.
  • Vereinfachte Rollenverwaltung: Es wird eine einzelne gemeinsame Datenbankrolle für alle Anwendungsnutzer verwendet, anstatt separate Datenbankrollen für jeden Einzelnen 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 einer Verbindung zu Cloud SQL erforderlich sind.

    1. API aktivieren

    2. Klicken Sie im Schritt Projekt bestätigen auf 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:

      • Cloud SQL for PostgreSQL API
      • Knowledge Catalog API

Erstellen und Verbindung zu einer Datenbank herstellen

  1. Instanz erstellen
  2. Verbindung zur Instanz herstellen und Datenbank erstellen

Umgebung vorbereiten

Zur Vorbereitung auf das Ausführen von Abfragen für eine parametrisierte sichere Ansicht müssen Sie die Datenbank, die Datenbankrollen, die Erweiterung parameterized_views und das Anwendungsschema einrichten.

Datenbankflag aktivieren

Aktivieren Sie das Datenbank-Flag cloudsql.enable_parameterized_views, um die erforderlichen Erweiterungsbibliotheken zu laden. Weitere Informationen finden Sie unter Datenbank-Flags einer Instanz konfigurieren.

Datenbank einrichten

  • Erstellen Sie eine Datenbank namens database für die Anwendungsdaten und parametrisierten sicheren Ansichten. Weitere Informationen finden Sie unter Datenbank erstellen.

Datenbankrollen, die Erweiterung und das Anwendungsschema erstellen

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

    Zu Cloud SQL

  2. Wählen Sie eine Instanz aus der Liste aus.

  3. Klicken Sie im Navigationsmenü auf Cloud SQL Studio.

  4. Melden Sie sich mit der Postgres-Authentifizierung 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 Nutzer postgres.

  9. Erstellen Sie eine neue Datenbankrolle zum Ausführen von Abfragen für parametrisierte sichere Ansichten. Dies ist eine Cloud SQL-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 '...';
    

    Weitere Informationen finden Sie unter CREATE USER.

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

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

    CREATE SCHEMA store;
    
  12. Erstellen Sie die Tabellen und fügen Sie Daten ein.

    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 entsprechende Zugriffsberechtigungen für die Basistabelle und die Ansichten ein:

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

    Zu Cloud SQL

  2. Wählen Sie eine Instanz aus der Liste aus.

  3. Klicken Sie im Navigationsmenü auf Cloud SQL Studio.

  4. Melden Sie sich in Studio an und stellen Sie als postgres eine Verbindung zum 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. Wenn Sie eingeschränkten Zugriff auf die Ansicht gewähren möchten, erstellen Sie eine parametrisierte 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. Um auf die Ansicht zuzugreifen, müssen Sie Zugriff auf das Schema gewähren.

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

    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 USAGE für das Schema der Ansicht und SELECT für die Ansicht haben. Der Nutzer postgres ist beispielsweise der Inhaber der parametrisierten Ansicht und hat daher SELECT-Berechtigungen für die Basistabellen. Der Nutzer psv_user muss USAGE für das Schema store und SELECT für die Ansicht haben.

  11. Melden Sie sich als postgres-Administrator an und weisen Sie einem 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 Cloud SQL erben IAM-Nutzer die Berechtigungen der ihnen zugewiesenen Datenbankrollen.

  1. Melden Sie sich als IAM-authentifizierter Nutzer bei 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']
    );
    
    1. Parametrisierte sichere Ansichten mit SQL-Syntax und der QueryData-Anfrage mit PSV-Parametern abfragen

        curl -X POST \
          "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
          -H "Authorization: Bearer $(gcloud auth print-access-token)" \
          -H "Content-Type: application/json; charset=utf-8" \
          -d '{
            "prompt": "Show me the checked items.",
            "context": {
              "datasource_references": {
                "cloud_sql_reference": {
                  "database_reference": {
                    "engine": "POSTGRESQL",
                    "project_id": "PROJECT_ID",
                    "region": "REGION",
                    "instance_id": "INSTANCE_ID",
                    "database_id": "DATABASE_ID"
                  }
                }
              },
              "parameterized_secure_view_parameters": {
                "parameters": {
                  "app_end_userid": "303"
                }
              }
            },
            "generation_options": {
              "generate_query_result": true,
              "generate_natural_language_answer": true,
              "generate_explanation": true
            }
          }'

      Ersetzen Sie die folgenden Werte:

      • PROJECT_ID: Ihre Google Cloud Projekt-ID
      • REGION: Die Region, in der sich Ihre Cloud SQL for PostgreSQL-Instanz befindet.
      • INSTANCE_ID: Die ID Ihrer Cloud SQL for PostgreSQL-Instanz.
      • DATABASE_ID: Die ID Ihrer Cloud SQL for PostgreSQL-Datenbank.

    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 „Cloud SQL“ auf.

      Zu Cloud SQL

    2. Wählen Sie eine Instanz aus der Liste aus.

    3. Klicken Sie auf Löschen.

    4. Bestätigen Sie, dass Sie die Instanz löschen möchten, indem Sie den Instanznamen eingeben und auf Löschen klicken.