Limita l'accesso all'origine dell'URL di una AWS Lambda funzione - Amazon CloudFront

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Limita l'accesso all'origine dell'URL di una AWS Lambda funzione

CloudFront fornisce il controllo dell'accesso all'origine (OAC) per limitare l'accesso all'origine dell'URL di una funzione Lambda.

Crea un nuovo OAC

Completa i passaggi descritti nei seguenti argomenti per configurare un nuovo OAC in. CloudFront

Importante

Se utilizzi PUT o POST metodi con l'URL della funzione Lambda, gli utenti devono calcolare il corpo SHA256 del corpo e includere il valore hash del payload del corpo della richiesta nell'x-amz-content-sha256intestazione quando inviano la richiesta a. CloudFront Lambda non supporta payload non firmati.

Prerequisiti

Prima di creare e configurare OAC, è necessario disporre di una CloudFront distribuzione con un URL della funzione Lambda come origine. Per utilizzare OAC, è necessario specificare AWS_IAM come valore per il parametro. AuthType Per ulteriori informazioni, consulta Usa l'URL di una funzione Lambda.

Concedi CloudFront l'autorizzazione per accedere all'URL della funzione Lambda

Prima di creare un OAC o configurarlo in una CloudFront distribuzione, assicurati che CloudFront disponga dell'autorizzazione per accedere all'URL della funzione Lambda. Esegui questa operazione dopo aver creato una CloudFront distribuzione, ma prima di aggiungere l'OAC all'URL della funzione Lambda nella configurazione di distribuzione.

Nota

Per aggiornare la policy IAM per l'URL della funzione Lambda, devi usare il AWS Command Line Interface ()AWS CLI. La modifica della policy IAM nella console Lambda non è supportata al momento.

Il AWS CLI comando seguente concede al CloudFront service principal (cloudfront.amazonaws.com) l'accesso all'URL della funzione Lambda. L'Conditionelemento della policy consente di accedere CloudFront a Lambda solo quando la richiesta è per conto della CloudFront distribuzione che contiene l'URL della funzione Lambda. Questa è la distribuzione con l'origine dell'URL della funzione Lambda a cui vuoi aggiungere OAC.

Esempio : AWS CLI comando per aggiornare una policy per consentire l'accesso in sola lettura a una CloudFront distribuzione con OAC abilitato

Il AWS CLI comando seguente consente alla CloudFront distribution (E1PDK09ESKHJWT) di accedere alla tua FUNCTION_URL_NAME Lambda.

aws lambda add-permission \ --statement-id "AllowCloudFrontServicePrincipal" \ --action "lambda:InvokeFunctionUrl" \ --principal "cloudfront.amazonaws.com" \ --source-arn "arn:aws:cloudfront::123456789012:distribution/E1PDK09ESKHJWT" \ --function-name FUNCTION_URL_NAME
Nota

Se crei una distribuzione e questa non dispone dell'autorizzazione per l'URL della funzione Lambda, puoi scegliere Copia il comando CLI dalla CloudFront console e quindi immettere questo comando dal tuo terminale a riga di comando. Per ulteriori informazioni, consulta Concessione dell'accesso alla funzione Servizi AWS nella Guida per gli AWS Lambda sviluppatori.

Crea l'OAC

Per creare un OAC, puoi utilizzare l' AWS Management Console, AWS CloudFormation AWS CLI, o l' CloudFront API.

Console
Per creare un OAC
  1. Accedi a AWS Management Console e apri la CloudFront console all'indirizzohttps://console.aws.amazon.com/cloudfront/v4/home.

  2. Nel pannello di navigazione a sinistra, scegli Accesso origine.

  3. Scegli Crea un'impostazione di controllo.

  4. Nel modulo Crea nuovo OAC, procedi come segue:

    1. Immettete un nome e (facoltativamente) una descrizione per l'OAC.

    2. Per quanto riguarda il comportamento di firma, ti consigliamo di lasciare l'impostazione predefinita (Richieste di firma (consigliata)). Per ulteriori informazioni, consulta Impostazioni avanzate per il controllo dell'accesso all'origine.

  5. Per il tipo di origine, scegli Lambda.

  6. Scegli Create (Crea).

    Suggerimento

    Dopo aver creato l'OAC, prendi nota del nome. In questa procedura, eseguire le seguenti operazioni:

Per aggiungere un controllo di accesso all'origine all'URL di una funzione Lambda in una distribuzione
  1. Apri la CloudFront console all'indirizzohttps://console.aws.amazon.com/cloudfront/v4/home.

  2. Scegli una distribuzione con l'URL di una funzione Lambda a cui desideri aggiungere l'OAC, quindi scegli la scheda Origins.

  3. Seleziona l'URL della funzione Lambda a cui desideri aggiungere l'OAC, quindi scegli Modifica.

  4. Seleziona HTTPS solo per il protocollo di origine.

  5. Dal menu a discesa Origin Access Control, scegli il nome OAC che desideri utilizzare.

  6. Scegli Save changes (Salva modifiche).

