Anwendungsdatensicherheit mit parametrisierten sicheren Ansichten von AlloyDB Omni verwalten

Wählen Sie eine Dokumentationsversion aus:

Mit parametrisierten sicheren Ansichten in AlloyDB Omni können Sie den Datenzugriff basierend auf anwendungsspezifischen benannten Parametern wie Anwendungsnutzeranmeldedaten einschränken. Parametrisierte sichere Ansichten verbessern die Sicherheit und Zugriffssteuerung, indem sie die Funktionalität von PostgreSQL-Ansichten erweitern. Diese Ansichten verringern auch das Risiko, nicht vertrauenswürdige Abfragen aus Anwendungen auszuführen, da Einschränkungen für jede ausgeführte Abfrage automatisch erzwungen werden.

Weitere Informationen finden Sie unter Übersicht über parametrisierte sichere Ansichten und Zugriff auf Anwendungsdaten mit parametrisierten sicheren Ansichten sichern und steuern.

Hinweise

Die Unterstützung für parametrisierte Ansichten in AlloyDB AI erfolgt über parameterized_views, eine AlloyDB for PostgreSQL-Erweiterung.

Auf dieser Seite wird davon ausgegangen, dass Sie AlloyDB Omni installiert haben. Weitere Informationen finden Sie unter AlloyDB Omni installieren (für Container, für Kubernetes).

Bevor Sie parametrisierte sichere Ansichten verwenden können, müssen Sie die folgenden Schritte einmal in jedem neuen Postgres-Container ausführen. Jede Einstellung kann mit ALTER SYSTEM oder durch direktes Bearbeiten der postgresql.conf angewendet werden.

  1. Fügen Sie parameterized_views zu shared_preload_libraries hinzu.
  2. Aktivieren Sie das Feature, indem Sie parameterized_views.enabled=on festlegen.
  3. Starten Sie den PostgreSQL-Server neu, damit die Änderungen wirksam werden.

    -- See the current shared_preload_libraries
    SHOW shared_preload_libraries;
    ALTER SYSTEM SET shared_preload_libraries="...,parameterized_views";
    ALTER SYSTEM SET parameterized_views.enabled=on;
    
  4. Verwenden Sie psql, um die Erweiterung parameterized_views in einer beliebigen Datenbank zu erstellen, in der Sie eine parametrisierte Ansicht erstellen möchten:

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

    Wenn die Erweiterung erstellt wird, wird vom System auch ein Schema namens parameterized_views erstellt, damit die APIs im Namespace dieses Schemas enthalten sind und nicht mit vorhandenen APIs in Konflikt geraten.

Parametrisierte sichere Ansicht erstellen

So erstellen Sie eine parametrisierte sichere Ansicht:

  1. Führen Sie den DDL-Befehl CREATE VIEW aus, wie im folgenden Beispiel gezeigt:

    CREATE VIEW secure_checked_items WITH (security_barrier) AS
    SELECT bag_id, timestamp, location
    FROM checked_items t
    WHERE customer_id = $@app_end_userid;
    

    Im vorherigen Beispiel ermöglicht die parametrisierte sichere Ansicht den Zugriff auf drei Spalten aus einer Tabelle mit dem Namen checked_items. Die Ansicht beschränkt die Ergebnisse auf Zeilen, in denen checked_items.customer_id einem erforderlichen Parameter entspricht. Verwenden Sie die folgenden Attribute:

    • Erstellen Sie die Ansicht mit der Option security_barrier.
    • Wenn Sie Anwendungsnutzer so einschränken möchten, dass sie nur die Zeilen sehen können, auf die sie Zugriff haben, fügen Sie der Ansichtsdefinition mit der $@PARAMETER_NAME-Syntax erforderliche Parameter hinzu. Ein häufiger Anwendungsfall ist das Prüfen des Werts einer Spalte in der WHERE-Klausel mit COLUMN = $@PARAMETER_NAME.
    • $@PARAMETER_NAME gibt einen benannten Ansichtsparameter an. Der Wert wird bereitgestellt, wenn Sie die execute_parameterized_query API verwenden. Für benannte Ansichtsparameter gelten die folgenden Anforderungen:
      • Parameter für benannte Ansichten müssen mit einem Buchstaben (a–z) beginnen.
      • Sie können Buchstaben mit diakritischen Zeichen und nicht lateinische Buchstaben sowie einen Unterstrich (_) verwenden.
      • Nachfolgende Zeichen können Buchstaben, Unterstriche oder Ziffern (0-9) sein.
      • Parameter für benannte Ansichten dürfen kein $ enthalten.
      • Bei benannten Ansichtsparametern wird die Groß-/Kleinschreibung beachtet. Beispiel: $@PARAMETER_NAME wird anders interpretiert als $@parameter_name.
  2. Gewähren Sie allen Datenbanknutzern, die die Ansicht abfragen dürfen, die Berechtigung SELECT für die Ansicht.

  3. Erteilen Sie die Berechtigung USAGE für das Schema, das die in der Ansicht definierten Tabellen enthält, für alle Datenbanknutzer, die die Ansicht abfragen dürfen.

