In diesem Dokument wird beschrieben, wie Sie parametrisierte sichere Ansichten in AlloyDB for PostgreSQL verwenden. Damit können Sie den Datenzugriff anhand von anwendungsspezifischen benannten Parametern wie Anmeldedaten für Anwendungsnutzer einschränken. Parameterisierte sichere Ansichten verbessern die Sicherheit und Zugriffssteuerung, indem die Funktionalität von PostgreSQL-Ansichten erweitert wird. Außerdem werden mit diesen Ansichten die Risiken beim Ausführen nicht vertrauenswürdiger Abfragen aus Anwendungen minimiert, da für jede ausgeführte Abfrage automatisch eine Reihe von Einschränkungen erzwungen wird.
Weitere Informationen finden Sie in der Übersicht über parametrisierte sichere Datenansichten und im Leitfaden zu parametrisierten sicheren Datenansichten.
Hinweise
In diesem Dokument wird davon ausgegangen, dass Sie einen AlloyDB-Cluster und eine Instanz erstellt haben. Weitere Informationen finden Sie unter Datenbank erstellen.
Bevor Sie parameterisierte sichere Ansichten verwenden können, müssen Sie Folgendes tun:
Fordern Sie Zugriff auf parametrisierte sichere Ansichten an und warten Sie, bis Sie die Aktivierungsbestätigung erhalten, bevor Sie beginnen.
Warten Sie, bis das AlloyDB-Team das
parameterized_views.enabled
-Datenbankflag aktiviert hat, wodurch die erforderlichen Erweiterungsbibliotheken geladen werden. Dieses Datenbank-Flag muss aktiviert sein, bevor Sie beginnen können.Nachdem das AlloyDB-Team das
parameterized_views.enabled
-Datenbankflag aktiviert hat, wird die Datenbank neu gestartet, damit diese Änderungen wirksam werden.Verwenden Sie AlloyDB Studio oder psql, um die
parameterized_views
-Erweiterung in einer beliebigen Datenbank zu erstellen, in der eine parametrisierte Ansicht erstellt wird:-- Requires parameterized_views.enabled set to true CREATE EXTENSION parameterized_views;
Beim Erstellen der Erweiterung wird vom System auch ein Schema mit dem Namen
parameterized_views
erstellt, damit die APIs im Namespace dieses Schemas enthalten sind und keine Konflikte mit vorhandenen APIs auftreten.
Parameterisierte sichere Ansicht erstellen
So erstellen Sie eine parametrisierte sichere Ansicht:
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
/users/checked_items/
. In der Ansicht werden die Ergebnisse auf Zeilen beschränkt, in denen/users.id/checked_items.customer_id/
mit 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 erforderliche Parameter mit der
$@PARAMETER_NAME
-Syntax in dieWHERE
-Klausel ein. Ein häufiger Anwendungsfall ist das Prüfen des Werts einer Spalte mitWHERE COLUMN = $@PARAMETER_NAME
. $@PARAMETER_NAME
gibt einen benannten Ansichtsparameter an. Der Wert wird bei Verwendung derexecute_parameterized_query
API angegeben. 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
$
nicht enthalten. - Bei benannten Ansichtsparametern wird die Groß-/Kleinschreibung beachtet. Beispiel:
$@PARAMETER_NAME
wird anders interpretiert als$@parameter_name
.
- Erstellen Sie die Ansicht mit der Option
Gewähren Sie allen Datenbanknutzern, die die Datenansicht abfragen dürfen, die Berechtigung
SELECT
für die Datenansicht.Gewähren Sie allen Datenbanknutzern, die die Ansicht abfragen dürfen, die Berechtigung
USAGE
für das Schema, das die in der Ansicht definierten Tabellen enthält.
Weitere Informationen finden Sie unter Zugriff auf Anwendungsdaten mithilfe von parametrisierten sicheren Ansichten schützen und steuern.
Sicherheit für Ihre Anwendung konfigurieren
So konfigurieren Sie die Sicherheit für Ihre Anwendungen mithilfe von 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 Datenbankeinrichtung und Sicherheitsverwaltung.
Erstellen Sie eine neue Datenbankrolle für die Ausführung von Abfragen für parametrisierte sichere Ansichten. Dies ist eine AlloyDB-Datenbankrolle, mit der die Anwendung eine Verbindung zur Datenbank herstellt und sich anmeldet sowie Abfragen für parametrisierte Ansichten ausführt.
- Gewähren Sie der neuen Rolle Berechtigungen für die sicheren Ansichten. Dazu gehören in der Regel
SELECT
-Berechtigungen für die Ansichten undUSAGE
-Berechtigungen für die Schemas. - Beschränken Sie die Objekte, auf die diese Rolle zugreifen kann, auf die für die Anwendung erforderlichen öffentlichen Funktionen und Objekte. Stellen Sie keinen Zugriff auf nicht öffentliche Schemas und Tabellen bereit.
Wenn Sie die Datenansichten abfragen, stellt die Anwendung die Werte der erforderlichen Datenansichtsparameter bereit, die an die Identität des Anwendungsnutzers gebunden sind.
Weitere Informationen finden Sie unter Datenbanknutzer erstellen.
- Gewähren 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 Datenansicht 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 Abfragen länger laufen oder groß sind und Sie die Ergebnisse in Batches abrufen möchten. Die Funktion
execute_parameterized_query
der Erweiterungparameterized_views
akzeptiert einen Cursornamen. PREPARE EXECUTE
-Anweisung: Verwenden Sie diese für vorbereitete Anweisungen, die mehrmals mit unterschiedlichen Parameterwerten ausgeführt werden können.
Um parametrisierte sichere Ansichten abzufragen, verwenden Sie die Funktion execute_parameterized_query()
der Erweiterung parameterized_views
.
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.
Außerdem werden die Ergebnisse nicht nach Größe oder Anzahl der zurückgegebenen Zeilen eingeschränkt.
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 sich auf eine oder mehrere parametrisierte sichere Ansichten bezieht.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_names
haben und 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 ausgeführt. Bei einer Abweichung 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.
Im folgenden Beispiel wird eine parametrisierte sichere Ansicht abgefragt:
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. Dadurch wird ein CURSOR auf Transaktionsebene erstellt und zurückgegeben, 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 sich auf eine oder mehrere parametrisierte sichere Ansichten bezieht.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 dieparam_names
-Liste haben und 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 ausgeführt. Bei einer Abweichung des Typs wird ein Fehler ausgegeben.
Im folgenden Beispiel wird eine parametrisierte sichere Ansicht abgefragt:
-- 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 mit dem Cursor keine Zeilen nicht sequenziell abrufen, z. B. in umgekehrter Reihenfolge. 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 Positionalparameter und erzwingen verschiedene Einschränkungen bei der Ausführung.
Weitere Informationen finden Sie unter Sicherheitsmechanismus.
Mit dieser Funktion werden die PREPARE
- und EXECUTE commands
-Parameter um die Unterstützung benannter Ansichtsparameter erweitert. Mit vorbereiteten Anweisungen vermeiden Sie den Overhead, der beim Parsen, Analysieren und Umschreiben der Anweisung jedes Mal anfällt, wenn sie ausgeführt wird. Dies kann zu erheblichen Leistungssteigerungen führen, insbesondere bei häufig ausgeführten oder komplexen Abfragen. Eine vordefinierte Anweisung ist ein serverseitiges Objekt, mit dem die Leistung optimiert werden kann, indem eine parametrisierte SQL-Anweisung vorab kompiliert und zur späteren 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.
Außerdem werden die Ergebnisse 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 derRESTRICTED
-Abfrage verwendet werden.POSITIONAL_PARAM_VALUES
: Die tatsächlichen Werte, die anstelle der in derPREPARE
-Anweisung definierten Positionalparameter eingefügt werden.VIEW_PARAM_NAME
: Der Name des Parameters, der von den parametrisierten Ansichten erwartet wird, auf die in derRESTRICTED
-Abfrage verwiesen 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 aufnehmen möchten, geben Sie in der PREPARE
-Anweisung eine Liste der Datentypen an. In der von Ihnen erstellten Anweisung beziehen Sie sich auf die Parameter anhand ihrer Position, z. B. $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, Positionalparameter angegeben wurden, müssen Sie der EXECUTE
-Anweisung kompatible Parameter übergeben. Sie müssen alle benannten Ansichtsparameter übergeben, die für parametrisierte Ansichten in der WITH VIEW PARAMETERS
-Klausel erforderlich sind.
Im folgenden Beispiel wird eine parametrisierte sichere Ansicht abgefragt:
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
Im Folgenden sind die eingeschränkten Vorgänge für Abfragen aufgeführt, die Sie mit den unter Eine parametrisierte sichere Ansicht abfragen beschriebenen Optionen ausführen:
- Rekursiver Aufruf von APIs –
execute_parameterized_query
oder mitEXECUTE .. WITH VIEW PARAMETERS
– ist nicht zulässig. Es werden also nur die von der Anwendung angegebenen Werte verwendet. Außerdem wird dadurch verhindert, dass die Abfrage verwendet wird, um den Sicherheitsumschlag der angegebenen Parameterwerte zu umgehen. - Einige Erweiterungen, die eine neue Hintergrundsitzung starten, sind nicht zulässig, darunter die Erweiterungen
dblink
,pg_cron
undpg_background
. - Im Folgenden sind die zulässigen und eingeschränkten Abfragekonstrukte aufgeführt:
- Schreibgeschützte
SELECT
-Anweisungen sind zulässig. - Lesezugriffsberechtigte
SHOW
-,CALL
- undDO
-Anweisungen sind zulässig. - DML-Anweisungen wie
INSERT
,UPDATE
undDELETE
sind nicht zulässig. - DDL-Anweisungen wie
CREATE TABLE
undALTER TABLE
sind nicht zulässig. - Andere Anweisungstypen wie
LOAD
,SET
,CLUSTER
,LOCK
,CHECKPOINT
undEXPLAIN
sind nicht zulässig.
- Schreibgeschützte
EXPLAIN
-Anweisungen sind nicht zulässig, um die Möglichkeit von Covert-Channel-Angriffen mit Abfrageplänen zu vermeiden. Weitere Informationen finden Sie unter Covert-Channel.
Alle parametrisierten Ansichten auflisten
Verwenden Sie die Erweiterung parameterized_views
, um mithilfe der Ansicht all_parameterized_views
alle parametrisierten Ansichten in der Datenbank aufzulisten. Die Ausgabe dieser Ansicht ist mit der Katalogansicht pg_views
identisch. all_parameterized_views
enthält jedoch nur Ansichten mit benannten Ansichtsparametern.
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);
Damit eine parametrisierte Ansicht in all_parameterized_views
aufgeführt wird, muss sie in ihrer Definition mindestens einen benannten Ansichtsparameter enthalten.
Nächste Schritte
- Weitere Informationen zu parametrisierten sicheren Ansichten
- Weitere Informationen zum Schützen und Steuern des Zugriffs auf Anwendungsdaten mit parametrisierten sicheren Ansichten