Zephyrnet-Logo

Verbessern Sie die Wiederverwendbarkeit und Sicherheit mit parametrisierten Amazon Athena-Abfragen

Datum:

Amazonas Athena ist ein serverloser interaktiver Abfragedienst, der die Analyse von Daten vereinfacht Amazon Simple Storage-Service (Amazon S3) mit Standard-SQL, und nur Sie Bezahlen Sie für die Datenmenge, die von Ihren Abfragen gescannt wird. Wenn Sie Ihr Unternehmen täglich mit SQL analysieren, werden Sie möglicherweise wiederholt dieselben Abfragen oder ähnliche Abfragen mit geringfügigen Anpassungen ausführen. Parametrisierte Athena-Abfragen ermöglichen Ihnen dies Erklärungen vorbereiten Sie können sie mit anderen Argumentwerten wiederverwenden, die Sie zur Laufzeit bereitstellen. Parametrisierte Athena-Abfragen bieten auch eine Sicherheitsebene gegen SQL-Injection-Angriffe und maskieren die Abfragezeichenfolge AWS CloudTrail für Workloads mit sensiblen Daten.

Dieser Beitrag zeigt Ihnen, wie Sie parametrisierte Abfragen in Athena erstellen und ausführen. Dieser Beitrag enthält ein Beispiel dafür, wie parametrisierte Athena-Abfragen vor SQL-Injection schützen, und zeigt die CloudTrail-Ereignisse mit der maskierten Abfragezeichenfolge. Zu guter Letzt die Post-Review-Funktionen im Zusammenhang mit der Verwaltung von vorbereiteten Athena-Auszügen. Wenn Sie mitmachen möchten, enthält dieser Beitrag Schritte zum Einrichten der Komponenten mit einem Beispieldatensatz. Alternativ können Sie Ihren eigenen Datensatz verwenden.

Wiederverwendbarkeit

Mit vorbereiteten Athena-Anweisungen können Sie Abfragen innerhalb Ihrer Athena-Arbeitsgruppe ausführen und wiederverwenden. Indem Sie die Abfragen vom Code entkoppeln, können Sie Ihre vorbereiteten Anweisungen und Ihre Anwendungen unabhängig voneinander aktualisieren. Wenn ein Data Lake über Schemaaktualisierungen verfügt, sind möglicherweise Abfrageaktualisierungen erforderlich. Wenn mehrere Anwendungen dieselbe Athena-Arbeitsgruppe teilen und ähnliche Abfragen verwenden, können Sie eine neue Abfrage erstellen oder die vorhandene Abfrage aktualisieren, um mehrere Anwendungsfälle zu bedienen, ohne dass jede Anwendung ähnliche Abfragen in ihrem eigenen Quellcode anpassen muss. Parametrisierte Abfragen werden derzeit für SELECT-, INSERT IGNORE INTO-, CTAS- und UNLOAD-Anweisungen unterstützt. Die aktuellste Liste finden Sie unter Überlegungen und Einschränkungen in Abfragen mit vorbereiteten Anweisungen.

Sicherheit

Vorbereitete Athena-Anweisungen bieten eine Schutzschicht gegen SQL-Injection. Wenn Sie Athena hinter einer Anwendungsschnittstelle verwenden, stellen Freitexteingaben von Natur aus einen SQL-Injection-Bedrohungsvektor dar, der, wenn er nicht gemindert wird, zu einer Datenexfiltration führen könnte. Wenn die parametrisierte Abfrage ausgeführt wird, interpretiert Athena die Argumente als Literalwerte, nicht als ausführbare Befehle oder SQL-Fragmente wie SQL-Operatoren.

Wenn Sie Athena verwenden, CloudTrail erfasst alle Athena-API-Aufrufe als Audit-Ereignisse, um eine Aufzeichnung der Aktionen bereitzustellen, die von einem AWS-Benutzer, einer Rolle oder einem AWS-Service durchgeführt wurden. Kunden mit sensiblen Daten in ihren Data Lakes, wie z. B. persönlich identifizierbaren Informationen (PII), haben uns mitgeteilt, dass sie aus Compliance-Gründen keine Abfragezeichenfolgen in ihrem CloudTrail-Ereignisverlauf wünschen. Beim Ausführen parametrisierter Abfragen wird die Abfragezeichenfolge mit maskiert HIDDEN_DUE_TO_SECURITY_REASONS im CloudTrail-Ereignis, sodass Sie keine geschützten Daten in Ihren Protokollströmen anzeigen.