Weitere Informationen finden Sie unter Zugriff auf Anwendungsdaten mit parametrisierten sicheren Ansichten sichern und steuern.

Sicherheit für Ihre Anwendung konfigurieren

So konfigurieren Sie die Sicherheit für Ihre Anwendungen mit parametrisierten sicheren Ansichten:

  1. Erstellen Sie die sicheren parametrisierten Ansichten als Administrator. Dieser Nutzer ist ein AlloyDB Omni-Datenbanknutzer, der administrative Vorgänge für die Anwendung ausführt, einschließlich der Datenbankeinrichtung und Sicherheitsverwaltung.
  2. Erstellen Sie eine neue Datenbankrolle zum Ausführen von Abfragen für parametrisierte sichere Ansichten. Dies ist eine AlloyDB Omni-Datenbankrolle, die von der Anwendung verwendet wird, um eine Verbindung zur Datenbank herzustellen und sich in der Datenbank anzumelden sowie Abfragen für parametrisierte Ansichten auszuführen.
  3. Erteilen Sie der neuen Rolle Berechtigungen für die sicheren Ansichten. Dazu gehören in der Regel SELECT-Berechtigungen für die Ansichten und USAGE für die Schemas.
  4. Beschränken Sie den Zugriff dieser Rolle auf die erforderlichen öffentlichen Funktionen und Objekte, die die Anwendung benötigt. Vermeiden Sie es, Zugriff auf Schemas und Tabellen zu gewähren, die nicht öffentlich sind.
  5. Wenn Sie die Datenansichten abfragen, stellt die Anwendung die Werte der erforderlichen Datenansichtsparameter bereit, die mit der Identität des Anwendungsnutzers verknüpft sind.

Parametrisierte sichere Ansicht abfragen

Verwenden Sie eine der folgenden Optionen, die Ihren Anwendungsfall am besten unterstützen, um eine parametrisierte sichere Ansicht abzufragen:

  • JSON-basiert: Mit dieser API können Sie die Abfrage in einem Durchgang ausführen und JSON-Zeilen zurückgeben.
  • CURSOR-basiert: Verwenden Sie diese API, wenn Sie länger laufende oder große Abfragen haben und die Ergebnisse in Batches abrufen möchten. Die Funktion execute_parameterized_query, die von der Erweiterung parameterized_views bereitgestellt wird, akzeptiert einen Cursornamen.
  • PREPARE EXECUTE-Anweisung: Verwenden Sie diese für vorbereitete Anweisungen, die mehrmals mit unterschiedlichen Parameterwerten ausgeführt werden können.

Wenn Sie parametrisierte sichere Ansichten abfragen möchten, verwenden Sie die Funktion execute_parameterized_query(), die von der Erweiterung parameterized_views bereitgestellt wird.

JSON API

Diese API hat Einschränkungen, da sie einen Cursor für die angegebene Abfrage deklariert. Daher muss die Abfrage mit PostgreSQL-Cursorn kompatibel sein. Die CURSOR API unterstützt beispielsweise keine DO- oder SHOW-Anweisungen.

Diese API schränkt die Ergebnisse auch nicht nach Größe oder Anzahl der zurückgegebenen Zeilen ein.

Führen Sie die Funktion execute_parameterized_query() mit der folgenden Syntax aus:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => SQL_QUERY,
    param_names => ARRAY [PARAMETER_NAMES],
    param_values => ARRAY [PARAMETER_VALUES]
)

