Firme

Le firme sono un metodo per autenticare le richieste inviate all' API XML di Cloud Storage. Le firme vengono utilizzate, ad esempio, quando si lavora con URL firmati o moduli HTML. Questa pagina si applica alle firme create utilizzando il processo di firma V4, che è il processo consigliato per la creazione delle firme.

Le firme sono specifiche dell'API XML di Cloud Storage e sono distinte dai token OAuth 2.0. I token OAuth 2.0 possono essere utilizzati anche con l'API XML e sono più generalmente applicabili ai Google Cloud servizi, inclusa l' API JSON di Cloud Storage.

Panoramica

Le firme forniscono sia l'identità sia l'autenticazione avanzata, il che garantisce che le richieste a Cloud Storage vengano elaborate utilizzando l'autorità di un account specifico. Le firme eseguono l'autenticazione senza rivelare le informazioni sensibili della chiave, chiamate segreti o chiavi private, associate a quell'account.

Quando effettui una richiesta con una firma, Cloud Storage utilizza la sua copia delle informazioni della chiave per calcolare una firma equivalente per la richiesta. Se la firma inclusa nella richiesta corrisponde a quella calcolata da Cloud Storage, Cloud Storage sa che la firma è stata creata utilizzando la chiave segreta o privata pertinente.

In Cloud Storage, le firme devono essere utilizzate quando si lavora con:

Inoltre, le firme possono essere utilizzate nell'Authorizationintestazione delle richieste dell'API XML.

L'utilizzo delle firme nelle richieste dirette è utile quando si eseguono migrazioni semplici da Amazon S3. Tuttavia, il flusso di autenticazione consigliato per le richieste dirette è l'utilizzo dei token OAuth 2.0.

Struttura

I componenti e il processo per la creazione di una firma dipendono dall'utilizzo e dalla chiave di autenticazione con cui stai lavorando. In generale, una firma è composta da due componenti: la chiave di firma e le informazioni della richiesta. Applica un algoritmo di firma a questi due componenti per creare la firma. La tabella seguente riassume i diversi casi d'uso delle firme e i componenti necessari in ogni caso per creare la firma:

Caso d'uso Chiave di firma Informazioni della richiesta
Modulo HTML con una chiave RSA Utilizza direttamente la chiave privata RSA Documento di criteri codificato in base64
Modulo HTML con una chiave HMAC Deriva dal segreto della chiave HMAC Documento di criteri codificato in base64
URL firmato o intestazione firmata con una chiave RSA Utilizza direttamente la chiave privata RSA Stringa da firmare
URL firmato o intestazione firmata con una chiave HMAC Deriva dal segreto della chiave HMAC Stringa da firmare

Stringa da firmare

Una stringa da firmare include i metadati della richiesta e un hash di la richiesta canonica che vuoi firmare.

Struttura

Una stringa da firmare deve essere codificata in UTF-8 e ha la seguente struttura, incluso l'utilizzo di nuove righe tra ogni elemento:

SIGNING_ALGORITHM
ACTIVE_DATETIME
CREDENTIAL_SCOPE
HASHED_CANONICAL_REQUEST

Algoritmo di firma

Il valore utilizzato per SIGNING_ALGORITHM dipende dal tipo di chiave utilizzata e dalle estensioni utilizzate per le intestazioni o parametri di ricerca:

Caso d'uso Valore per SIGNING_ALGORITHM
Estensioni x-goog-* e una chiave RSA GOOG4-RSA-SHA256
Estensioni x-goog-* e una chiave HMAC GOOG4-HMAC-SHA256
Estensioni x-amz-* e una chiave HMAC AWS4-HMAC-SHA256

Data e ora attuali

La data e l'ora in cui la firma può essere utilizzata, nel formato base YYYYMMDD'T'HHMMSS'Z' ISO 8601.

  • Per gli URL firmati, la firma è utilizzabile da 15 minuti prima della data e dell'ora attuali fino all'ora di scadenza specificata. La data e l'ora attuali devono corrispondere a l parametro della stringa di query X-Goog-Date dell'URL firmato e devono utilizzare lo stesso giorno specificato nell'ambito delle credenziali.

  • Per le richieste con intestazioni firmate, la firma è utilizzabile da 15 minuti prima della data e dell'ora attuali fino a 15 minuti dopo la data e l'ora attuali. La data e l'ora attuali devono corrispondere all'intestazione x-goog-date della richiesta che utilizza la firma e devono utilizzare lo stesso giorno specificato nell'ambito delle credenziali.

Ambito delle credenziali

L'ambito delle credenziali per la richiesta.

Hash della richiesta canonica

