Auf dieser Seite wird beschrieben, wie Sie parametrisierte sichere Ansichten in AlloyDB for PostgreSQL verwenden. Damit können Sie den Datenzugriff basierend auf anwendungsspezifischen benannten Parametern wie Anmeldedaten von Anwendungsnutzern einschränken. Parametrisierte sichere Ansichten verbessern die Sicherheit und Zugriffssteuerung, indem sie die Funktionalität von PostgreSQL-Ansichten erweitern. Diese Ansichten minimieren auch die Risiken, die mit der Ausführung nicht vertrauenswürdiger Abfragen aus Anwendungen verbunden sind, indem sie automatisch Einschränkungen für jede ausgeführte Abfrage erzwingen.
Weitere Informationen finden Sie unter Übersicht über parametrisierte sichere Ansichten und Zugriff auf Anwendungsdaten mit parametrisierten sicheren Ansichten sichern und steuern.
Hinweis
Auf dieser Seite wird davon ausgegangen, dass Sie einen AlloyDB-Cluster und eine AlloyDB-Instanz erstellt haben. Weitere Informationen finden Sie unter Datenbank erstellen.
Bevor Sie parametrisierte sichere Ansichten verwenden, müssen Sie Folgendes tun:
Aktivieren Sie das Datenbank-Flag
parameterized_views.enabled, das die erforderlichen Erweiterungsbibliotheken lädt. Sie müssen dieses Flag aktivieren, auch wenn es zuvor vom AlloyDB-Team aktiviert wurde. Weitere Informationen zum Aktivieren des Datenbank-Flags finden Sie unter Datenbank-Flags einer Instanz konfigurieren.Erstellen Sie mit AlloyDB Studio oder psql die Erweiterung
parameterized_viewsin einer beliebigen Datenbank, 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, erstellt das System 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.
Parametrisierte sichere Ansicht erstellen
So erstellen Sie eine parametrisierte sichere Ansicht:
Führen Sie den
CREATE VIEWDDL-Befehl 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 denenchecked_items.customer_idmit einem erforderlichen Parameter übereinstimmt.Verwenden Sie die folgenden Attribute:
- Erstellen Sie die Ansicht mit der Option
security_barrier. - Wenn Sie Anwendungsnutzer einschränken möchten, sodass sie nur die Zeilen sehen können, auf die sie Zugriff haben, fügen Sie in der Ansichtsdefinition mit der Syntax
$@PARAMETER_NAMEerforderliche Parameter hinzu. Ein häufiger Anwendungsfall ist das Prüfen des Werts einer Spalte in derWHERE-Klausel mitCOLUMN = $@PARAMETER_NAME. $@PARAMETER_NAMEgibt einen benannten Ansichtsparameter an. Der Wert wird angegeben, wenn Sie dieexecute_parameterized_query-API verwenden. Für benannte Ansichtsparameter gelten die folgenden Anforderungen:- Benannte Ansichtsparameter 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. - Benannte Ansichtsparameter dürfen kein
$enthalten. - Bei benannten Ansichtsparametern wird die Groß-/Kleinschreibung beachtet. So wird
$@PARAMETER_NAMEanders als$@parameter_nameinterpretiert.
- Erstellen Sie die Ansicht mit der Option
Erteilen Sie allen Datenbanknutzern, die die Ansicht abfragen dürfen, die Berechtigung
SELECTfür die Ansicht.Erteilen Sie allen Datenbanknutzern, die die Ansicht abfragen dürfen, die Berechtigung
USAGEfür das Schema, das die in der Ansicht definierten Tabellen enthält.
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:
- Erstellen Sie die sicheren parametrisierten Ansichten als Administrator. Dieser Nutzer ist ein AlloyDB-Datenbanknutzer, der administrative Vorgänge für die Anwendung ausführt, einschließlich der Datenbankeinrichtung und der Sicherheitsverwaltung.
Erstellen Sie eine neue Datenbankrolle zum Ausführen von Abfragen für parametrisierte sichere Ansichten. Dies ist eine AlloyDB-Datenbankrolle, die von der Anwendung verwendet wird, um eine Verbindung zur Datenbank herzustellen, sich anzumelden und Abfragen für parametrisierte Ansichten auszuführen.
- Erteilen Sie der neuen Rolle Berechtigungen für die sicheren Ansichten. Dazu gehören in der Regel
SELECT-Berechtigungen für die Ansichten undUSAGEfür die Schemas. - Beschränken Sie die Objekte, auf die diese Rolle zugreifen kann, auf die erforderliche Mindestanzahl öffentlicher Funktionen und Objekte, die die Anwendung benötigt. Vermeiden Sie den Zugriff auf Schemas und Tabellen, die nicht öffentlich sind.
- Um Sicherheitsrisiken zu minimieren, widerrufen Sie den Zugriff dieser Rolle auf alle sensiblen Schemas oder Objekte, die für die Rolle nicht unbedingt erforderlich sind.
Wenn Sie die Ansichten abfragen, gibt die Anwendung die Werte der erforderlichen Ansichtsparameter an, die mit der Identität des Anwendungsnutzers verknüpft sind.
Weitere Informationen finden Sie unter Datenbanknutzer erstellen.
- Erteilen Sie der neuen Rolle Berechtigungen für die sicheren Ansichten. Dazu gehören in der Regel
Parametrisierte sichere Ansicht abfragen
Verwenden Sie eine der folgenden Optionen, um eine parametrisierte sichere Ansicht abzufragen, die Ihren Anwendungsfall am besten unterstützt:
- JSON-basiert: Mit dieser API können Sie die Abfrage einmalig ausführen und JSON-Zeilen zurückgeben.
- CURSOR-basiert: Verwenden Sie diese API, wenn Sie längere Abfragen haben oder wenn Sie große Abfragen haben und das Ergebnis in Batches abrufen möchten. Die Funktion
execute_parameterized_query, die von der Erweiterungparameterized_viewsbereitgestellt wird, akzeptiert einen Cursornamen. PREPARE EXECUTE-Anweisung: Verwenden Sie diese Option für vorbereitete Anweisungen, die mehrmals mit unterschiedlichen Parameterwerten ausgeführt werden können.
Verwenden Sie die Funktion execute_parameterized_query(), die von der Erweiterung parameterized_views bereitgestellt wird, um parametrisierte sichere Ansichten abzufragen.
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 beschränkt die Ergebnisse auch nicht nach Größe oder Anzahl der zurückgegebenen Zeilen.
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, derenFROM-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 von Parameterwerten, die übergeben werden sollen.- Diese Liste muss dieselbe Größe wie die Liste
param_nameshaben, wobei die Reihenfolge der Werte der Reihenfolge der Namen entspricht. - Der genaue Typ der Werte wird aus der Abfrage- und der parametrisierten Ansichtsdefinition abgeleitet. Typkonvertierungen werden bei Bedarf und wenn möglich für den angegebenen Parameterwert ausgeführt. Bei einem Typkonflikt wird ein Fehler ausgegeben.
- Diese Liste muss dieselbe Größe wie die Liste
Die Funktion gibt eine Tabelle mit JSON-Objekten zurück. Jede Zeile in der Tabelle entspricht dem ROW_TO_JSON()-Wert der ursprünglichen Abfrageergebniszeile.
Verwenden Sie das folgende Beispiel, um eine parametrisierte sichere Ansicht abzufragen:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
)
Mit 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 Limits mit parameterized_views.json_results_max_size und parameterized_views.json_results_max_rows konfigurieren.
CURSOR API
Führen Sie die Funktion execute_parameterized_query() aus, die einen transaktionsbezogenen CURSOR erstellt und zurückgibt, mit dem Sie Abfrageergebnisse abrufen können:
SELECT * FROM
parameterized_views.execute_parameterized_query(
query => SQL_QUERY,
cursor_name => CURSOR_NAME,
param_names => ARRAY [PARAMETER_NAMES],
param_values => ARRAY [PARAMETER_VALUES]
)
Ersetzen Sie Folgendes:
SQL_QUERY: Eine SQL-Abfrage, derenFROM-Klausel auf eine oder mehrere parametrisierte sichere Ansichten verweist.CURSOR_NAME: Name des zu deklarierenden Cursors.PARAMETER_NAMES: Eine Liste von Parameternamen, die als Strings übergeben werden sollen.PARAMETER_VALUES: Eine Liste von Parameterwerten, die übergeben werden sollen. Diese Liste muss dieselbe Größe wie die Listeparam_nameshaben, wobei die Reihenfolge der Werte der Reihenfolge der Namen entspricht. Der genaue Typ der Werte wird aus der Abfrage- und der parametrisierten Ansichtsdefinition abgeleitet. Typkonvertierungen werden bei Bedarf und wenn möglich für den angegebenen Parameterwert ausgeführt. Bei einem Typkonflikt wird ein Fehler ausgegeben.
Verwenden Sie das folgende Beispiel, um eine parametrisierte sichere Ansicht abzufragen:
-- start a transaction as the that is the default lifetime of a CURSOR
BEGIN;
-- create a cursor called 'mycursor'
SELECT * FROM parameterized_views.execute_parameterized_query(
query => 'SELECT * FROM secure_checked_items',
cursor_name => 'mycursor'
param_names => ARRAY ['app_end_userid'],
param_values => ARRAY ['40']
);
-- then, to actually fetch the results
FETCH ALL FROM mycursor;
-- end the transaction, which will clean up the cursor
END;
Der zurückgegebene Cursor ist ein NO SCROLL-Cursor WITHOUT HOLD. Sie können den Cursor nicht verwenden, um Zeilen in nicht sequenzieller Reihenfolge abzurufen, z. B. in umgekehrter Richtung. Sie können den Cursor nicht außerhalb der Transaktion verwenden, in der er erstellt wurde.
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 Positionsparameter und erzwingen bei der Ausführung verschiedene Einschränkungen.
Weitere Informationen finden Sie unter Sicherheitsmechanismus.
Diese Funktion erweitert
die PREPARE und EXECUTE commands, 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, das die Leistung optimieren kann, indem es eine parametrisierte SQL-Anweisung vorkompiliert und für die spätere Ausführung speichert.
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.
Diese API beschränkt die Ergebnisse auch nicht nach Größe oder Anzahl der zurückgegebenen Zeilen.
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 derRESTRICTED-Abfrage verwendet werden.POSITIONAL_PARAM_VALUES: Die tatsächlichen Werte, die für die in derPREPARE-Anweisung definierten Positionsparameter eingesetzt werden.VIEW_PARAM_NAME: Der Name des Parameters, der von den in derRESTRICTED-Abfrage referenzierten parametrisierten Ansichten erwartet wird.VIEW_PARAM_VALUE: Die tatsächlichen Werte, die an die entsprechendenviewParamName-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 anhand der Position auf die Parameter, z. B. mit $1 und $2.
Verwenden Sie den Befehl EXECUTE .. WITH VIEW PARAMETERS, um eine zuvor vorbereitete Anweisung auszuführen, die Sie mit dem Befehl PREPARE .. AS RESTRICTED erstellt haben.
Wenn in der PREPARE-Anweisung, mit der die Anweisung erstellt wurde, Positionsparameter angegeben wurden, müssen Sie der EXECUTE-Anweisung eine kompatible Gruppe von Parametern übergeben. Sie müssen alle benannten Ansichtsparameter, die von parametrisierten Ansichten benötigt werden, in der Klausel WITH VIEW PARAMETERS übergeben.
Verwenden Sie das folgende Beispiel, um eine parametrisierte sichere Ansicht abzufragen:
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 für Abfragen
In der folgenden Liste sind die eingeschränkten Vorgänge für Abfragen aufgeführt, die Sie mit den unter Parametrisierte sichere Ansicht abfragen beschriebenen Optionen ausführen:
- Jeder rekursive Aufruf von APIs (
execute_parameterized_queryoder mitEXECUTE .. WITH VIEW PARAMETERS) ist verboten, sodass nur die von der Anwendung angegebenen Werte verwendet werden. Diese Einschränkung verhindert auch, dass die Abfrage verwendet wird, um die Sicherheitshülle der angegebenen Gruppe von Parameterwerten zu umgehen. - Einige Erweiterungen, die eine neue Hintergrundsitzung starten, sind nicht zulässig, darunter die Erweiterungen
dblink,pg_cronundpg_background. - In der folgenden Liste sind die zulässigen Abfragekonstrukte aufgeführt, die eingeschränkt sind:
SELECT-Anweisungen mit Lesezugriff sind zulässig.SHOW-Anweisungen,CALL-Anweisungen undDO-Anweisungen mit Lesezugriff sind zulässig.- DML-Anweisungen wie
INSERT,UPDATEundDELETEsind nicht zulässig. - DDL-Anweisungen wie
CREATE TABLEundALTER TABLEsind nicht zulässig. - Andere Anweisungstypen wie
LOAD,SET,CLUSTER,LOCK,CHECKPOINTundEXPLAINsind nicht zulässig.
EXPLAIN-Anweisungen sind standardmäßig nicht zulässig, um die Möglichkeit von Angriffen über verdeckte Kanäle mit Abfrageplänen zu vermeiden. Weitere Informationen finden Sie unter Verdeckter Kanal. Wenn Sie jedochEXPLAINAnweisungen ausführen möchten, kann jeder Datenbanknutzer mit AlloyDB-Superuserberechtigungen die GUCparameterized_views.enable_explainauf Sitzungsebene aufonsetzen.- 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 Unterstützte Datenbank-Flags.
Alle parametrisierten Ansichten auflisten
Verwenden Sie die parameterized_views Erweiterung, um alle parametrisierten
Ansichten in der Datenbank mit der all_parameterized_views Ansicht aufzulisten. Die Ausgabe
dieser Ansicht ist dieselbe wie die der pg_views
Katalogansicht, aber all_parameterized_views listet nur Ansichten mit benannten Ansichts
parametern auf.
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 die parametrisierte Ansicht in ihrer Definition mindestens einen benannten Ansichtsparameter enthalten.
Nächste Schritte
- Weitere Informationen zu parametrisierten sicheren Ansichten.
- Informationen zum Sichern und Steuern des Zugriffs auf Anwendungsdaten mit parametrisierten sicheren Ansichten