La distribuzione inizia a essere distribuita in tutte le edge location. CloudFront Quando una edge location riceve la nuova configurazione, firma tutte le richieste inviate all'URL della funzione Lambda.

CloudFormation

Per creare un OAC con AWS CloudFormation, usa il tipo di AWS::CloudFront::OriginAccessControl risorsa. L'esempio seguente mostra la sintassi del AWS CloudFormation modello, in formato YAML, per la creazione di un OAC.

Type: AWS::CloudFront::OriginAccessControl Properties: OriginAccessControlConfig: Description: An optional description for the origin access control Name: ExampleOAC OriginAccessControlOriginType: lambda SigningBehavior: always SigningProtocol: sigv4

Per ulteriori informazioni, vedere AWS::CloudFront::OriginAccessControl nella Guida per l'utente.AWS CloudFormation

CLI

Per creare un controllo di accesso all'origine con AWS Command Line Interface (AWS CLI), utilizzate il aws cloudfront create-origin-access-control comando. È possibile utilizzare un file di input per fornire i parametri di input del comando, anziché specificare ogni singolo parametro come input della riga di comando.

Per creare un controllo di accesso all'origine (CLI con file di input)
  1. Per creare un file denominato origin-access-control.yaml, utilizza il comando seguente. Tale file contiene tutti i parametri di input per il comando create-origin-access-control.

    aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml
  2. Aprire il file origin-access-control.yaml appena creato. Modifica il file per aggiungere un nome per l'OAC, una descrizione (opzionale) e modificare SigningBehavior in always. Quindi salvare il file.

    Per ulteriori informazioni sulle impostazioni OAC, consultare Impostazioni avanzate per il controllo dell'accesso all'origine.

  3. Utilizzare il comando seguente per creare il controllo di accesso origine utilizzando i parametri di input dal file origin-access-control.yaml.

    aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml

    Prendere nota del valore Id nell'output del comando. Ne hai bisogno per aggiungere l'OAC all'URL di una funzione Lambda in CloudFront una distribuzione.

Per collegare un OAC all'URL di una funzione Lambda in una distribuzione esistente (CLI con file di input)
  1. Usa il comando seguente per salvare la configurazione di distribuzione per la CloudFront distribuzione a cui desideri aggiungere l'OAC. La distribuzione deve avere un URL della funzione Lambda come origine.

    aws cloudfront get-distribution-config --id <CloudFront distribution ID> --output yaml > dist-config.yaml
  2. Aprire il file denominato dist-config.yaml appena creato. Modifica il file apportando le seguenti modifiche:

    • Nell'oggetto Origins, aggiungi l'ID dell'OAC al campo a cui è stato assegnato il nome OriginAccessControlId.

    • Rimuovi il valore dal campo denominato OriginAccessIdentity, se esiste.

    • Rinominare il campo ETag in IfMatch, ma non modificare il valore del campo.

    Salvare il file al termine.

  3. Utilizzare il comando seguente per aggiornare la distribuzione e utilizzare il controllo di accesso origine.

    aws cloudfront update-distribution --id <CloudFront distribution ID> --cli-input-yaml file://dist-config.yaml

La distribuzione inizia a essere distribuita in tutte le CloudFront edge location. Quando una edge location riceve la nuova configurazione, firma tutte le richieste inviate all'URL della funzione Lambda.

API

Per creare un OAC con l' CloudFront API, usa. CreateOriginAccessControl Per ulteriori informazioni sui campi specificati in questa chiamata API, consulta la documentazione di riferimento sull'API per il tuo AWS SDK o altro client API.

Dopo aver creato un OAC, puoi collegarlo all'URL di una funzione Lambda in una distribuzione, utilizzando una delle seguenti chiamate API:

Per entrambe queste chiamate API, fornisci l'ID OAC nel OriginAccessControlId campo, all'interno di un'origine. Per ulteriori informazioni sugli altri campi specificati in queste chiamate API, consulta la documentazione di riferimento sull'API per il tuo AWS SDK o altro client API.

Impostazioni avanzate per il controllo dell'accesso all'origine

La funzionalità CloudFront OAC include impostazioni avanzate destinate solo a casi d'uso specifici. Usa le impostazioni consigliate a meno che tu non abbia una necessità specifica per le impostazioni avanzate.