Ersetzen Sie Folgendes:

  • SQL_QUERY: Eine SQL-Abfrage, deren FROM-Klausel auf eine oder mehrere parametrisierte sichere Ansichten verweist.
  • PARAMETER_NAMES: Eine Liste mit Parameternamen, die als Strings übergeben werden sollen.
  • PARAMETER_VALUES: Eine Liste der zu übergebenden Parameterwerte.
    • Diese Liste muss dieselbe Größe wie die param_names-Liste haben. Die Reihenfolge der Werte muss der Reihenfolge der Namen entsprechen.
    • Der genaue Typ der Werte wird aus der Abfrage und der Definition der parametrisierten Ansicht abgeleitet. Typkonvertierungen werden bei Bedarf und nach Möglichkeit für den angegebenen Parameterwert durchgeführt. Bei einem Typkonflikt wird ein Fehler ausgegeben.

Die Funktion gibt eine Tabelle mit JSON-Objekten zurück. Jede Zeile in der Tabelle entspricht dem ROW_TO_JSON()-Wert der ursprünglichen Zeile des Abfrageergebnisses.

Mit dem folgenden Beispiel können Sie eine parametrisierte sichere Ansicht abfragen:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => 'SELECT * FROM secure_checked_items',
    param_names => ARRAY ['app_end_userid'],
    param_values => ARRAY ['40']
)

Bei Verwendung dieser API wird die Größe des Ergebnissatzes durch die Größe der Ergebnisse in Kilobyte (kB) und durch die Anzahl der Zeilen begrenzt. Sie können diese Grenzwerte mit parameterized_views.json_results_max_size und parameterized_views.json_results_max_rows konfigurieren.

Diese API hat Einschränkungen, da sie einen Cursor für die angegebene Abfrage deklariert. Daher muss die Abfrage mit PostgreSQL-Cursorn kompatibel sein. Die CURSOR API unterstützt beispielsweise keine DO- oder SHOW-Anweisungen.

Diese API schränkt die Ergebnisse auch nicht nach Größe oder Anzahl der zurückgegebenen Zeilen ein.

Führen Sie die Funktion execute_parameterized_query() mit der folgenden Syntax aus:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => SQL_QUERY,
    param_names => ARRAY [PARAMETER_NAMES],
    param_values => ARRAY [PARAMETER_VALUES]
)

Ersetzen Sie Folgendes:

  • SQL_QUERY: Eine SQL-Abfrage, deren FROM-Klausel auf eine oder mehrere parametrisierte sichere Ansichten verweist.
  • PARAMETER_NAMES: Eine Liste von Parameternamen, die als Strings übergeben werden sollen.
  • PARAMETER_VALUES: Eine Liste der zu übergebenden Parameterwerte.
  • Diese Liste muss dieselbe Größe wie die Liste param_names haben. Die Reihenfolge der Werte muss der Reihenfolge der Namen entsprechen.
  • Der genaue Typ der Werte wird aus der Abfrage und der Definition der parametrisierten Ansicht abgeleitet. Typkonvertierungen werden bei Bedarf und wenn möglich für den angegebenen Parameterwert durchgeführt. Bei einem Typkonflikt wird ein Fehler ausgegeben.

Die Funktion gibt eine Tabelle mit JSON-Objekten zurück. Jede Zeile in der Tabelle entspricht dem ROW_TO_JSON()-Wert der ursprünglichen Zeile des Abfrageergebnisses.

Mit dem folgenden Beispiel können Sie eine parametrisierte sichere Ansicht abfragen:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => 'SELECT * FROM secure_checked_items',
    param_names => ARRAY ['app_end_userid'],
    param_values => ARRAY ['40']
)

Bei Verwendung dieser API wird die Größe des Ergebnissatzes durch die Größe der Ergebnisse in Kilobyte (kB) und durch die Anzahl der Zeilen begrenzt. Sie können diese Grenzwerte mit parameterized_views.json_results_max_size und parameterized_views.json_results_max_rows konfigurieren.

CURSOR API

Diese API hat Einschränkungen, da sie einen Cursor für die angegebene Abfrage deklariert. Daher muss die Abfrage mit PostgreSQL-Cursorn kompatibel sein. Die CURSOR API unterstützt beispielsweise keine DO- oder SHOW-Anweisungen.

Diese API schränkt die Ergebnisse auch nicht nach Größe oder Anzahl der zurückgegebenen Zeilen ein.

Führen Sie die Funktion execute_parameterized_query() mit der folgenden Syntax aus:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => SQL_QUERY,
    param_names => ARRAY [PARAMETER_NAMES],
    param_values => ARRAY [PARAMETER_VALUES]
)

