Firma delle immagini delle funzioni e applicazione dell'uso delle immagini firmate dal registro

Scopri come firmare le immagini delle funzioni e come applicare l'uso delle immagini firmate da Oracle Cloud Infrastructure Registry durante la distribuzione durante la distribuzione e il richiamo delle funzioni utilizzando OCI Functions.

Per motivi di conformità e sicurezza, gli amministratori di sistema spesso desiderano distribuire il software in un sistema di produzione solo quando sono soddisfatti che:

  • Il software proviene da una fonte attendibile
  • il software non è stato modificato da quando è stato pubblicato, compromettendo la sua integrità

Per soddisfare questi requisiti, puoi firmare le immagini memorizzate in Oracle Cloud Infrastructure Registry. Le immagini firmate forniscono un modo per verificare sia la fonte di un'immagine che la sua integrità. Oracle Cloud Infrastructure Registry consente agli utenti o ai sistemi di eseguire il push delle immagini nel registro e di firmarle creando una firma immagine. Una firma immagine associa un'immagine a una chiave di cifratura master ottenuta da Oracle Cloud Infrastructure Vault.

Gli utenti o i sistemi che estraggono un'immagine firmata da Oracle Cloud Infrastructure Registry possono essere sicuri che l'origine dell'immagine sia affidabile e che l'integrità dell'immagine non sia stata compromessa. Per ulteriori informazioni, vedere Firma di immagini per la sicurezza.

Per migliorare ulteriormente la sicurezza, è possibile configurare le applicazioni OCI Functions in modo che consentano solo la creazione, l'aggiornamento, la distribuzione e il richiamo di funzioni basate sulle immagini in Oracle Cloud Infrastructure Registry firmate da specifiche chiavi di cifratura master. Ad alto livello, questi sono i passi da seguire:

  • Ottieni le chiavi di cifratura master da Oracle Cloud Infrastructure Vault da utilizzare per firmare le immagini che vengono sottoposte a push e estratte da Oracle Cloud Infrastructure Registry durante la creazione, l'aggiornamento, la distribuzione e il richiamo delle funzioni.
  • Creare un criterio di verifica della firma dell'immagine per l'applicazione. Il criterio di verifica della firma definisce la chiave di cifratura master che deve essere utilizzata per firmare le immagini sottoposte a push e estratte da Oracle Cloud Infrastructure Registry quando si creano, aggiornano, distribuiscono e richiamano funzioni nell'applicazione.
  • Quando si utilizza il comando fn deploy per distribuire le funzioni in un'applicazione che dispone di un criterio di verifica della firma, specificare la chiave di cifratura master dal criterio di verifica della firma nel file func.yaml della funzione. Quando si esegue il push dell'immagine della funzione in Oracle Cloud Infrastructure Registry utilizzando l'interfaccia CLI di Fn Project, l'interfaccia CLI di Fn Project firma l'immagine con la chiave di cifratura master. Vedere Utilizzo dell'interfaccia CLI di Fn Project per firmare un'immagine di funzione per la distribuzione in un'applicazione con un criterio di verifica della firma.
  • Quando si utilizza la console o il comando fn create function per creare una nuova funzione in un'applicazione con un criterio di verifica della firma, basare la funzione su un'immagine Docker esistente firmata da una chiave di cifratura master nel criterio. Vedere Creazione di funzioni da immagini Docker esistenti. In modo analogo, durante l'aggiornamento di una funzione, la funzione deve essere sempre basata su un'immagine esistente firmata da una chiave di cifratura principale nel criterio (vedere Aggiornamento di una funzione). Per scoprire come firmare le immagini in Oracle Cloud Infrastructure Registry, consulta la sezione Firma di immagini per la sicurezza.