OAC contiene un'impostazione denominata Signing behavior (nella console) o SigningBehavior (nell'API, nella CLI e). AWS CloudFormation Questa impostazione offre le seguenti opzioni:

Firma sempre le richieste di origine (impostazione consigliata)

Si consiglia di utilizzare questa impostazione, denominata Richieste di firma (consigliata) nella console, oppure always nell'API, nell'interfaccia a riga di comando e AWS CloudFormation. Con questa impostazione, firma CloudFront sempre tutte le richieste inviate all'URL della funzione Lambda.

Non firmare le richieste di origine

Questa impostazione è denominata Non firmare le richieste nella console, oppure nevernell'API, nell'interfaccia a riga di comando e AWS CloudFormation. Usa questa impostazione per disattivare l'OAC per tutte le origini in tutte le distribuzioni che utilizzano questo OAC. Ciò consente di risparmiare tempo e fatica rispetto alla rimozione di un OAC da tutte le origini e le distribuzioni che lo utilizzano, una per una. Con questa impostazione, CloudFront non firma alcuna richiesta inviata all'URL della funzione Lambda.

avvertimento

Per utilizzare questa impostazione, l'URL della funzione Lambda deve essere accessibile pubblicamente. Se usi questa impostazione con un URL della funzione Lambda non accessibile pubblicamente, non CloudFront puoi accedere all'origine. L'URL della funzione Lambda restituisce gli errori CloudFront e li CloudFront trasmette ai visualizzatori. Per ulteriori informazioni, consulta il modello di sicurezza e autenticazione per la URLs funzione Lambda nella Guida per AWS Lambda l'utente.

Non ignorare l'intestazione del visualizzatore (client) Authorization

Questa impostazione è denominata Non sovrascrivere l'intestazione di autorizzazionenella console, oppure no-override nell'API, nell'interfaccia a riga di comando e AWS CloudFormation. Utilizzate questa impostazione quando desiderate firmare CloudFront le richieste di origine solo quando la richiesta del visualizzatore corrispondente non include un'Authorizationintestazione. Con questa impostazione, CloudFront trasmette l'Authorizationintestazione della richiesta del visualizzatore quando ne è presente una, ma firma la richiesta di origine (aggiungendo la propria Authorization intestazione) quando la richiesta del visualizzatore non include un'intestazione. Authorization

avvertimento
  • Se utilizzi questa impostazione, devi specificare la firma Signature Version 4 per l'URL della funzione Lambda anziché il nome o il CNAME della CloudFront distribuzione. Quando CloudFront inoltra l'Authorizationintestazione dalla richiesta del visualizzatore all'URL della funzione Lambda, Lambda convalida la firma rispetto all'host del dominio URL Lambda. Se la firma non è basata sul dominio URL Lambda, l'host nella firma non corrisponderà all'host utilizzato dall'origine dell'URL Lambda. Ciò significa che la richiesta avrà esito negativo, con conseguente errore di convalida della firma.

  • Per trasmettere l'Authorizationintestazione dalla richiesta del visualizzatore, è necessario aggiungere l'Authorizationintestazione a una politica di cache per tutti i comportamenti della cache che utilizzano la funzione Lambda URLs associata a questo controllo di accesso all'origine.

Codice modello di esempio

Se la tua CloudFront origine è l'URL di una funzione Lambda associata a un OAC, puoi usare il seguente script Python per caricare file nella funzione Lambda con il metodo. POST

Questo codice presuppone che tu abbia configurato l'OAC con il comportamento di firma predefinito impostato su Firma sempre le richieste di origine e che non sia stata selezionata l'impostazione dell'intestazione Do not override authorization.

Questa configurazione consente all'OAC di gestire correttamente l'autorizzazione SigV4 con Lambda utilizzando il nome host Lambda. Il payload viene firmato utilizzando SigV4 dall'identità IAM autorizzata per l'URL della funzione Lambda, che è designato come tipo. IAM_AUTH

Il modello dimostra come gestire i valori hash del payload firmati in x-amz-content-sha256 intestazione per le POST richieste dal lato client. In particolare, questo modello è progettato per gestire i payload dei dati dei moduli. Il modello consente il caricamento sicuro dei file su un URL CloudFront della funzione Lambda e AWS utilizza meccanismi di autenticazione per garantire che solo le richieste autorizzate possano accedere alla funzione Lambda.

Il codice include le seguenti funzionalità:
  • Soddisfa il requisito per l'inclusione dell'hash del payload nel x-amz-content-sha256 intestazione

  • Utilizza l'autenticazione SigV4 per un accesso sicuro Servizio AWS

  • Supporta il caricamento di file utilizzando dati di moduli composti da più parti

  • Include la gestione degli errori per le eccezioni delle richieste

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)