Utilizzo della crittografia a livello di campo per proteggere dati sensibili - 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à.

Utilizzo della crittografia a livello di campo per proteggere dati sensibili

Con Amazon CloudFront, puoi applicare end-to-end connessioni sicure ai server di origine utilizzando HTTPS. La crittografia a livello di campo aggiunge un ulteriore livello di sicurezza che consente di proteggere dati specifici durante l'elaborazione del sistema, di modo che solo alcune applicazioni possano visualizzarli.

La crittografia a livello di campo consente agli utenti di caricare in modo sicuro informazioni sensibili nel server Web. Le informazioni sensibili fornite dagli utenti sono crittografate a livello di edge, vicino all'utente e rimangono crittografate in tutto lo stack di applicazioni. Questa crittografia garantisce che solo le applicazioni che necessitano dei dati, e dispongono delle credenziali per decrittarli, siano in grado di farlo.

Per utilizzare la crittografia a livello di campo, quando configuri la CloudFront distribuzione, specifica il set di campi nelle richieste POST che desideri crittografare e la chiave pubblica da utilizzare per crittografarle. Puoi crittografare fino a 10 campi dati in una richiesta Non puoi crittografare tutti i dati in una richiesta con la crittografia a livello di campo; devi specificare singoli campi da crittografare.

Quando la richiesta HTTPS con crittografia a livello di campo viene inoltrata all'origine e la richiesta viene instradata al sottosistema o all'applicazione di origine, i dati sensibili sono ancora crittografati, riducendo il rischio di violazione o di perdita accidentale di dati sensibili. I componenti che richiedono l'accesso ai dati sensibili per ragioni commerciali, come un sistema di elaborazione dei pagamenti che richiede un numero di carta di credito, possono utilizzare la chiave privata appropriata per decrittografare i dati e accedervi.

Nota

Per utilizzare la crittografia a livello di campo, la tua origine deve supportare la codifica in blocchi.


				Crittografia a livello di campo in  CloudFront

CloudFront la crittografia a livello di campo utilizza la crittografia asimmetrica, nota anche come crittografia a chiave pubblica. Fornisci una chiave pubblica e tutti i dati sensibili che specifichi vengono crittografati automaticamente. CloudFront La chiave fornita CloudFront non può essere utilizzata per decrittografare i valori crittografati; solo la tua chiave privata può farlo.


				Crittografare unicamente dati sensibili

Panoramica della crittografia a livello di campo

Di seguito viene fornita una panoramica della configurazione della crittografia a livello di campo. Per informazioni su specifiche fasi, consulta Configurazione della crittografia a livello di campo.

  1. Ottieni una coppia chiave pubblica-chiave privata. Devi ottenere e aggiungere la chiave pubblica prima di iniziare la configurazione della crittografia a livello di campo in CloudFront.

  2. Crea un profilo di crittografia a livello di campo. I profili di crittografia a livello di campo, utilizzati dall'utente CloudFront, definiscono i campi da crittografare.

  3. Crea una configurazione di crittografia a livello di campo. Una configurazione specifica i profili da utilizzare, in base al tipo di contenuto della richiesta o a un argomento di query, per crittografare specifici campi dati. È inoltre possibile scegliere le opzioni di comportamento di inoltro richieste desiderate per diversi scenari. Ad esempio, è possibile impostare il comportamento in base al quale il nome del profilo specificato dall'argomento di interrogazione in un URL di richiesta non esiste in. CloudFront

  4. Crea un collegamento a un comportamento cache. Collega la configurazione a un comportamento cache per una distribuzione, in modo da specificare quando CloudFront deve crittografare i dati.

Configurazione della crittografia a livello di campo

Segui le fasi riportate di seguito per iniziare a utilizzare la crittografia a livello di campo. Per informazioni sulle quote (precedentemente note come limiti) relative alla crittografia a livello di campo, consulta Quote.

Fase 1: Creare una coppia di chiavi RSA