Ersetzen Sie Folgendes:

  • SQL_QUERY: Eine SQL-Abfrage, deren FROM-Klausel auf eine oder mehrere parametrisierte sichere Ansichten verweist.
  • PARAMETER_NAMES: Eine Liste mit Parameternamen, die als Strings übergeben werden sollen.
  • PARAMETER_VALUES: Eine Liste der zu übergebenden Parameterwerte.
    • Diese Liste muss dieselbe Größe wie die param_names-Liste haben. Die Reihenfolge der Werte muss der Reihenfolge der Namen entsprechen.
    • Der genaue Typ der Werte wird aus der Abfrage und der Definition der parametrisierten Ansicht abgeleitet. Typkonvertierungen werden bei Bedarf und nach Möglichkeit für den angegebenen Parameterwert durchgeführt. Bei einem Typkonflikt wird ein Fehler ausgegeben.

Die Funktion gibt eine Tabelle mit JSON-Objekten zurück. Jede Zeile in der Tabelle entspricht dem ROW_TO_JSON()-Wert der ursprünglichen Zeile des Abfrageergebnisses.

Mit dem folgenden Beispiel können Sie eine parametrisierte sichere Ansicht abfragen:

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => 'SELECT * FROM secure_checked_items',
    param_names => ARRAY ['app_end_userid'],
    param_values => ARRAY ['40']
)

Bei Verwendung dieser API wird die Größe des Ergebnissatzes durch die Größe der Ergebnisse in Kilobyte (kB) und durch die Anzahl der Zeilen begrenzt. Sie können diese Grenzwerte mit parameterized_views.json_results_max_size und parameterized_views.json_results_max_rows konfigurieren.

PREPARE-Anweisung

Verwenden Sie den Befehl PREPARE .. AS RESTRICTED, um eine vorbereitete Anweisung zu erstellen, die auf parametrisierte Ansichten verweist. Diese vorbereiteten Anweisungen unterstützen Positionsvariablen und erzwingen verschiedene Einschränkungen bei der Ausführung. Weitere Informationen finden Sie unter Sicherheitsmechanismus.

Mit dieser Funktion werden die Befehle PREPARE und EXECUTE erweitert, um benannte Ansichtsparameter zu unterstützen. Verwenden Sie vorbereitete Anweisungen, um den Aufwand für das Parsen, Analysieren und Umschreiben bei jeder Ausführung der Anweisung zu vermeiden. Dies kann zu erheblichen Leistungssteigerungen führen, insbesondere bei häufig ausgeführten oder komplexen Abfragen. Eine vorbereitete Anweisung ist ein serverseitiges Objekt, mit dem die Leistung optimiert werden kann, indem eine parametrisierte SQL-Anweisung vorkompiliert und für die spätere Ausführung gespeichert wird.

Diese API hat Einschränkungen, da die Anweisung in einer PREPARE-Anweisung zulässig sein muss. Das bedeutet, dass nur SELECT- und VALUES-Anweisungen unterstützt werden.

Bei dieser API werden die Ergebnisse auch nicht nach Größe oder Anzahl der zurückgegebenen Zeilen eingeschränkt.

Führen Sie den Befehl PREPARE .. AS RESTRICTED aus, um eine vorbereitete Anweisung zu erstellen, die auf parametrisierte Ansichten verweist:

PREPARE pquery (/POSITIONAL_PARAM_TYPES/)
        AS RESTRICTED query % a query that may refer to parameterized views
EXECUTE pquery (/POSITIONAL_PARAM_VALUES/)
      WITH VIEW PARAMETERS (VIEW_PARAM_NAME1 = VIEW_PARAM_VALUE1[, ...]);

Ersetzen Sie Folgendes:

  • POSITIONAL_PARAM_TYPES: Ein oder mehrere Positionsparameter, die in der RESTRICTED-Abfrage verwendet werden.
  • POSITIONAL_PARAM_VALUES: Die tatsächlichen Werte, die für die in der PREPARE-Anweisung definierten Positionsparameter eingesetzt werden.
  • VIEW_PARAM_NAME: Der Name des Parameters, der von den parametrisierten Ansichten erwartet wird, auf die in der RESTRICTED-Abfrage verwiesen wird.
  • VIEW_PARAM_VALUE: Die tatsächlichen Werte, die an die entsprechenden viewParamName-Parameter der parametrisierten Ansichten übergeben werden.

Wenn Sie Parameter in eine vorbereitete Anweisung einfügen möchten, geben Sie in der PREPARE-Anweisung eine Liste von Datentypen an. In der Anweisung, die Sie vorbereiten, verweisen Sie auf die Parameter nach Position, z. B. mit $1 und $2.