L'hash SHA-256 con codifica esadecimale di una richiesta canonica. Utilizza una funzione hash SHA-256 per creare un valore hash della richiesta canonica. Il linguaggio di programmazione deve avere una libreria per la creazione di hash SHA-256. Un valore hash di esempio ha il seguente aspetto:

436b7ce722d03b17d3f790255dd57904f7ed61c02ac5127a0ca8063877e4e42c

Esempio

Di seguito è riportato un esempio di stringa da firmare formattata correttamente, con le nuove righe visualizzate come nuove righe effettive e non come \n:

GOOG4-RSA-SHA256
20191201T190859Z
20191201/us-central1/storage/goog4_request
54f3076005db23fbecdb409d25c0ccb9fb8b5e24c59f12634654c0be13459af0

Documento di criteri

Un documento di criteri definisce ciò che gli utenti con accesso al corrispondente modulo HTML possono caricare in Cloud Storage. Un documento di criteri fornisce l'autorizzazione per garantire che il modulo HTML possa caricare i file nel bucket di destinazione. Puoi utilizzare i documenti di criteri per consentire ai visitatori di un sito web di caricare file in Cloud Storage.

Un documento di criteri viene creato in formato JSON (JavaScript Object Notation). Il documento di criteri deve essere codificato sia in UTF-8 sia in base64. Un documento di criteri contiene le seguenti sezioni:

Voce Descrizione
expiration L'ora di scadenza del documento di criteri, nel formato base ISO 8601 YYYYMMDD'T'HHMMSS'Z'. Un documento di criteri scaduto causa l'interruzione del modulo HTML.
conditions Un array di condizioni che ogni caricamento deve soddisfare.

La sezione conditions deve includere:

  • Un'istruzione di condizione per ogni campo utilizzato nel modulo HTML, ad eccezione dei campi x-goog-signature, file, e policy.

  • Un'istruzione di condizione "bucket", anche se non utilizzi il campo del bucket nel modulo HTML.

Se vuoi utilizzare più istruzioni di condizione per lo stesso campo, devi creare un modulo HTML separato per ognuna. Nelle istruzioni di condizione possono essere utilizzati tre tipi di condizioni:

  • Corrispondenza esatta

    Esegue la corrispondenza esatta per un campo. Il valore utilizzato nel campo specificato del modulo HTML deve corrispondere al valore impostato in questa condizione. Imposta questa condizione utilizzando uno dei seguenti stili di sintassi:

    {"field" : "value"}
    ["eq", "$field", "value"]

    Tutti i campi dei moduli HTML validi, ad eccezione di Content-Length, possono utilizzare la corrispondenza esatta.

  • Inizia con

    Se il valore di un campo deve iniziare con un determinato prefisso, utilizza la condizione starts-with con la seguente sintassi:

    ["starts-with", "$field", "value"]

    Se il valore di un campo non ha restrizioni, utilizza la condizione starts-with con la seguente sintassi:

    ["starts-with", "$field", ""]

    Tutti i campi dei moduli HTML validi, ad eccezione di Content-Length, possono utilizzare la condizione starts-with.

  • Intervallo di lunghezza dei contenuti

    Specifica un intervallo di valori accettabili che possono essere utilizzati nel campo Content-Length. Specifica questa condizione utilizzando la seguente sintassi:

    ["content-length-range", min_range, max_range]

Esempio

Di seguito è riportato un esempio di documento di criteri:

{"expiration": "2020-06-16T11:11:11Z",
 "conditions": [
  ["starts-with", "$key", ""],
  {"bucket": "travel-maps"},
  {"success_action_redirect": "http://www.example.com/success_notification.html"},
  ["eq", "$Content-Type", "image/jpeg"],
  ["content-length-range", 0, 1000000],
  {"x-goog-algorithm": "GOOG4-RSA-SHA256"},
  {"x-goog-credential": "example_account@example_project.iam.gserviceaccount.com/20191102/us-central1/storage/goog4_request"},
  {"x-goog-date": "20191102T043530Z"}
  ]
}

Questo documento di criteri definisce le seguenti condizioni:

  • Il modulo scade il 16 giugno 2020 alle 11:11:11 UTC.
  • Il nome del file può iniziare con qualsiasi carattere valido.
  • Il file deve essere caricato nel bucket travel-maps.
  • Se il caricamento va a buon fine, l'utente viene reindirizzato a http://www.example.com/success_notification.html.
  • Il modulo consente di caricare solo immagini.
  • Un utente non può caricare un file di dimensioni superiori a 1 MB.

Ambito delle credenziali

L'ambito delle credenziali è una stringa che viene visualizzata sia nelle stringhe da firmare sia nei documenti di criteri. L'ambito delle credenziali ha la seguente struttura:

DATE/LOCATION/SERVICE/REQUEST_TYPE

L'ambito delle credenziali ha i seguenti componenti:

  • DATE: la data in cui la firma diventa utilizzabile, nel formato AAAAMMGG.
  • LOCATION: per le risorse di Cloud Storage, puoi utilizzare qualsiasi valore per LOCATION. Il valore consigliato da utilizzare è la località associata alla risorsa a cui si applica la firma. Ad esempio, us-central1. Questo parametro esiste per mantenere la compatibilità con Amazon S3.
  • SERVICE: il nome del servizio. Nella maggior parte dei casi, quando si accede alle risorse di Cloud Storage, questo valore è storage. Quando si utilizzano le estensioni x-amz di Amazon S3, questo valore è s3.
  • REQUEST_TYPE: il tipo di richiesta. Nella maggior parte dei casi, quando si accede alle risorse di Cloud Storage, questo valore è goog4_request. Quando si utilizzano le estensioni x-amz di Amazon S3, questo valore è aws4_request.

Ad esempio, un ambito delle credenziali tipico ha il seguente aspetto:

20191102/us-central1/storage/goog4_request

Mentre un ambito delle credenziali quando si utilizza una stringa da firmare con le estensioni x-amz ha il seguente aspetto:

20150830/us-east1/s3/aws4_request

Firma

Per creare una firma, utilizza un algoritmo di firma, noto anche come funzione hash crittografica, per firmare la stringa da firmare o il documento di criteri. L' algoritmo di firma produce un digest del messaggio, che deve essere codificato in formato esadecimale per creare la firma finale. L'algoritmo di firma utilizzato dipende dal tipo di chiave di autenticazione in tuo possesso:

Chiave di autenticazione Algoritmo di firma Chiave di firma
Chiave RSA RSA-SHA256 Utilizza direttamente la chiave privata RSA
Chiave HMAC HMAC-SHA256 Deriva dal segreto della chiave HMAC

L'algoritmo di firma RSA-SHA256 può essere eseguito utilizzando il metodo signBlob di IAM. Strumenti come la gcloud CLI e la maggior parte delle Google Cloud librerie client consentono di creare URL firmatiutilizzando il metodo signBlob.

Puoi anche creare firme di chiave RSA localmente utilizzando un linguaggio di programmazione che dispone di una libreria per l'esecuzione di firme RSA, come la libreria pyopenssl. Tuttavia, questo metodo è sconsigliato perché richiede la creazione e il download della chiave privata di un account di servizio.

Derivare la chiave di firma dalla chiave HMAC

Quando firmi con una chiave HMAC, devi creare una chiave di firma con codifica UTF-8 derivata dal segreto della chiave HMAC. La chiave derivata è specifica per la data, la località, il servizio e il tipo di richiesta associati alla richiesta. Lo pseudo-codice seguente mostra come derivare la chiave di firma:

key_date = HMAC-SHA256("PREFIX" + HMAC_KEY_SECRET, "DATE")
key_region = HMAC-SHA256(key_date, "LOCATION")
key_service = HMAC-SHA256(key_region, "SERVICE")
signing_key = HMAC-SHA256(key_service, "REQUEST_TYPE")

Lo pseudo-codice ha i seguenti componenti:

  • PREFIX: nella maggior parte dei casi, quando si accede alle risorse di Cloud Storage risorse, questo valore è GOOG4. Quando si utilizzano le estensioni x-amz di Amazon S3, questo valore è AWS4.
  • HMAC_KEY_SECRET: il segreto della chiave HMAC che utilizzi per effettuare e firmare la richiesta.
  • DATE, LOCATION, SERVICE, REQUEST_TYPE: questi valori devono corrispondere ai valori specificati nell' ambito delle credenziali.

Una volta derivata la chiave di firma, crea la firma localmente utilizzando un linguaggio di programmazione che include una libreria con l'algoritmo di firma HMAC-SHA256.

Dopo la firma

Per completare la firma, l'output della firma, chiamato digest del messaggio , deve essere codificato in formato esadecimale.

Esempio

Di seguito è riportato lo pseudo-codice per la firma di un documento di criteri:

EncodedPolicy = Base64Encode(PolicyDocument)
MessageDigest = SigningAlgorithm(SigningKey, EncodedPolicy)
Signature = HexEncode(MessageDigest)

Di seguito è riportato lo pseudo-codice per la firma di una stringa da firmare:

MessageDigest = SigningAlgorithm(SigningKey, StringToSign)
Signature = HexEncode(MessageDigest)

Passaggi successivi