Lösungsüberblick

Dieser Beitrag dokumentiert die Schritte mit der Öffentlichkeit Datensatz mit Kundenrezensionen von Amazon.com; Sie können jedoch ähnliche Schritte ausführen, um Ihr eigenes Dataset zu verwenden.

Die Beispielabfrage besteht darin, die 4-Sterne-Rezensionen (von 5 Sternen) eines Produkts zu finden, die von anderen Kunden als die hilfreichsten bewertet wurden. Die Absicht hinter der Abfrage besteht darin, Abfrageergebnisse zu finden, die auf konstruktives Produktfeedback hinweisen. Die Absicht besteht darin, das Feedback zu validieren und hilfreiches Feedback in die Produkt-Roadmap aufzunehmen. Das in diesem Anwendungsfall verwendete Produkt ist die Amazon Smile eGift Card.

Voraussetzungen:

Als Voraussetzung benötigen Sie ein grundlegendes Verständnis der SQL-Syntax sowie ein grundlegendes Verständnis der folgenden AWS-Services:

Dieser Beitrag setzt voraus, dass Sie Folgendes haben:

Stellen Sie Ressourcen für das Beispiel-Dataset bereit

Wenn Sie das Beispiel-Dataset verwenden, befolgen Sie die Schritte in diesem Abschnitt. Die Daten befinden sich in einem S3-Bucket in einem von AWS verwalteten AWS-Konto. Sie müssen zunächst Athena- und AWS Glue-Ressourcen erstellen.

Dieser Beitrag stellt eine CloudFormation-Vorlage bereit, die die folgenden Ressourcen in Ihrem AWS-Konto bereitstellt:

  • AthenaWorkGroup - Ein Athena Arbeitsgruppe für Ihren Datensatz und vorbereitete Aussagen. Auf der Konsole wird diese Arbeitsgruppe benannt PreparedStatementsWG.
  • KleberDatenbank – Eine Datenbank im AWS Glue-Datenkatalog für Tabellenmetadaten. Die Datenbank wird benannt athena_prepared_statements.
  • GlueTableAmazonRezensionen – Eine externe Tabelle mit Kundenrezensionen von Amazon.com im Datenkatalog.

Das folgende Diagramm zeigt, wie die Ressourcen interagieren, wenn die Abfrage ausgeführt wird.
Diagramm, das das AWS-Konto eines Kunden und ein von AWS verwaltetes AWS-Konto darstellt. Im Kundenkonto gibt es ein Regionsfeld. In der Region gibt es eine Amazon Athena-Arbeitsgruppe, die drei Schritte unternimmt. Im ersten Schritt greift die Arbeitsgruppe auf Metadaten aus dem AWS Glue-Datenkatalog namens default zu. Der Katalog weist eine gepunktete Linie zu einer AWS Glue-Tabelle namens amazon_reviews_parquet auf, die die Attribute und den S3-Bucket-Standort enthält. Der zweite Schritt der Arbeitsgruppe fragt Daten aus dem S3-Bucket ab. Der S3-Bucket befindet sich im von AWS verwalteten AWS-Konto. Der Bucket ist für das Amazon Customer Reviews-Dataset. Im dritten Schritt speichert die Arbeitsgruppe die Abfrageergebnisse im Amazon S3-Bucket im AWS-Konto des Kunden. Die Abfrageergebnisse können dann von Benutzern mit Lesezugriff auf die Athena-Arbeitsgruppe gelesen werden.

Führen Sie die folgenden Schritte aus, um die CloudFormation-Vorlage bereitzustellen:

  1. Navigieren Sie zu diesem Beitrag GitHub-Repository.
  2. Klonen Sie das Repository oder kopieren Sie die CloudFormation-Vorlage athena-prepared-statements.yaml.
  3. Wählen Sie in der AWS CloudFormation-Konsole aus Stapel erstellen.< /li>
  4. Auswählen Laden Sie eine Vorlagendatei hoch und wählen Sie Datei auswählen.
  5. Hochladen athena-prepared-statements.yaml, Dann wählen Weiter.
  6. Auf dem Geben Sie die Stapeldetails an Geben Sie auf der Seite den Stack-Namen ein athena-prepared-statements-blog.
  7. Aussichten für S3QueryResultsBucketName, geben Sie Ihren S3-Bucket-Namen ein.
  8. Wenn du gehst AthenaWorkGroupName standardmäßig wird die Athena-Arbeitsgruppe benannt PreparedStatementsWG. Wenn Sie den Wert ändern, muss der Name der Athena-Arbeitsgruppe in Ihrer AWS-Region eindeutig sein.
  9. Auswählen Weiter.
  10. Auf dem Konfigurieren Sie die Stapeloptionen Seite wählen Weiter.
  11. Auf dem Bewertung Seite wählen Stapel erstellen.