Per iniziare, è necessario creare una coppia di chiavi RSA che include una chiave pubblica e una chiave privata. La chiave pubblica consente di CloudFront crittografare i dati e la chiave privata consente ai componenti all'origine di decrittografare i campi che sono stati crittografati. Per creare una coppia di chiavi, puoi utilizzare OpenSSL o un altro strumento. La dimensione della chiave deve essere 2048 bit.

Ad esempio, se utilizzi OpenSSL, puoi utilizzare il seguente comando per generare una coppia di chiavi con una lunghezza di 2048 bit e salvarla nel file private_key.pem:

openssl genrsa -out private_key.pem 2048

Il file risultante contiene la chiave pubblica e quella privata. Per estrarre la chiave pubblica da quel file, esegui il seguente comando:

openssl rsa -pubout -in private_key.pem -out public_key.pem

Il file della chiave pubblica (public_key.pem) contiene il valore della chiave codificata che verrà incollato nella fase seguente.

Passaggio 2: aggiungi la tua chiave pubblica a CloudFront

Dopo aver ottenuto la coppia di chiavi RSA, aggiungi la tua chiave pubblica a CloudFront.

Per aggiungere la tua chiave pubblica a CloudFront (console)
  1. Accedi a AWS Management Console e apri la CloudFront console all'indirizzohttps://console.aws.amazon.com/cloudfront/v4/home.

  2. Nel riquadro di navigazione, scegli Public key (Chiave pubblica).

  3. Scegli Add public key (Aggiungi chiave pubblica).

  4. Per Key name (Nome chiave), digita un nome univoco per la chiave. Il nome non può contenere spazi e può includere solo caratteri alfanumerici, di sottolineatura (_) e trattini (-). Il numero massimo di caratteri è 128.

  5. Per Key value (Valore chiave), incollare il valore della chiave codificata per la chiave pubblica, incluse le righe -----BEGIN PUBLIC KEY----- e -----END PUBLIC KEY-----.

  6. Per Comment (Commento), aggiungi un commento facoltativo. Ad esempio, la data di scadenza della chiave pubblica.

  7. Scegliere Aggiungi.

È possibile aggiungere altre chiavi da utilizzare CloudFront ripetendo i passaggi della procedura.

Fase 3. Creazione di un profilo per la crittografia a livello di campo

Dopo aver aggiunto almeno una chiave pubblica CloudFront, create un profilo che indichi CloudFront quali campi crittografare.

Creazione di un profilo per la crittografia a livello di campo (console)
  1. Nel riquadro di navigazione, scegli Field-level encryption (Crittografia a livello di campo).

  2. Scegli Create profile (Crea profilo).

  3. Riempi i seguenti campi:

    Nome del profilo

    Digita un nome univoco per il profilo. Il nome non può contenere spazi e può includere solo caratteri alfanumerici, di sottolineatura (_) e trattini (-). Il numero massimo di caratteri è 128.

    Public key name (Nome chiave pubblica)

    Nell'elenco a discesa, scegli il nome di una chiave pubblica a cui hai aggiunto CloudFront nel passaggio 2. CloudFront utilizza la chiave per crittografare i campi specificati in questo profilo.

    Provider name (Nome provider)

    Digitare una descrizione che consenta di identificare la chiave, ad esempio il provider dove hai ottenuto la coppia di chiavi. Questa informazione, insieme alla chiave privata, è necessaria quando le applicazioni decrittano i campi di dati. Il nome di provider non può contenere spazi e può includere solo caratteri alfanumerici, due punti (:), caratteri di sottolineatura (_) e trattini (-). Il numero massimo di caratteri è 128.

    Field name pattern to match (Modello di nome di campo da abbinare)

    Digita i nomi di campi dati, oppure i modelli che identificano i nomi di campi dati nella richiesta, che CloudFront deve crittografare. Scegli l'opzione + per aggiungere tutti i campi che desideri crittografare con questa chiave.

    Per lo schema del nome del campo, puoi digitare il nome completo del campo dati, ad esempio DateOfBirth, o solo la prima parte del nome con un carattere jolly (*), ad esempio CreditCard *. Il modello di nome di campo deve includere solo caratteri alfanumerici, parentesi quadre ([ e ]), punti (.), caratteri di sottolineatura (_) e trattini (-), oltre al carattere jolly facoltativo (*).

    Assicurati di non utilizzare caratteri che si sovrappongono per diversi modelli di nome di campo. Ad esempio, se disponi di un modello di nome di campo ABC*, non puoi aggiungere un altro modello di nome di campo AB*. Inoltre, i nomi di campo fanno distinzione tra maiuscole e minuscole e il numero massimo di caratteri che puoi utilizzare è 128.

    Commento

    (Facoltativo) Digita un commento sul profilo. Il numero massimo di caratteri che puoi utilizzare è 128.

  4. Dopo che hai riempito i campi, scegli Create profile (Crea profilo).

  5. Se desideri aggiungere ulteriori profili, scegli Add profile (Aggiungi profilo).