Mit dem Befehl EXECUTE .. WITH VIEW PARAMETERS können Sie eine zuvor vorbereitete Anweisung ausführen, die Sie mit dem Befehl PREPARE .. AS RESTRICTED erstellt haben. Wenn in der PREPARE-Anweisung, mit der die Anweisung erstellt wurde, positionelle Parameter angegeben wurden, müssen Sie eine kompatible Gruppe von Parametern an die EXECUTE-Anweisung übergeben. Alle benannten Ansichtsparameter, die für parametrisierte Ansichten erforderlich sind, müssen in der WITH VIEW PARAMETERS-Klausel übergeben werden.

Mit dem folgenden Beispiel können Sie eine parametrisierte sichere Ansicht abfragen:

  PREPARE pquery (timestamp) AS RESTRICTED SELECT * FROM secure_checked_items WHERE timestamp > $1;

  EXECUTE pquery (current_date - 1) WITH VIEW PARAMETERS (app_end_userid = 40);
  EXECUTE pquery (current_date - 30) WITH VIEW PARAMETERS (app_end_userid = 40);
  ```

Erzwungene Einschränkungen bei Abfragen

Im Folgenden finden Sie die eingeschränkten Vorgänge für Abfragen, die Sie mit den in Parametrisierte sichere Ansicht abfragen beschriebenen Optionen ausführen:

  • Rekursive Aufrufe von APIs – execute_parameterized_query oder über EXECUTE .. WITH VIEW PARAMETERS – sind nicht zulässig, damit nur die von der Anwendung angegebenen Werte verwendet werden. Diese Einschränkung verhindert auch, dass die Abfrage verwendet wird, um die Sicherheitsvorkehrungen der angegebenen Parameterwerte zu umgehen.
  • Einige Erweiterungen, die eine neue Hintergrundsitzung starten, sind nicht zulässig, darunter die Erweiterungen dblink, pg_cron und pg_background.
  • In der folgenden Liste sind die zulässigen Abfragekonstrukte aufgeführt, die eingeschränkt sind:

    • Schreibgeschützte SELECT-Anweisungen sind zulässig.
    • Schreibgeschützte SHOW-Anweisungen, CALL-Anweisungen und DO-Anweisungen sind zulässig.
    • DML-Anweisungen wie INSERT, UPDATE und DELETE sind nicht zulässig.
    • DDL-Anweisungen wie CREATE TABLE und ALTER TABLE sind nicht zulässig.
    • Andere Anweisungstypen wie LOAD, SET, CLUSTER, LOCK, CHECKPOINT und EXPLAIN sind nicht zulässig.
  • EXPLAIN-Anweisungen sind nicht zulässig, um die Möglichkeit von verdeckten Kanalangriffen über Abfragepläne zu vermeiden. Weitere Informationen finden Sie unter Verdeckter Kanal.

  • Parametrisierte sichere Ansichten bieten Einstellungen, mit denen Sie Ressourcen verwalten können, die von den APIs zum Abfragen parametrisierter Ansichten verwendet werden, z. B. parameterized_views.statement_timeout. Weitere Informationen finden Sie unter AlloyDB for PostgreSQL-Flags.

Alle parametrisierten Ansichten auflisten

Mit der Erweiterung parameterized_views können Sie alle parametrisierten Ansichten in der Datenbank mit der Ansicht all_parameterized_views auflisten. Die Ausgabe dieser Ansicht ist dieselbe wie die der Katalogansicht pg_views, aber in all_parameterized_views werden nur Ansichten mit benannten Ansichtsparametern aufgeführt.

Verwenden Sie das folgende Beispiel, um parametrisierte Ansichten aufzulisten:

postgres=# select * from parameterized_views.all_parameterized_views ;
schemaname |      viewname      | viewowner |                       definition
-----------+--------------------+-----------+---------------------------------------------------------
public     | checked_items_view | postgres  |  SELECT checked_items.bag_id,                          +
           |                    |           |     checked_items."timestamp",                         +
           |                    |           |     checked_items.location                             +
           |                    |           |    FROM checked_items                                  +
           |                    |           |   WHERE (checked_items.customer_id = $@app_end_userid);

Wenn Sie eine parametrisierte Ansicht in all_parameterized_views auflisten möchten, muss sie in ihrer Definition mindestens einen benannten Ansichtsparameter enthalten.

Nächste Schritte