Das Skript dauert weniger als eine Minute, um ausgeführt zu werden und in a zu wechseln CREATE_COMPLETE Zustand. Wenn Sie den Stack zweimal in demselben AWS-Konto und derselben Region bereitstellen, ist die AWS Glue-Datenbank, -Tabelle oder -Athena-Arbeitsgruppe möglicherweise bereits vorhanden, und der Vorgang schlägt mit einer Meldung fehl, die angibt, dass die Ressource bereits in einer anderen Vorlage vorhanden ist.

Für die Autorisierung mit den geringsten Rechten für die Bereitstellung der CloudFormation-Vorlage können Sie eine erstellen AWS CloudFormation-Servicerolle mit den folgenden IAM-Richtlinienaktionen. Dazu müssen Sie eine erstellen IAM-Richtlinie und IAM-Rolle, und wählen Sie diese Rolle beim Konfigurieren von Stack-Optionen aus.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:CreateDatabase" ], "Resource": [ "arn:${Partition}:glue:${Region}:${Account}:catalog", "arn:${Partition}:glue:${Region}:${Account}:database/athena_prepared_statements" ] }, { "Effect": "Allow", "Action": [ "glue:DeleteDatabase" ], "Resource": [ "arn:${Partition}:glue:${Region}:${Account}:catalog", "arn:${Partition}:glue:${Region}:${Account}:database/athena_prepared_statements", "arn:${Partition}:glue:${Region}:${Account}:table/athena_prepared_statements/*", "arn:${Partition}:glue:${Region}:${Account}:userDefinedFunction/athena_prepared_statements/*" ] }, { "Effect": "Allow", "Action": [ "glue:CreateTable" ], "Resource": [ "arn:${Partition}:glue:${Region}:${Account}:catalog", "arn:${Partition}:glue:${Region}:${Account}:database/athena_prepared_statements", "arn:${Partition}:glue:${Region}:${Account}:table/athena_prepared_statements/amazon_reviews_parquet" ] }, { "Effect": "Allow", "Action": [ "glue:DeleteTable" ], "Resource": [ "arn:${Partition}:glue:${Region}:${Account}:catalog", "arn:${Partition}:glue:${Region}:${Account}:database/athena_prepared_statements", "arn:${Partition}:glue:${Region}:${Account}:table/athena_prepared_statements/amazon_reviews_parquet" ] }, { "Effect": "Allow", "Action": [ "athena:CreateWorkGroup", "athena:DeleteWorkGroup", "athena:GetWorkGroup" ], "Resource": "arn:${Partition}:athena:${Region}:${Account}:workgroup/PreparedStatementsWG" } ]
}

Für die Autorisierung für den IAM-Prinzipal, der die CloudFormation-Vorlage ausführt, und für die folgenden Schritte wurde dieser Beitrag mit den folgenden AWS-verwalteten Richtlinien und der vom Kunden verwalteten Richtlinie unten getestet.

Von AWS verwaltete Richtlinien:

  • AmazonAthenaFullAccess
  • AWSCloudTrailReadOnlyAccess
  • AWSCloudFormationFullAccess

Vom Kunden verwaltete Richtlinie:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ViewS3BucketsWithoutErrors", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": [ "*" ] }, { "Sid": "InteractWithMyBucketAndDataSetBucket", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetBucketLocation", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::${my-bucket-name}*", "arn:aws:s3:::amazon-reviews-pds*" ] }, { "Sid": "UploadCloudFormationTemplate", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::cf-template*" }, { "Sid": "CleanUpResults", "Effect": "Allow", "Action": [ "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::${my-bucket-name}/results*" ] }, { "Sid": "ListRolesForCloudFormationDeployment", "Effect": "Allow", "Action": [ "iam:ListRoles" ], "Resource": [ "*" ] }, { "Sid": "IAMRoleForCloudFormationDeployment", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:${Partition}:iam::${Account}:role/${role-name}" ], "Condition": { "StringEquals": { "iam:PassedToService": "cloudformation.amazonaws.com" } } } ]
}

Partitionieren Sie das Beispiel-Dataset

Die CloudFormation-Vorlage erstellte eine externe Tabelle, die auf einen Datensatz mit über 130 Millionen Kundenbewertungen von Amazon.com verweist. Partitionieren von Daten Verbessert die Abfrageleistung und senkt die Kosten, indem die von jeder Abfrage gescannte Datenmenge begrenzt wird. Die externe Tabelle für dieses Dataset hat Hive-kompatible Partitionen. Die MSCK REPAIR TABLE SQL-Anweisung scannt die Präfixpfade im S3-Bucket und aktualisiert die Metadaten im Datenkatalog mit den Partitionsmetadaten. Um auf das Dataset zuzugreifen, müssen die Partitionen der externen Tabelle aktualisiert werden.

Führen Sie nach der Bereitstellung der CloudFormation-Vorlage die folgenden Schritte aus:

  1. Wählen Sie auf der Athena-Konsole Abfrage-Editor im Navigationsbereich.
  2. Aussichten für Datenquelle, eingeben AwsDataCatalog.
  3. Aussichten für Datenbase, eingeben athena_prepared_statements.
  4. Auf dem Arbeitsgruppen Dropdown-Menü auswählen VorbereiteteStatementsWG.
  5. Auswählen Bestätigen zu bestätigen.
  6. Führen Sie im Abfrageeditorbereich die folgende SQL-Anweisung für Ihre externe Tabelle aus:
MSCK REPAIR TABLE athena_prepared_statements.amazon_reviews_parquet;

Diese Abfrage dauert ungefähr 15 Sekunden, wenn sie getestet wird us-east-1.

  1. Führen Sie die folgende Abfrage aus, um die verfügbaren Partitionen aufzulisten. Das Beispiel-Dataset hat Partitionen basierend auf product_category.
SHOW PARTITIONS athena_prepared_statements.amazon_reviews_parquet;
  1. Führen Sie eine SELECT-Anweisung aus, um ein Beispiel der in der Tabelle verfügbaren Daten auszugeben:
SELECT * FROM athena_prepared_statements.amazon_reviews_parquet limit 10;

Erstellen Sie vorbereitete Erklärungen

Um parametrisierte Athena-Abfragen zu verwenden, führen Sie zuerst die PREPARE-SQL-Anweisung aus und geben Ihre Positionsparameter an, die durch Fragezeichen gekennzeichnet sind. Die von Athena vorbereitete Anweisung wird unter einem von Ihnen angegebenen Namen gespeichert.

Führen Sie die folgende PREPARE-Anweisung im Athena-Abfrage-Editor aus. Diese Beispielabfrage mit dem Namen product_helpful_reviews, bietet Kundenrezensionen mit drei Parametern für eine bestimmte Produkt-ID, eine vom Rezensenten bereitgestellte Sternebewertung und eine Mindestanzahl hilfreicher Stimmen, die von anderen Amazon.com-Kunden für die Rezension abgegeben wurden.

PREPARE product_helpful_reviews FROM
SELECT product_id, product_title, star_rating, helpful_votes, review_headline, review_body
FROM amazon_reviews_parquet WHERE product_id = ? AND star_rating = ? AND helpful_votes > ?
ORDER BY helpful_votes DESC
LIMIT 10;

Sie können auch die CreatePreparedStatement-API oder das SDK verwenden. Um beispielsweise Ihre vorbereitete Anweisung über die AWS CLI zu erstellen, führen Sie den folgenden Befehl aus:

aws athena create-prepared-statement --statement-name "product_helpful_reviews" --query-statement "SELECT product_id, product_title, star_rating, helpful_votes, review_headline, review_body FROM amazon_reviews_parquet WHERE product_id = ? AND star_rating = ? AND helpful_votes > ? ORDER BY helpful_votes DESC LIMIT 10;" --work-group PreparedStatementsWG --region region

Weitere Informationen zum Erstellen vorbereiteter Anweisungen finden Sie unter SQL-Anweisungen in Abfragen mit vorbereiteten Anweisungen.

Parametrierte Abfragen ausführen

Sie können eine parametrisierte Abfrage für die vorbereitete Anweisung mit der EXECUTE-SQL-Anweisung und einer USING-Klausel ausführen. Die USING-Klausel gibt die Argumentwerte für die Parameter der vorbereiteten Anweisung an.

Führen Sie die folgende EXECUTE-Anweisung im Athena-Abfrage-Editor aus. Die im vorherigen Abschnitt erstellte vorbereitete Aussage wird mit Parametern ausgeführt, um 4-Sterne-Bewertungen für die Amazon Smile eGift Card-Produkt-ID mit mindestens 10 hilfreichen Stimmen auszugeben.

EXECUTE product_helpful_reviews USING 'BT00DDVMVQ', 4, 10;

Wenn Sie die Nachricht erhalten PreparedStatement product_helpful_reviews was not found in workGroup primary, vergewissern Sie sich, dass Sie ausgewählt haben PreparedStatementsWG Arbeitsgruppe.

Weitere Informationen zum Ausführen parametrisierter Abfragen finden Sie unter SQL-Anweisungen in Abfragen mit vorbereiteten Anweisungen.

Maskieren Sie Abfragezeichenfolgendaten in CloudTrail-Ereignissen mithilfe parametrisierter Abfragen

Möglicherweise möchten Sie parametrisierte Abfragen verwenden, um vertrauliche Daten aus der in CloudTrail-Ereignissen sichtbaren Abfragezeichenfolge zu entfernen. Beispielsweise können Sie Spalten haben, die PII als Parameter enthalten, die nicht in Protokollen sichtbar sein sollen. Athena maskiert automatisch Abfragezeichenfolgen aus CloudTrail-Ereignissen für EXECUTE-Anweisungen und ersetzt die Abfragezeichenfolge durch den Wert HIDDEN_DUE_TO_SECURITY_REASONS. Dadurch können Sie vermeiden, dass geschützte Daten in Ihren Protokollströmen angezeigt werden.

Führen Sie die folgenden Schritte aus, um auf das CloudTrail-Ereignis für die Abfrage zuzugreifen:

  1. Navigieren Sie zu der Ereignisverlauf Seite auf der CloudTrail-Konsole.
  2. Wählen Sie im Dropdown-Menü die Option Veranstaltungsname.
  3. Suchen Sie nach HEIF-Bilderweiterungen. StartQueryExecution Veranstaltungen.

CloudTrail-Ereignisdatensätze für parametrisierte Abfragen umfassen a queryString Wert redigiert mit HIDDEN_DUE_TO_SECURITY_REASONS. Die Abfragezeichenfolge ist im Abfrageverlauf der Athena-Arbeitsgruppe sichtbar. Sie können den Zugriff steuern, indem Sie IAM-Richtlinien mit geringsten Rechten für Athena, den AWS Glue-Datenkatalog und den Ausgabespeicherort für Amazon S3-Abfragen in Ihren Arbeitsgruppeneinstellungen verwenden. Weitere Informationen zum Anzeigen der letzten Abfragen finden Sie unter Anzeigen der letzten Abfragen. Weitere Informationen zu IAM-Richtlinien finden Sie unter Aktionen, Ressourcen und Bedingungsschlüssel für AWS-Services.

Schutzebene für SQL-Injection

In diesem Abschnitt wird Ihnen ein Beispiel für einen SQL-Injection-Angriff gezeigt und wie vorbereitete Anweisungen vor demselben Angriff schützen können. Wir verwenden die Athena-Konsole, um die aufzurufen StartQueryExecution API gegen eine Tabelle namens users mit drei Reihen.

SQL-Injection ist ein Versuch, schädlichen SQL-Code in Anfragen einzufügen, um die Anweisung zu ändern und Daten aus den Tabellen Ihres Datasets zu extrahieren. Wenn Sie ohne parametrisierte Athena-Abfragen ein Dataset direkt abfragen oder Benutzereingaben an eine SQL-Abfrage anhängen und Benutzer SQL-Fragmente anhängen können, ist das Dataset möglicherweise anfällig für SQL-Injection-Angriffe, die nicht autorisierte Daten im Resultset zurückgeben.

Dieser Beitrag zeigt ein Beispiel für das Einfügen eines SQL-Fragments auf böswillige Weise. In dem Beispiel wird eine ODER-Bedingung, die immer wahr zurückgibt (wie z OR 1=1) wird an die WHERE-Klausel angehängt. Dieselbe Beispielabfrage wird mit parametrisierten Athena-Abfragen gezeigt, und die Abfrage schlägt fehl, weil sie einen ungültigen Parameterwert enthält, da erwartet wird, dass der Parameterwert eine ganze Zahl ist, aber die Zeichen „ODER“ enthält. Wenn der Parameter auf einer String-Spalte basiert, würde derselbe SQL-Injection-Versuch dazu führen, dass die Abfrage keine Ergebnisse zurückgibt, da das Positionsargument als Literalparameterwert interpretiert wird.

Athena bietet eine zusätzliche Verteidigungsebene gegen SQL-Injection-Angriffe mit mehreren Anweisungen. Der Versuch, eine SQL-Injection mit einem ausführbaren Befehl (z. B. DROP) durchzuführen, führt zu einer fehlgeschlagenen Abfrage, wobei Athena einen Fehler ausgibt Only one sql statement is allowed, da Athena nur einen ausführbaren Befehl pro SQL-Anweisungsübermittlung akzeptiert.

Obwohl vorbereitete Athena-Anweisungen eine Schutzschicht gegen SQL-Injection-Angriffe bieten, bieten andere Vorsichtsmaßnahmen zusätzliche Verteidigungsebenen. Von Athena vorbereitete Erklärungen können Teil Ihrer Defense-in-Depth-Strategie sein. Weitere Informationen zu Sicherheitsebenen finden Sie unter Amazon Athena-Sicherheit.

Beispiel für SQL-Injection

Die beabsichtigte Verwendung der SELECT-Abfrage im Beispiel besteht darin, eine kleine Menge von Werten zu erhalten. Ein Angreifer kann die Eingabe jedoch manipulieren, um bösartigen SQL-Code anzuhängen. Beispielsweise kann ein Angreifer den Wert eingeben 1 OR 1=1, die eine wahre Bedingung an die WHERE-Klausel anhängt und alle Datensätze in der Tabelle zurückgibt:

SELECT * FROM users WHERE id = 1 OR 1=1;

Durch Anhängen von bösartigem SQL-Code kann der Angreifer alle Zeilen der abrufen users Tabelle, wie im folgenden Screenshot gezeigt.
Ein Bild der grafischen Benutzeroberfläche von Athena. Eine Abfrage SELECT * FROM Users WHERE id = 1 OR 1=1; ist gelaufen. Alle 3 Benutzer in der Tabelle mit den IDs 1, 2 und 3 wurden mit allen Spalten der Tabelle zurückgegeben.

SQL-Injection-Versuch mit einer vorbereiteten Anweisung

Wenn wir vorbereitete Anweisungen mit derselben Abfrage aus dem vorherigen Beispiel erstellen, wird der ausführbare Befehl als wörtliches Argument für den Wert des Parameters übergeben. Wenn ein Benutzer versucht, zusätzliches SQL zu übergeben, erhält er einen Syntaxfehler, da die WHERE-Klausel auf ID basiert, die einen ganzzahligen Wert erwartet.

  1. Erstellen Sie eine vorbereitete Anweisung mit derselben Abfrage für die users Tabelle:
PREPARE get_user FROM SELECT * FROM users WHERE id = ?
  1. Setzen Sie den Parameter auf einen zulässigen Wert:
EXECUTE get_user USING 1

Das erwartete Ergebnis wird zurückgegeben, wie im folgenden Screenshot gezeigt.

Grafische Benutzeroberfläche von Athena mit laufender Abfrage EXECUTE get_user USING 1. Nur der Benutzer mit der ID 1 wird zurückgegeben.

  1. Versuchen Sie nun, einen schädlichen Wert zu übergeben:
EXECUTE get_user USING 1 OR 1=1

Die Ausführung dieser vorbereiteten Anweisung erzeugt einen Syntaxfehler, weil ein ganzzahliger Wert erwartet wird, aber sie erhält einen ungültigen ganzzahligen Wert von 1 OR 1=1. Die Abfrage und der Syntaxfehler sind im folgenden Screenshot dargestellt.

Grafische Benutzeroberfläche von Athena, die EXECUTE get_user USING 1 OR 1=1 abfragt. Es gibt einen Fehler. Der Fehler lautet „SYNTAX_ERROR: Zeile 1:24: Linke Seite des logischen Ausdrucks muss zu einem booleschen Wert ausgewertet werden (tatsächlich: Ganzzahl). Diese Abfrage wurde gegen die „Standard“-Datenbank ausgeführt, sofern sie nicht durch die Abfrage qualifiziert wird Forum."

Arbeiten mit vorbereiteten Statements

Dieser Abschnitt beschreibt administrative Funktionen, um die Arbeit mit vorbereiteten Anweisungen zu erleichtern.

Alle vorbereiteten Kontoauszüge in meinem AWS-Konto auflisten

Zum Auflisten aller vorbereiteten Anweisungen in einer Athena-Arbeitsgruppe aus der AWS-Befehlszeilenschnittstelle (AWS CLI) können Sie den folgenden Befehl ausführen:

aws athena list-prepared-statements --work-group workgroup_name --region region_name

Wenn Sie dem obigen Beispiel folgen, gibt der Befehl die folgende Antwort zurück.

{ "PreparedStatements": [ { "StatementName": "product_helpful_reviews", "LastModifiedTime": "2022-01-14T15:33:07.935000+00:00" } ]
}

Um alle verfügbaren vorbereiteten Kontoauszüge in Ihrem AWS-Konto aufzulisten, können Sie die AWS-APIs verwenden. Dieser Beitrag enthält ein Beispielskript mit der AWS SDK für Python (Boto3) um alle Regionen in Ihrem Konto zu durchlaufen und die vorbereiteten Auszüge pro Athena-Arbeitsgruppe bereitzustellen.

Stellen Sie sicher, dass Sie über AWS-Anmeldeinformationen verfügen, wo Sie das Python-Skript ausführen möchten. Weitere Informationen finden Sie unter Referenzen.

Klonen Sie die GitHub Repo oder kopieren Sie das Python-Skript list-prepared-statements.py aus dem Repo und führen Sie das Skript aus:

python3 list-prepared-statements.py

Ersetzen <my-profile-name> mit Ihrem AWS-Profilnamen, wenn Sie dazu aufgefordert werden, oder lassen Sie es leer, um lokale Standardanmeldeinformationen zu verwenden.

Enter the AWS CLI profile name or leave blank if using instance profile: <my-profile-name>

Der folgende Text ist die Ausgabe des Skripts. Wenn Sie weitermachen, gibt die Antwort nur die zurück product_helpful_reviews vorbereitete Aussage.

eu-north-1:
ap-south-1:
eu-west-3:
eu-west-2:
eu-west-1:
ap-northeast-3:
ap-northeast-2:
ap-northeast-1:
sa-east-1:
ca-central-1:
ap-southeast-1:
ap-southeast-2:
eu-central-1:
us-east-1: athena-v2-wg: my_select PreparedStatementsWG: get_user PreparedStatementsWG: get_contacts_by_company PreparedStatementsWG: product_helpful_reviews PreparedStatementsWG: count_stars PreparedStatementsWG: helpful_reviews PreparedStatementsWG: get_product_info PreparedStatementsWG: check_avg_stars_of_category PreparedStatementsWG: my_select_v1 PreparedStatementsWG: my_select_v2
us-east-2:
us-west-1:
us-west-2:

Vorbereitete Anweisungen aktualisieren

Sie haben einige Optionen zum Aktualisieren von vorbereiteten Kontoauszügen. Möglicherweise möchten Sie dies tun, um Ihre Abfrageleistung zu optimieren, die von Ihnen ausgewählten Werte zu ändern oder aus verschiedenen anderen Gründen.

  1. Führen Sie die PREPARE-Anweisung mit den Änderungen im Athena-Abfrage-Editor oder gegen die erneut aus StartQueryExecution API.
  2. Verwenden Sie das UpdatePreparedStatement API über die AWS CLI oder das SDK.

Sie können diese API verwenden, um Ihren vorbereiteten Anweisungen eine Beschreibung hinzuzufügen oder Ihre Abfragen zu aktualisieren. Um Ihre Abfrageanweisung über diese Methode zu aktualisieren, müssen Sie den Anweisungsnamen, den Arbeitsgruppennamen, die aktualisierte Abfrageanweisung und optional eine neue Beschreibung angeben. Für weitere Informationen über die UpdatePreparedStatement API, siehe update-prepared-statement.

Möglicherweise möchten Sie Versionen Ihrer Abfrage bereitstellen. Um die Abwärtskompatibilität für Benutzer aufrechtzuerhalten, könnten Sie eine neue vorbereitete Anweisung mit einem anderen Namen erstellen. Beispielsweise könnte die vorbereitete Anweisung eine Versionsnummer in ihrem Namen haben (z my_select_v1 und my_select_v2). Bei Bedarf können Sie Änderungen Teams mitteilen, die sich auf die vorbereitete Anweisung verlassen, und später die alten vorbereiteten Anweisungsversionen freigeben.

Löschen Sie vorbereitete Anweisungen

Um eine vorbereitete Anweisung zu löschen, können Sie die folgende Abfragesyntax verwenden, wenn gegen die StartQueryExecution API oder im Athena-Abfrage-Editor:

DEALLOCATE PREPARE product_helpful_reviews

Sie könnten auch die verwenden DeletePreparedStatement API oder SDK. Um beispielsweise Ihre vorbereitete Anweisung aus der AWS CLI zu löschen, führen Sie den folgenden Befehl aus:

aws athena delete-prepared-statement --statement-name product_helpful_reviews --work-group PreparedStatementsWG --region region

Aufräumen

Wenn Sie diesem Beitrag gefolgt sind, haben Sie mehrere Komponenten erstellt, die möglicherweise Kosten verursachen. Um zukünftige Gebühren zu vermeiden, entfernen Sie die Ressourcen mit den folgenden Schritten:

  1. Löschen Sie das Ergebnispräfix des S3-Buckets erstellt, nachdem Sie eine Abfrage für Ihre Arbeitsgruppe ausgeführt haben.

Bei der Standardvorlage heißt es <S3QueryResultsBucketName>/athena-results. Gehen Sie bei diesem Schritt vorsichtig vor. Es sei denn, Sie sind es Verwenden der Versionierung für Ihren S3-Bucket, das Löschen von S3-Objekten kann nicht rückgängig gemacht werden.

  1. Löschen Sie die vorbereiteten Athena-Anweisungen in der PreparedStatementsWG

Sie können die Schritte in der Löschen Sie vorbereitete Anweisungen Abschnitt dieses Beitrags entweder mit der DEALLOCATE PREPARE-Anweisung oder delete-prepared-statement API für jede von Ihnen erstellte vorbereitete Anweisung.

  1. Um den CloudFormation-Stack zu entfernen, wählen Sie den Stack in der AWS CloudFormation-Konsole aus, wählen Sie Löschen, und bestätigen Sie.

Zusammenfassung

Parametrisierte Athena-Abfragen machen es einfach, Ihre Codebasis von Ihren Abfragen zu entkoppeln, indem Sie eine Möglichkeit bieten, allgemeine Abfragen in Ihrer Athena-Arbeitsgruppe zu speichern. Dieser Beitrag enthält Informationen darüber, wie Athena parametrisierte Abfragen die Wiederverwendbarkeit Ihres Codes und die Data Lake-Sicherheit verbessern kann. Wir haben gezeigt, wie Sie einen Beispiel-Data Lake einrichten und noch heute parametrisierte Abfragen verwenden können. Wir haben auch ein Beispiel für die Schutzmöglichkeiten parametrisierter Abfragen und detaillierte zusätzliche Verwaltungsfunktionen bereitgestellt.

Sie können mit den vorbereiteten Athena-Anweisungen über beginnen Athena-Konsole, der AWS-CLIOder das AWS-SDK. Weitere Informationen zu Athena finden Sie unter Amazon Athena-Benutzerhandbuch.

Vielen Dank für das Lesen dieses Beitrags! Wenn Sie Fragen zu parametrisierten Athena-Abfragen haben, zögern Sie nicht, einen Kommentar im Kommentarbereich zu hinterlassen.


Über die Autoren

Blayze Stefaniak ist Senior Solutions Architect bei AWS und arbeitet mit Organisationen des öffentlichen Sektors, der Bundesfinanzen und des Gesundheitswesens zusammen. Blayze hat seinen Sitz in Pittsburgh. Er ist leidenschaftlich daran interessiert, komplexe Situationen in etwas Praktisches und Umsetzbares herunterzubrechen. Seine Interessen umfassen künstliche Intelligenz, verteilte Systeme und Excel-Formelturnen. Blayze hat einen BSBA in Rechnungswesen und einen BS in Informationssystemen von der Clarion University of Pennsylvania. In seiner Freizeit hört Blayze Star Wars-Hörbücher, versucht, seine Hunde zum Lachen zu bringen, und spricht wahrscheinlich stumm.

Daniel Tatarkin ist ein Lösungsarchitekt bei Amazon Web Services (AWS) und unterstützt Bundesfinanzorganisationen. Er interessiert sich leidenschaftlich für Big-Data-Analysen und serverlose Technologien. Außerhalb der Arbeit lernt er gerne etwas über persönliche Finanzen, Kaffee und probiert zum Spaß neue Programmiersprachen aus.

spot_img

Neueste Intelligenz

spot_img

Chat mit uns

Hallo! Wie kann ich dir helfen?