Fase 4: Creazione di una configurazione

Dopo aver creato uno o più profili di crittografia a livello di campo, create una configurazione che specifichi il tipo di contenuto della richiesta che include i dati da crittografare, il profilo da utilizzare per la crittografia e altre opzioni che specificano come gestire la crittografia. CloudFront

Ad esempio, quando non è CloudFront possibile crittografare i dati, è possibile specificare se bloccare o CloudFront inoltrare una richiesta all'origine nei seguenti scenari:

  • Quando il tipo di contenuto di una richiesta non è in una configurazione: se non hai aggiunto un tipo di contenuto a una configurazione, puoi specificare se CloudFront inoltrare la richiesta con quel tipo di contenuto all'origine senza crittografare i campi di dati oppure bloccare la richiesta e restituire un errore.

    Nota

    Se aggiungi un tipo di contenuto a una configurazione ma non hai specificato un profilo da utilizzare con quel tipo, inoltra CloudFront sempre le richieste con quel tipo di contenuto all'origine.

  • Quando il nome di profilo fornito in un argomento di query è sconosciuto: quando specifichi l'argomento della fle-profile query con un nome di profilo che non esiste per la tua distribuzione, puoi CloudFront specificare se inviare la richiesta all'origine senza crittografare i campi di dati oppure bloccare la richiesta e restituire un errore.

In una configurazione, puoi anche specificare se fornire un profilo come argomento di query in un URL sostituisce un profilo che hai mappato al tipo di contenuto per quella query. Per impostazione predefinita, CloudFront utilizza il profilo che hai mappato a un tipo di contenuto, se ne specifichi uno. Ciò ti consente di avere un profilo che viene utilizzato per impostazione predefinita ma di decidere, per alcune richieste, di applicare un altro profilo.

Quindi, ad esempio, puoi specificare nella tua configurazione SampleProfile come il profilo di argomento di query da utilizzare. Quindi puoi utilizzare l'URL https://d1234.cloudfront.net?fle-profile=SampleProfile anzichéhttps://d1234.cloudfront.net, da CloudFront utilizzare SampleProfile per questa richiesta, anziché il profilo che configureresti per il tipo di contenuto della richiesta.

Puoi creare fino a 10 configurazioni per un singolo account e quindi associare una delle configurazioni al comportamento cache di qualsiasi distribuzione per l'account.