È possibile richiamare una funzione in un'applicazione che dispone di un criterio di verifica della firma esattamente nello stesso modo delle funzioni in altre applicazioni. Quando viene richiamata la funzione, OCI Functions verifica innanzitutto che l'immagine della funzione in Oracle Cloud Infrastructure Registry sia stata firmata con la chiave di cifratura specificata nel criterio di verifica della firma dell'applicazione. Se la verifica della chiave di cifratura riesce, OCI Functions estrae l'immagine da Oracle Cloud Infrastructure Registry e richiama la funzione. Se la verifica della chiave di cifratura non riesce, il codice e il messaggio di errore (status 502: message: FunctionImageVerificationFail: Image cannot be verified or no valid signature found) sono i seguenti:

  • restituito al chiamante
  • mostrato nel grafico Errori funzione della pagina Metriche nella console
  • mostrato nell'intervallo di richiamo predefinito nella pagina Tracce della console (quando il trace delle funzioni è abilitato)

Tenere presente quanto riportato di seguito.

  • È possibile includere fino a cinque funzioni in un'applicazione per la quale si definisce un criterio di verifica della firma. Non è possibile aggiungere una sesta funzione a tale applicazione. Si noti inoltre che non è possibile definire un criterio di verifica della firma per un'applicazione esistente che contiene già sei o più funzioni.
  • Prima di creare un criterio di verifica della firma per un'applicazione esistente, assicurarsi che tutte le funzioni esistenti nell'applicazione siano basate su immagini già firmate dalla chiave di cifratura principale che si intende specificare nel criterio. In caso contrario, non sarà possibile creare il criterio di verifica della firma.
  • Un'immagine in Oracle Cloud Infrastructure Registry può essere firmata utilizzando più firme, ciascuna associata a una chiave di cifratura master diversa. Se il criterio di verifica della firma di un'applicazione include una delle chiavi di cifratura master, l'applicazione consente di estrarre l'immagine da Oracle Cloud Infrastructure Registry.
  • Se si abilita un'applicazione a utilizzare il proprio criterio di verifica della firma, ma OCI Functions non è in grado di connettersi a Oracle Cloud Infrastructure Registry, non è possibile estrarre alcuna immagine da Oracle Cloud Infrastructure Registry.

Criteri IAM obbligatori per l'applicazione dell'uso delle immagini firmate

Per applicare un criterio di verifica della firma, è necessario che le funzioni OCI siano state concesse:

  • accesso per verificare le chiavi di cifratura master in Oracle Cloud Infrastructure Vault con un criterio simile al seguente:
    Allow service faas to {KEY_READ} in compartment <compartment-name> where request.operation = 'GetKeyVersion'
    Allow service faas to {KEY_VERIFY} in compartment <compartment-name> where request.operation = 'Verify'
  • accesso alle immagini in Oracle Cloud Infrastructure Registry con una policy come:
    Allow service faas to read repos in tenancy where request.operation='ListContainerImageSignatures'

Per creare un criterio di verifica della firma, è necessario disporre dei seguenti privilegi:

  • accesso alle chiavi di cifratura master in Oracle Cloud Infrastructure Vault con un criterio simile al seguente:
    Allow group <groupname> to read vaults in compartment <compartment-name>
    Allow group <groupname> to use keys in compartment <compartment-name> 
    
  • accesso alle immagini in Oracle Cloud Infrastructure Registry con una policy come:
    Allow group <groupname> to read repos in tenancy

È possibile limitare le chiavi di cifratura principali che possono essere utilizzate per la firma dell'immagine della funzione e la verifica della firma utilizzando criteri più restrittivi (ad esempio, vedere Istruzioni dei criteri per fornire il servizio OCI Functions e l'accesso degli utenti OCI Functions alle risorse Oracle Vault).

Come ottenere le chiavi di cifratura con cui firmare le immagini delle funzioni (se non esistono già)

