Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Beschränken Sie den Zugriff auf eine AWS Lambda Funktion, URL, Herkunft
CloudFront bietet Origin Access Control (OAC) zur Beschränkung des Zugriffs auf den Ursprung einer Lambda-Funktions-URL.
Themen
Erstellen einer neuen OAC
Führen Sie die in den folgenden Themen beschriebenen Schritte aus, um ein neues OAC einzurichten. CloudFront
Wichtig
Wenn Sie unsere POST Methoden mit Ihrer Lambda-Funktions-URL verwendenPUT, müssen Ihre Benutzer den SHA256-Wert des Hauptteils berechnen und den Nutzlast-Hashwert des Anforderungstexts in den x-amz-content-sha256 Header aufnehmen, wenn sie die Anfrage an senden. CloudFront Lambda unterstützt keine unsignierten Nutzdaten.
Themen
Voraussetzungen
Bevor Sie OAC erstellen und einrichten, benötigen Sie eine CloudFront Distribution mit einer Lambda-Funktions-URL als Ursprung. Für die Verwendung von OAC müssen Sie AWS_IAM als Wert für den AuthType-Parameter angeben. Weitere Informationen finden Sie unter Verwenden einer Lambda-Funktions-URL.
Erteilen Sie CloudFront die Erlaubnis, auf die URL der Lambda-Funktion zuzugreifen
Bevor Sie ein OAC erstellen oder es in einer CloudFront Distribution einrichten, stellen Sie sicher, dass dieses CloudFront über die Zugriffsberechtigung für die Lambda-Funktions-URL verfügt. Tun Sie dies, nachdem Sie eine CloudFront Distribution erstellt haben, aber bevor Sie den OAC zur Lambda-Funktions-URL in der Distributionskonfiguration hinzufügen.
Anmerkung
Um die IAM-Richtlinie für die Lambda-Funktions-URL zu aktualisieren, müssen Sie die AWS Command Line Interface (AWS CLI) verwenden. Die Bearbeitung der IAM-Richtlinie in der Lambda-Konsole wird derzeit nicht unterstützt.
Der folgende AWS CLI Befehl gewährt dem CloudFront Service Principal (cloudfront.amazonaws.com) Zugriff auf Ihre Lambda-Funktions-URL. Das Condition Element in der Richtlinie ermöglicht den CloudFront Zugriff auf Lambda nur, wenn die Anforderung im Namen der CloudFront Distribution erfolgt, die die Lambda-Funktions-URL enthält. Dies ist die Distribution mit der Lambda-Funktions-URL als Ursprung, der Sie OAC hinzufügen möchten.
Beispiel: AWS CLI Befehl zum Aktualisieren einer Richtlinie, sodass für eine Distribution mit aktiviertem OAC nur Lesezugriff gewährt wird CloudFront
Die folgenden AWS CLI Befehle ermöglichen der CloudFront Distribution () den Zugriff auf Ihr Lambda. E1PDK09ESKHJWTFUNCTION_URL_NAME
aws lambda add-permission \ --statement-id "AllowCloudFrontServicePrincipal" \ --action "lambda:InvokeFunctionUrl" \ --principal "cloudfront.amazonaws.com" \ --source-arn "arn:aws:cloudfront::123456789012:distribution/E1PDK09ESKHJWT" \ --function-nameFUNCTION_URL_NAME
aws lambda add-permission \ --statement-id "AllowCloudFrontServicePrincipalInvokeFunction" \ --action "lambda:InvokeFunction" \ --principal "cloudfront.amazonaws.com" \ --source-arn "arn:aws:cloudfront::123456789012:distribution/E1PDK09ESKHJWT" \ --function-nameFUNCTION_URL_NAME
Anmerkung
Wenn Sie eine Distribution erstellen und diese keine Berechtigung für Ihre Lambda-Funktions-URL hat, können Sie in der CloudFront Konsole den Befehl Copy CLI wählen und diesen Befehl dann über Ihr Befehlszeilenterminal eingeben. Weitere Informationen finden Sie unter Gewähren des Zugriffs auf Funktionen für AWS-Services im Entwicklerhandbuch für AWS Lambda .
Erstellen der OAC
Um ein OAC zu erstellen, können Sie die AWS-Managementkonsole CloudFormation, die oder die AWS CLI CloudFront API verwenden.
Erweiterte Einstellungen für die Ursprungszugriffssteuerung
Die CloudFront OAC-Funktion umfasst erweiterte Einstellungen, die nur für bestimmte Anwendungsfälle vorgesehen sind. Verwenden Sie die empfohlenen Einstellungen, sofern Sie die erweiterten Einstellungen nicht speziell benötigen.
OAC enthält eine Einstellung namens Signing behavior (in der Konsole) oder SigningBehavior (in der API, CLI und CloudFormation). Diese Einstellung bietet die folgenden Optionen:
- Ursprungsanforderungen immer signieren (empfohlene Einstellung)
-
Wir empfehlen die Verwendung dieser Einstellung mit der Bezeichnung Sign requests (recommended) (Anforderungen signieren (empfohlen)) in der Konsole bzw.
alwaysin der API, CLI und CloudFormation. Mit dieser Einstellung signiert CloudFront immer alle Anfragen, die es an die Lambda-Funktions-URL sendet. - Ursprungsanforderungen nie signieren
-
Diese Einstellung heißt Do not sign requests (Anforderungen nicht signieren) in der Konsole bzw.
neverin der API, CLI und CloudFormation. Verwenden Sie diese Einstellung, um die OAC für alle Ursprünge in allen Distributionen zu deaktivieren, die diese OAC verwenden. Auf diese Weise lässt sich im Vergleich zum einzelnen Entfernen einer OAC aus allen Ursprüngen und Distributionen, die diese verwenden, Zeit und Aufwand sparen. Mit dieser Einstellung signiert es CloudFront keine Anfragen, die es an die Lambda-Funktions-URL sendet.Warnung
Um diese Einstellung verwenden zu können, muss die Lambda-Funktions-URL öffentlich zugänglich sein. Wenn Sie diese Einstellung mit einer Lambda-Funktions-URL verwenden, die nicht öffentlich zugänglich ist, CloudFront können Sie nicht auf den Ursprung zugreifen. Die URL der Lambda-Funktion gibt Fehler an die Betrachter zurück CloudFront und CloudFront leitet diese Fehler an sie weiter. Weitere Informationen finden Sie unter Sicherheits- und Authentifizierungsmodell für Lambda-Funktions-URLs im Benutzerhandbuch für AWS Lambda .
- Viewer (Client)-
Authorization-Header nicht überschreiben -
Diese Einstellung heißt Do not override authorization header (Autorisierungsheader nicht überschreiben) in der Konsole bzw.
no-overridein der API, CLI und CloudFormation. Verwenden Sie diese Einstellung, wenn Sie Originalanfragen nur signieren CloudFront möchten, wenn die entsprechende Viewer-Anfrage keinenAuthorizationHeader enthält. Bei dieser Einstellung wird derAuthorizationHeader aus der Viewer-Anfrage weitergegeben, CloudFront wenn eine vorhanden ist, signiert aber die ursprüngliche Anfrage (indem ein eigenerAuthorizationHeader hinzugefügt wird), wenn die Viewer-Anfrage keinenAuthorizationHeader enthält.Warnung
-
Wenn Sie diese Einstellung verwenden, müssen Sie anstelle des Namens oder des CNAME Ihrer CloudFront Distribution die Signature Version 4-Signatur für die Lambda-Funktions-URL angeben. Wenn Lambda den
AuthorizationHeader von der Viewer-Anfrage an die Lambda-Funktions-URL CloudFront weiterleitet, validiert Lambda die Signatur anhand des Hosts der Lambda-URL-Domain. Wenn die Signatur nicht auf der Lambda-URL-Domain basiert, stimmt der Host in der Signatur nicht mit dem Host überein, der vom Lambda-URL-Ursprung verwendet wird. Dies hat zur Folge, dass die Anforderung fehlschlägt, was zu einem Fehler bei der Signaturvalidierung führt.
-
Um den
Authorization-Header aus der Viewer-Anforderung zu übergeben, müssen Sie denAuthorization-Header einer Cache-Richtlinie für alle Cache-Verhaltensweisen hinzufügen, die Lambda-Funktions-URLs verwenden, die dieser Ursprungszugriffssteuerung zugeordnet sind.
-
Beispielvorlagencode
Wenn Ihr CloudFront Ursprung eine Lambda-Funktions-URL ist, die mit einem OAC verknüpft ist, können Sie das folgende Python-Skript verwenden, um Dateien mit der Methode in die Lambda-Funktion hochzuladen. POST
Dieser Code setzt voraus, dass Sie die OAC so konfiguriert haben, dass das standardmäßige Signaturverhalten auf Ursprungsanforderungen immer signieren eingestellt ist und dass Sie die Einstellung Autorisierungsheader nicht überschreiben nicht ausgewählt haben.
Diese Konfiguration ermöglicht es der OAC, die SigV4-Autorisierung mit Lambda mithilfe des Lambda-Hostnamens korrekt zu verwalten. Die Nutzdaten werden mithilfe von SigV4 aus der IAM-Identität signiert, die für die Lambda-Funktions-URL autorisiert ist, die als IAM_AUTH-Typ festgelegt ist.
Die Vorlage zeigt, wie signierte Nutzdaten-Hashwerte im x-amz-content-sha256-Header für clientseitige POST-Anforderungen behandelt werden. Diese Vorlage wurde speziell für die Verwaltung von Formulardaten-Nutzdaten entwickelt. Die Vorlage ermöglicht sichere Dateiuploads auf eine Lambda-Funktions-URL über und verwendet AWS Authentifizierungsmechanismen CloudFront, um sicherzustellen, dass nur autorisierte Anfragen auf die Lambda-Funktion zugreifen können.
Der Code umfasst folgende Funktionen:
-
erfüllt die Anforderung, den Nutzdaten-Hash in den x-amz-content-sha256-Header aufzunehmen
-
Verwendet die SigV4-Authentifizierung für den sicheren Zugriff AWS-Service
-
unterstützt Datei-Uploads mithilfe von mehrteiligen Formulardaten
-
beinhaltet die Fehlerbehandlung für Anforderungsausnahmen
import boto3 from botocore.auth import SigV4Auth from botocore.awsrequest import AWSRequest import requests import hashlib import os def calculate_body_hash(body): return hashlib.sha256(body).hexdigest() def sign_request(request, credentials, region, service): sigv4 = SigV4Auth(credentials, service, region) sigv4.add_auth(request) def upload_file_to_lambda(cloudfront_url, file_path, region): # AWS credentials session = boto3.Session() credentials = session.get_credentials() # Prepare the multipart form-data boundary = "------------------------boundary" # Read file content with open(file_path, 'rb') as file: file_content = file.read() # Get the filename from the path filename = os.path.basename(file_path) # Prepare the multipart body body = ( f'--{boundary}\r\n' f'Content-Disposition: form-data; name="file"; filename="{filename}"\r\n' f'Content-Type: application/octet-stream\r\n\r\n' ).encode('utf-8') body += file_content body += f'\r\n--{boundary}--\r\n'.encode('utf-8') # Calculate SHA256 hash of the entire body body_hash = calculate_body_hash(body) # Prepare headers headers = { 'Content-Type': f'multipart/form-data; boundary={boundary}', 'x-amz-content-sha256': body_hash } # Create the request request = AWSRequest( method='POST', url=cloudfront_url, data=body, headers=headers ) # Sign the request sign_request(request, credentials, region, 'lambda') # Get the signed headers signed_headers = dict(request.headers) # Print request headers before sending print("Request Headers:") for header, value in signed_headers.items(): print(f"{header}: {value}") try: # Send POST request with signed headers response = requests.post( cloudfront_url, data=body, headers=signed_headers ) # Print response status and content print(f"\nStatus code: {response.status_code}") print("Response:", response.text) # Print response headers print("\nResponse Headers:") for header, value in response.headers.items(): print(f"{header}: {value}") except requests.exceptions.RequestException as e: print(f"An error occurred: {e}") # Usage cloudfront_url = "https://d111111abcdef8.cloudfront.net" file_path = r"filepath" region = "us-east-1" # example: "us-west-2" upload_file_to_lambda(cloudfront_url, file_path, region)