Creazione di una configurazione per la crittografia a livello di campo (console)
  1. Nella pagina Field-level encryption (Crittografia a livello di campo), scegli Create configuration (Crea configurazione).

    Nota: se non hai creato almeno un profilo, l'opzione per la creazione di una configurazione non sarà visualizzata.

  2. Riempi i campi riportati di seguito per specificare il profilo da utilizzare Alcuni campi non possono essere modificati.

    Content type (Tipo di contenuto) (non modificabile)

    Il tipo di contenuto è impostato su application/x-www-form-urlencoded e non può essere modificato.

    Default profile ID (ID profilo di default) (facoltativo)

    Nell'elenco a discesa, scegli il profilo che intendi mappare al tipo di contenuto nel campo Content type (Tipo di contenuto).

    Content format (Formato contenuto) (non modificabile)

    Il formato del contenuto è impostato su URLencoded e non può essere modificato.

  3. Se desideri modificare il comportamento CloudFront predefinito per le seguenti opzioni, seleziona la casella di controllo appropriata.

    Forward request to origin when request's content type is not configured (Inoltra richiesta all'origine quando il tipo di contenuto non è configurato)

    Seleziona la casella di controllo per consentire l'inoltro della richiesta all'origine se non hai specificato un profilo da utilizzare per il tipo di contenuto della richiesta.

    Override the profile for a content type with a provided query argument (Sovrascrivi il profilo per un tipo di contenuto con un argomento di query fornito)

    Seleziona la casella di controllo per consentire a un profilo fornito in un argomento di query di sovrascrivere il profilo che hai specificato per un tipo di contenuto.

  4. Se selezioni la casella di controllo per consentire a un argomento di query di sovrascrivere il profilo di default, devi riempire i seguenti campi aggiuntivi per la configurazione. Puoi creare fino a cinque di queste mappature di argomento di query da utilizzare con le query.

    Query argument (Argomento di query)

    Digita il valore che intendi includere negli URL per l'argomento di query fle-profile. Questo valore indica a CloudFront di utilizzare l'ID profilo (che specifichi nel campo successivo) associato a questo argomento di query per la crittografia a livello di campo di questa query.

    Il numero massimo di caratteri che puoi utilizzare è 128. Questo valore non può contenere spazi e deve utilizzare solo caratteri alfanumerici o i seguenti caratteri: trattini (-), punti (.), caratteri di sottolineatura (_), asterischi (*), segni più (+), percentuali (%).

    Profile ID (ID profilo)

    Nell'elenco a discesa, scegli il profilo da associare al valore che hai digitato per Query argument (Argomento di query).

    Forward request to origin when the profile specified in a query argument does not exist (Inoltra richiesta all'origine quando il profilo specificato in un argomento di query non esiste)

    Seleziona la casella di controllo per consentire l'inoltro della richiesta all'origine se il profilo specificato in un argomento di query non è definito in CloudFront.

Fase 5. Aggiunta di una configurazione a un comportamento cache

Per utilizzare la crittografia a livello di campo, collega una configurazione a un comportamento cache per una distribuzione aggiungendo l'ID configurazione come valore per la distribuzione.

Importante

Per collegare una configurazione di crittografia a livello di campo a un comportamento della cache, la distribuzione deve essere configurata per utilizzare sempre HTTPS e per accettare HTTP e richieste POST e PUT dai visualizzatori. Deve essere vera una delle condizioni seguenti:

  • Viewer Protocol Policy (Policy protocollo visualizzatore) del comportamento della cache deve essere impostato su Redirect HTTP to HTTPS (Reindirizza HTTP a HTTPS) o su HTTPS Only (Solo HTTPS). (In AWS CloudFormation o nell' CloudFront API, ViewerProtocolPolicy deve essere impostato su redirect-to-https ohttps-only.)

  • Il valore Allowed HTTP Methods (Metodi HTTP consentiti) del comportamento della cache deve essere impostato su GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE. (In AWS CloudFormation o l' CloudFront API, AllowedMethods deve essere impostato su GETHEAD,OPTIONS,PUT,POST,PATCH,DELETE. Questi possono essere specificati in qualsiasi ordine.)

  • Origin Protocol Policy (Policy protocollo origine) delle impostazioni dell'origine deve essere impostato su Match Viewer (Corrispondenza visualizzatore) o HTTPS Only (Solo HTTPS). (In AWS CloudFormation o nell' CloudFront API, OriginProtocolPolicy deve essere impostato su match-viewer ohttps-only.)

Per ulteriori informazioni, consulta Valori da specificare durante la creazione o l'aggiornamento di una distribuzione.

Decrittografia di campi dati nell'origine

CloudFront crittografa i campi di dati utilizzando. AWS Encryption SDK I dati rimangono crittografati nell'intero stack di applicazioni e sono accessibili solo alle applicazioni che dispongono delle credenziali per decrittografarli.

Dopo la crittografia, il testo cifrato è codificato in base64. Quando le applicazioni eseguono la decrittazione del testo nell'origine, devono prima decodificarlo e quindi utilizzare il kit SDK di crittografia AWS per decrittare i dati.

Il codice di esempio che segue illustra il modo in cui le applicazioni possono decrittare i dati nell'origine. Tieni presente quanto segue:

  • Per semplificare l'esempio, le chiavi private e pubbliche (in formato DER) vengono caricate dai file nella directory di lavoro. In pratica, devi archiviare la chiave privata in una posizione offline protetta, ad esempio un modulo di protezione hardware offline, e distribuire la chiave pubblica al team di sviluppo.

  • CloudFront utilizza informazioni specifiche durante la crittografia dei dati e lo stesso set di parametri deve essere utilizzato all'origine per decrittografarli. I parametri CloudFront utilizzati durante l'inizializzazione includono quanto segue: MasterKey

    • PROVIDER_NAME: hai specificato questo valore quando hai creato un profilo di crittografia a livello di campo. Utilizza lo stesso valore qui.

    • KEY_NAME: hai creato un nome per la tua chiave pubblica quando l'hai caricata su CloudFront, quindi hai specificato il nome della chiave nel profilo. Utilizza lo stesso valore qui.

    • ALGORITMO: CloudFront utilizza RSA/ECB/OAEPWithSHA-256AndMGF1Padding come algoritmo per la crittografia, quindi è necessario utilizzare lo stesso algoritmo per decrittografare i dati.

  • Se esegui il codice di esempio riportato di seguito con il testo cifrato come input, i dati decrittati vengono inviati alla console. Per ulteriori informazioni, consulta il codice di esempio Java nel kit SDK di crittografia AWS.

Codice di esempio

import java.nio.file.Files; import java.nio.file.Paths; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import org.apache.commons.codec.binary.Base64; import com.amazonaws.encryptionsdk.AwsCrypto; import com.amazonaws.encryptionsdk.CryptoResult; import com.amazonaws.encryptionsdk.jce.JceMasterKey; /** * Sample example of decrypting data that has been encrypted by CloudFront field-level encryption. */ public class DecryptExample { private static final String PRIVATE_KEY_FILENAME = "private_key.der"; private static final String PUBLIC_KEY_FILENAME = "public_key.der"; private static PublicKey publicKey; private static PrivateKey privateKey; // CloudFront uses the following values to encrypt data, and your origin must use same values to decrypt it. // In your own code, for PROVIDER_NAME, use the provider name that you specified when you created your field-level // encryption profile. This sample uses 'DEMO' for the value. private static final String PROVIDER_NAME = "DEMO"; // In your own code, use the key name that you specified when you added your public key to CloudFront. This sample // uses 'DEMOKEY' for the key name. private static final String KEY_NAME = "DEMOKEY"; // CloudFront uses this algorithm when encrypting data. private static final String ALGORITHM = "RSA/ECB/OAEPWithSHA-256AndMGF1Padding"; public static void main(final String[] args) throws Exception { final String dataToDecrypt = args[0]; // This sample uses files to get public and private keys. // In practice, you should distribute the public key and save the private key in secure storage. populateKeyPair(); System.out.println(decrypt(debase64(dataToDecrypt))); } private static String decrypt(final byte[] bytesToDecrypt) throws Exception { // You can decrypt the stream only by using the private key. // 1. Instantiate the SDK final AwsCrypto crypto = new AwsCrypto(); // 2. Instantiate a JCE master key final JceMasterKey masterKey = JceMasterKey.getInstance( publicKey, privateKey, PROVIDER_NAME, KEY_NAME, ALGORITHM); // 3. Decrypt the data final CryptoResult <byte[], ? > result = crypto.decryptData(masterKey, bytesToDecrypt); return new String(result.getResult()); } // Function to decode base64 cipher text. private static byte[] debase64(final String value) { return Base64.decodeBase64(value.getBytes()); } private static void populateKeyPair() throws Exception { final byte[] PublicKeyBytes = Files.readAllBytes(Paths.get(PUBLIC_KEY_FILENAME)); final byte[] privateKeyBytes = Files.readAllBytes(Paths.get(PRIVATE_KEY_FILENAME)); publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(PublicKeyBytes)); privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes)); } }