Per ottenere la chiave di cifratura master da includere nei criteri di verifica della firma di un'applicazione e specificare quando si distribuisce una funzione nell'applicazione, effettuare le operazioni riportate di seguito.

  1. Se non si dispone già dell'accesso a una chiave asimmetrica RSA o ECDSA in Oracle Cloud Infrastructure Vault, è possibile ottenere l'accesso a una chiave asimmetrica RSA o ECDSA esistente oppure creare una nuova chiave di cifratura master come chiave asimmetrica RSA o ECDSA (vedere Creazione di una chiave di cifratura master).

    Si noti che l'uso di chiavi simmetriche AES per firmare le immagini non è supportato. Per ulteriori informazioni sui diversi tipi di chiave, vedere Panoramica del vault.

  2. Prendere nota sia dell'OCID della chiave di cifratura master che dell'OCID della versione della chiave memorizzata in Oracle Cloud Infrastructure Vault. Vedere Lista delle chiavi di cifratura principali.

    Questi OCID vengono utilizzati durante la distribuzione della funzione.

Creazione di un criterio di verifica della firma per un'applicazione

Per definire un criterio di verifica della firma per un'applicazione e specificare una chiave di cifratura master che può essere utilizzata per firmare le immagini, effettuare le operazioni riportate di seguito.

  1. Nella pagina di elenco Applicazioni selezionare l'applicazione per la quale si desidera definire un criterio di verifica della firma. Per informazioni su come trovare la pagina di elenco o l'applicazione, vedere Elenco di applicazioni.
  2. In Risorse, selezionare Verifica firma.
  3. Selezionare Gestisci verifica firma.
  4. Selezionare Abilita i criteri di verifica della firma per questa applicazione per consentire all'applicazione di utilizzare i criteri di verifica della firma definiti.

    Se un criterio per concedere l'accesso a Oracle Cloud Infrastructure Registry alle funzioni OCI non esiste già, viene richiesto di creare un criterio di questo tipo. Se si è amministratori, creare il criterio. In caso contrario, chiedere all'amministratore di creare automaticamente il criterio. Vedere Criteri IAM obbligatori per l'applicazione dell'uso delle immagini firmate.

  5. Selezionare una chiave di cifratura master in Oracle Cloud Infrastructure Vault che deve essere stata utilizzata per firmare le immagini.

    Se i criteri per concedere l'accesso a OCI Functions alla chiave di cifratura master in Oracle Cloud Infrastructure Vault non esistono già, viene richiesto di creare tali criteri. Gli amministratori possono creare i criteri. In caso contrario, chiedere all'amministratore di creare automaticamente i criteri. Vedere Criteri IAM obbligatori per l'applicazione dell'uso delle immagini firmate.

    Le funzioni esistenti nell'applicazione devono essere basate su immagini già firmate dalla chiave di cifratura master selezionata. In caso contrario, non sarà possibile creare il criterio di verifica della firma.

  6. Selezionare Salva modifiche.

Da ora in poi:

  • Quando si distribuisce una funzione in questa applicazione (ad esempio, utilizzando il comando fn deploy), è necessario impostare le opzioni di firma delle immagini. Queste opzioni identificano la chiave di cifratura master nel criterio di verifica della firma dell'applicazione, incluso l'OCID della chiave di cifratura master. Supponendo di specificare una chiave di cifratura master valida, l'immagine viene sottoposta a PUSH su Oracle Cloud Infrastructure Registry e firmata con la chiave di cifratura.
  • Quando si crea una nuova funzione (o si aggiorna una funzione esistente) in questa applicazione utilizzando la console o l'interfaccia CLI di Fn Project, è necessario specificare un'immagine esistente firmata utilizzando la chiave di cifratura master nel criterio di verifica della firma dell'applicazione.
  • Quando viene richiamata una funzione in questa applicazione, OCI Functions verifica prima l'immagine in Oracle Cloud Infrastructure Registry. OCI Functions estrae l'immagine da Oracle Cloud Infrastructure Registry e richiama la funzione solo se la verifica della chiave di cifratura riesce.

Utilizzo dell'interfaccia CLI di Fn Project per firmare un'immagine di funzione per la distribuzione in un'applicazione con un criterio di verifica della firma

È possibile utilizzare il comando CLI di Fn Project fn deploy per distribuire una funzione in un'applicazione che dispone di un criterio di verifica della firma specificando la chiave di cifratura master dal criterio di verifica della firma nel file func.yaml della funzione. L'immagine della funzione viene quindi firmata durante la distribuzione.

Per utilizzare l'interfaccia CLI di Fn Project per distribuire una funzione basata su un'immagine di funzione firmata in un'applicazione con un criterio di verifica della firma abilitato, effettuare le operazioni riportate di seguito.

  1. Attenersi alla procedura descritta in Creazione e distribuzione delle funzioni per creare una funzione utilizzando il comando fn init, ma non utilizzare immediatamente il comando fn -v deploy. In alternativa, seguire le istruzioni riportate di seguito per aggiungere i dettagli di firma dell'immagine al file func.yaml della funzione, quindi utilizzare il comando fn -v deploy.

  2. Dopo aver utilizzato il comando fn init per inizializzare la funzione, passare alla directory appena creata contenente il file func.yaml della funzione.
  3. Modificare il file func.yaml della funzione e aggiungere la sezione seguente:
    signing_details:
        image_compartment_id: <root-compartment-ocid>
        kms_key_id: <key-ocid>
        kms_key_version_id: <key-version-ocid>
        signing_algorithm: <signing-algorithm>

    Dove:

    • image_compartment_id: <root-compartment-ocid> è l'OCID del compartimento radice della tenancy che possiede il repository in Oracle Cloud Infrastructure Registry al quale si sta per eseguire il PUSH dell'immagine della funzione. Ad esempio, image_compartment_id: ocid1.tenancy.oc1..aaaaaaaa___ta.
    • kms-key-id: <key-ocid> è l'OCID della chiave di cifratura master da utilizzare per firmare l'immagine. Poiché verrà distribuita una funzione basata su questa immagine in un'applicazione con un criterio di verifica della firma abilitato, è necessario specificare l'OCID di una chiave di cifratura master inclusa nel criterio di verifica della firma (vedere Creazione di un criterio di verifica della firma per un'applicazione). Ad esempio, kms-key-id: ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj
    • kms-key-version-id: <key-version-ocid> è l'OCID della versione della chiave da utilizzare per firmare l'immagine. Ad esempio, kms-key-version-id: ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb
    • signing-algorithm: <signing-algorithm> è uno dei seguenti algoritmi da utilizzare per firmare l'immagine:

      • SHA_224_RSA_PKCS_PSS
      • SHA_256_RSA_PKCS_PSS
      • SHA_384_RSA_PKCS_PSS
      • SHA_512_RSA_PKCS_PSS
      • SHA_224_RSA_PKCS1_V1_5
      • SHA_256_RSA_PKCS1_V1_5
      • SHA_384_RSA_PKCS1_V1_5
      • SHA_512_RSA_PKCS1_V1_5
      • ECDSA_SHA_256
      • ECDSA_SHA_384
      • ECDSA_SHA_512

      L'algoritmo da scegliere dipende dal tipo di chiave di cifratura master. Per le chiavi RSA, gli schemi di firma supportati includono PKCS #1 e RSASSA-PSS, insieme a diversi algoritmi di hashing. Per le chiavi ECDSA, ECDSA è lo schema di firma supportato con diversi algoritmi di hashing. Per la lista più recente degli algoritmi supportati, vedere Firma e la risorsa SignDataDetails nella documentazione dell'API Vault.

      Ad esempio, signing-algorithm: SHA_224_RSA_PKCS_PSS

    Ad esempio:

    
    schema_version: 20180708
    name: hello-java
    version: 0.0.1
    runtime: java
    build_image: fnproject/fn-java-fdk-build:jdk11-1.0.141
    run_image: fnproject/fn-java-fdk:jre11-1.0.141
    cmd: com.example.fn.HelloFunction::handleRequest
    signing_details:
        image_compartment_id: ocid1.tenancy.oc1..aaaaaaaa___ta
        kms_key_id: ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj
        kms_key_version_id: ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb
        signing_algorithm: SHA_224_RSA_PKCS_PSS
  4. Nella directory contenente il file func.yaml della funzione, immettere il comando Fn Project seguente per creare e distribuire la funzione e le relative dipendenze come immagine Docker firmata:
    fn -v deploy --app <app-name>

    dove <app-name> è il nome di un'applicazione con un criterio di verifica delle immagini abilitato.

    L'immagine viene creata, sottoposta a push nel registro Docker specificato e firmata con la chiave di cifratura master e la versione della chiave specificate nel file func.yaml. La funzione basata sull'immagine firmata è stata distribuita correttamente in OCI Functions nell'applicazione con il criterio di verifica dell'immagine abilitato specificato nel comando.

Utilizzo dell'interfaccia CLI OCI per firmare un'immagine di funzione per la distribuzione in un'applicazione con un criterio di verifica della firma

È possibile utilizzare il comando CLI OCI oci artifacts container image-signature sign-upload per firmare un'immagine di funzione dopo aver utilizzato il comando CLI Fn Project fn push per eseguire il push dell'immagine in Oracle Cloud Infrastructure Registry. È quindi possibile utilizzare i comandi CLI OCI oci fn function create e oci fn function update per distribuire una funzione basata sull'immagine firmata in un'applicazione che dispone di un criterio di verifica della firma.

Per utilizzare l'interfaccia CLI OCI per distribuire una funzione basata su un'immagine di funzione firmata in un'applicazione con un criterio di verifica della firma abilitato, effettuare le operazioni riportate di seguito.

  1. Attenersi alla procedura descritta in Creazione e distribuzione delle funzioni per creare una funzione, ma non utilizzare il comando fn -v deploy. Invece di utilizzare fn -v deploy, seguire i passi numerati riportati di seguito per:

    • utilizzare il comando fn -v build per creare la funzione e le relative dipendenze come immagine Docker
    • utilizzare il comando fn -v push per contrassegnare e inviare l'immagine a Container Registry
    • utilizzare il comando oci artifacts container image-signature sign-upload per firmare l'immagine
    • utilizzare il comando oci fn function create per creare una funzione basata sull'immagine firmata (oppure utilizzare il comando oci fn function update per basare una funzione esistente sull'immagine firmata)
  2. Creare la funzione e le relative dipendenze come immagine Docker utilizzando il comando fn -v build. Ad esempio:
    fn -v build
  3. Prendere nota del nome dell'immagine mostrato nell'output del comando precedente.

    Ad esempio, il nome dell'immagine può essere phx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1

  4. Eseguire il PUSH dell'immagine in Container Registry utilizzando il comando fn -v push. Ad esempio:
    fn -v push
  5. Ottenere l'OCID dell'immagine utilizzando la console (vedere Visualizzazione di immagini e dettagli immagine) o l'interfaccia CLI (utilizzare il comando oci artifacts container image list --compartment-id <compartment-ocid> --repository-name <repository-name>).
  6. Firma l'immagine sottoposta a push in Container Registry utilizzando la chiave master e la versione della chiave nel servizio Vault, creando una firma immagine, immettendo:
    oci artifacts container image-signature sign-upload --compartment-id <compartment-ocid> --kms-key-id <key-ocid> --kms-key-version-id <key-version-ocid> --signing-algorithm <signing-algorithm> --image-id <image-ocid> --description <signature-description>
    Dove:
    • --compartment-id <compartment-ocid> è l'OCID del compartimento a cui appartiene il repository dell'immagine. Ad esempio, --compartment-id ocid1.compartment.oc1..aaaaaaaa23______smwa
    • --kms-key-id <key-ocid> è l'OCID della chiave di cifratura master da utilizzare per firmare l'immagine. Poiché si creerà una funzione basata su questa immagine in un'applicazione con un criterio di verifica della firma abilitato, è necessario specificare l'OCID di una chiave di cifratura master inclusa nel criterio di verifica della firma (vedere Creazione di un criterio di verifica della firma per un'applicazione). Ad esempio, --kms-key-id ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj
    • --kms-key-version-id <key-version-ocid> è l'OCID della versione della chiave da utilizzare per firmare l'immagine. Ad esempio, --kms-key-version-id ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb
    • --signing-algorithm <signing-algorithm> è uno dei seguenti algoritmi da utilizzare per firmare l'immagine:

      • SHA_224_RSA_PKCS_PSS
      • SHA_256_RSA_PKCS_PSS
      • SHA_384_RSA_PKCS_PSS
      • SHA_512_RSA_PKCS_PSS
      • SHA_224_RSA_PKCS1_V1_5
      • SHA_256_RSA_PKCS1_V1_5
      • SHA_384_RSA_PKCS1_V1_5
      • SHA_512_RSA_PKCS1_V1_5
      • ECDSA_SHA_256
      • ECDSA_SHA_384
      • ECDSA_SHA_512

      L'algoritmo da scegliere dipende dal tipo di chiave di cifratura master. Per le chiavi RSA, gli schemi di firma supportati includono PKCS #1 e RSASSA-PSS, insieme a diversi algoritmi di hashing. Per le chiavi ECDSA, ECDSA è lo schema di firma supportato con diversi algoritmi di hashing. Per la lista più recente degli algoritmi supportati, vedere Firma e la risorsa SignDataDetails nella documentazione dell'API Vault.

      Ad esempio, --signing-algorithm SHA_224_RSA_PKCS_PSS

    • --image-id <image-ocid> è l'OCID dell'immagine da firmare. Ad esempio, --image-id ocid1.containerimage.oc1.phx.0.ansh81vru1zp.aaaaaaaalqzj______yks
    • --description <signature-description> è il testo facoltativo scelto per descrivere l'immagine. La descrizione viene inclusa come parte della firma e viene visualizzata nella console. Ad esempio, --description "Image for UAT testing"

    Ad esempio:

    oci artifacts container image-signature sign-upload --compartment-id ocid1.compartment.oc1..aaaaaaaa23______smwa --kms-key-id ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj --kms-key-version-id ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb --signing-algorithm SHA_224_RSA_PKCS_PSS --image-id ocid1.containerimage.oc1.phx.0.ansh81vru1zp.aaaaaaaalqzj______yks --description "Image for UAT testing"

    L'immagine della funzione è ora firmata con la stessa chiave di cifratura master specificata nei criteri di verifica della firma dell'applicazione.

  7. Se si desidera creare una nuova funzione basata sull'immagine firmata, immettere:

    oci fn function create --application-id <app-ocid> --display-name <function-name> --image <image-name> --memory-in-mbs <memory>

    Dove:

    • <app-ocid> è l'OCID dell'applicazione con il criterio di verifica della firma abilitato, in cui creare la nuova funzione.
    • <function-name> è il nome della nuova funzione che si desidera creare. Evitare di fornire informazioni riservate.
    • <image-name> è il nome dell'immagine firmata nel registro Docker su cui basare la nuova funzione.
    • <memory> è la memoria massima utilizzabile per la nuova funzione

    Ad esempio:

    oci fn function create --application-id ocid1.fnapp.oc1.phx.aaaaaaaaaf______r3ca --display-name helloworld-func --image phx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1 --memory-in-mbs 128

    Creazione di una nuova funzione nell'applicazione con il criterio di verifica della firma riuscita. La funzione si basa sull'immagine firmata e sul nome specificato.

  8. Se si desidera aggiornare una funzione esistente in modo che la funzione si basi sull'immagine firmata, aggiornare la funzione esistente immettendo:

    oci fn function update --function-id <function-ocid> --image <image-name>

    Dove:

    • <function-id> è l'OCID della funzione esistente che si desidera aggiornare.
    • <image-name> è il nome dell'immagine firmata nel registro Docker su cui basare la funzione.

    Ad esempio:

    oci fn function update --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --image phx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1