Signature d'images de fonction et utilisation imposée d'images signées issues du registre
Découvrez comment signer des images de fonction et comment appliquer l'utilisation d'images signées à partir d'Oracle Cloud Infrastructure Registry lors du déploiement lors du déploiement et de l'appel de fonctions à l'aide du service des fonctions pour OCI.
Pour des raisons de conformité et de sécurité, les administrateurs de systèmes ne déploient généralement des logiciels dans un système de production que lorsqu'ils ont l'assurance que :
- le logiciel provient d'une source de confiance
- le logiciel n'a pas subi depuis sa publication de modifications ayant compromis son intégrité
Pour répondre à ces exigences, vous pouvez signer les images stockées dans Oracle Cloud Infrastructure Registry. Les images signées permettent de vérifier à la fois la source d'une image et son intégrité. Oracle Cloud Infrastructure Registry permet aux utilisateurs ou aux systèmes de transmettre des images au registre, puis de les signer pour créer une signature d'image. Une signature d'image associe une image à une clé de chiffrement principale obtenue à partir du service Chambre forte pour Oracle Cloud Infrastructure Vault.
Les utilisateurs ou les systèmes qui extraient une image signée d'Oracle Cloud Infrastructure Registry ont l'assurance que la source de l'image est fiable et que l'intégrité de l'image n'a pas été compromise. Pour plus d'informations, voir Signature d'images à des fins de sécurité.
Pour renforcer la sécurité, vous pouvez configurer les applications du service des fonctions pour OCI de manière à autoriser uniquement la création, la mise à jour, le déploiement et l'appel de fonctions basées sur des images dans Oracle Cloud Infrastructure Registry qui ont été signées par des clés de chiffrement principales particulières. Voici les étapes générales à suivre :
- Obtenez les clés de chiffrement principales d'Oracle Cloud Infrastructure Vault à utiliser pour signer les images poussées vers Oracle Cloud Infrastructure Registry et extraites lors de la création, de la mise à jour, du déploiement et de l'appel de fonctions.
- Créez une politique de vérification de signature d'image pour l'application. La politique de vérification de signature définit la clé de chiffrement principale qui doit être utilisée pour signer des images poussées vers Oracle Cloud Infrastructure Registry et extraites lors de la création, de la mise à jour, du déploiement et de l'appel de fonctions dans l'application.
- Lorsque vous utilisez la commande
fn deploy
pour déployer des fonctions dans une application dotée d'une politique de vérification de signature, spécifiez la clé de chiffrement principale à partir de la politique de vérification de signature dans le fichier func.yaml de la fonction. Lorsque vous poussez l'image de la fonction vers Oracle Cloud Infrastructure Registry à l'aide de l'interface de ligne de commande Fn Project, l'interface de ligne de commande Fn Project signe l'image avec la clé de chiffrement principale. Voir Utilisation de l'interface de ligne de commande Fn Project pour signer une image de fonction pour déploiement dans une application avec une politique de vérification de signature. - Lors de l'utilisation de la console ou de la commande
fn create function
pour créer une fonction dans une application avec une politique de vérification de signature, basez la fonction sur une image Docker existante qui a été signée par une clé de chiffrement principale dans la politique. Voir Création de fonctions à partir d'images Docker existantes. De même, lors de la mise à jour d'une fonction, basez toujours la fonction sur une image existante qui a été signée par une clé de chiffrement principale dans la politique (voir Mise à jour d'une fonction). Pour savoir comment signer des images dans Oracle Cloud Infrastructure Registry, voir Signature d'images à des fins de sécurité.
Vous appelez une fonction dans une application qui a une politique de vérification de signature exactement de la même manière que les fonctions d'autres applications. Lorsque la fonction est appelée, le service des fonctions pour OCI vérifie d'abord que l'image de la fonction dans Oracle Cloud Infrastructure Registry a été signée avec la clé de chiffrement spécifiée dans la politique de vérification de signature de l'application. Si la vérification de la clé de chiffrement a réussi, le service des fonctions pour OCI extrait l'image d'Oracle Cloud Infrastructure Registry et appelle la fonction. Si la vérification de la clé de chiffrement échoue, le code et le message d'erreur (status 502: message: FunctionImageVerificationFail: Image cannot be verified or no valid signature found
) sont :
- retourné à l'appelant
- affiché dans le graphique Erreurs de fonction de la page Mesures de la console
- affiché dans l'intervalle d'appel par défaut de la page Traces de la console (lorsque le suivi des fonctions est activé)
Notez ce qui suit :
- Vous pouvez inclure jusqu'à cinq fonctions dans une application pour laquelle vous définissez une politique de vérification de signature. Vous ne pouvez pas ajouter une sixième fonction à une telle application. Notez également que vous ne pouvez pas définir de politique de vérification de signature pour une application existante qui contient déjà six fonctions ou plus.
- Avant de créer une politique de vérification de signature pour une application existante, assurez-vous que toutes les fonctions existantes dans l'application sont basées sur des images qui ont déjà été signées par la clé de chiffrement principale que vous souhaitez spécifier dans la politique. Sinon, vous ne pourrez pas créer la politique de vérification de signature.
- Une image stockée dans Oracle Cloud Infrastructure Registry peut être signée à l'aide de plusieurs signatures, associées chacune à une clé de chiffrement principale différente. Si la politique de vérification de la signature d'une application inclut l'une des clés de chiffrement principales, l'application autorise l'extraction de l'image d'Oracle Cloud Infrastructure Registry.
- Si vous activez l'utilisation de la politique de vérification de signature pour une application, mais que le service des fonctions pour OCI ne peut pas se connecter à Oracle Cloud Infrastructure Registry, aucune image ne peut être extraite d'Oracle Cloud Infrastructure Registry.
Politiques GIA requises pour imposer l'utilisation d'images signées
Pour appliquer une politique de vérification de signature, le service des fonctions pour OCI doit avoir été accordé :
- accès pour vérifier les clés de chiffrement principales dans Oracle Cloud Infrastructure Vault avec une politique telle que :
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'
- accès à des images dans Oracle Cloud Infrastructure Registry avec une politique telle que :
Allow service faas to read repos in tenancy where request.operation='ListContainerImageSignatures'
Pour créer une politique de vérification de signature, vous devez avoir obtenu les autorisations suivantes :
- accès aux clés de chiffrement principales dans Oracle Cloud Infrastructure Vault avec une politique telle que :
Allow group <groupname> to read vaults in compartment <compartment-name>
Allow group <groupname> to use keys in compartment <compartment-name>
- accès à des images dans Oracle Cloud Infrastructure Registry avec une politique telle que :
Allow group <groupname> to read repos in tenancy
Vous pouvez restreindre les clés de chiffrement principales qui peuvent être utilisées pour la signature d'image de fonction et la vérification de signature en utilisant des politiques plus restrictives (pour des exemples, voir Énoncés de politique permettant aux utilisateurs du service des fonctions pour OCI et du service des fonctions pour OCI d'accéder aux ressources du service de chambre forte Oracle).
Obtention de clés de chiffrement avec lesquelles signer des images de fonction (si elles n'existent pas déjà)
Pour obtenir la clé de chiffrement principale à inclure dans la politique de vérification de signature d'une application, et pour spécifier lors du déploiement d'une fonction dans l'application :
-
Si vous n'avez pas déjà accès à une clé asymétrique RSA ou ECDSA dans Oracle Cloud Infrastructure Vault, obtenez l'accès à une clé asymétrique RSA ou ECDSA existante ou créez une nouvelle clé de chiffrement principale en tant que clé asymétrique RSA ou ECDSA (voir Création d'une clé de chiffrement principale).
Notez que l'utilisation de clés symétriques AES pour signer des images n'est pas prise en charge. Pour plus d'informations sur les différents types de clé, voir Aperçu du service de chambre forte.
-
Notez l'OCID de la clé de chiffrement principale et l'OCID de la version de clé stockée dans Oracle Cloud Infrastructure Vault. Voir Liste des clés de chiffrement principales.
Vous utilisez ces OCID lors du déploiement de la fonction.
Création d'une politique de vérification de signature pour une application
Pour définir une politique de vérification de signature pour une application et spécifier une clé de chiffrement principale qui peut être utilisée pour signer des images :
- Dans la page de liste Applications, sélectionnez l'application pour laquelle vous voulez définir une politique de vérification de signature. Si vous avez besoin d'aide pour trouver la page de liste ou l'application, voir Liste des applications.
- Sélectionnez l'onglet Configuration.
- Sélectionnez Gérer la vérification des signatures.
- Sélectionnez Activer les politiques de vérification des signatures pour cette application pour permettre à l'application d'utiliser la politique de vérification des signatures que vous définissez.
Si une politique pour accorder au service des fonctions pour OCI l'accès à Oracle Cloud Infrastructure Registry n'existe pas déjà, vous êtes invité à créer une telle politique. Si vous êtes administrateur, créez la politique. Sinon, demandez à l'administrateur de créer la politique pour vous. Voir Politiques IAM requises pour l'application de l'utilisation des images signées.
-
Sélectionnez une clé de chiffrement principale dans le service Chambre forte pour Oracle Cloud Infrastructure qui doit avoir été utilisée pour signer des images.
Si des politiques pour accorder au service des fonctions pour OCI l'accès à la clé de chiffrement principale dans Oracle Cloud Infrastructure Vault n'existent pas déjà, vous êtes invité à créer de telles politiques. Si vous êtes administrateur, créez les politiques. Sinon, demandez à l'administrateur de créer les politiques pour vous. Voir Politiques IAM requises pour l'application de l'utilisation des images signées.
Notez que toutes les fonctions existantes dans l'application doivent être basées sur des images qui ont déjà été signées par la clé de chiffrement principale que vous sélectionnez. Sinon, vous ne pourrez pas créer la politique de vérification de signature.
-
Sélectionnez Enregistrer les modifications.
À partir de maintenant :
- Lorsque vous déployez une fonction dans cette application (par exemple, à l'aide de la commande
fn deploy
), vous devez définir des options de signature d'image. Ces options identifient la clé de chiffrement principale dans la politique de vérification de signature de l'application, y compris l'OCID de la clé de chiffrement principale. En supposant que vous spécifiez une clé de chiffrement principale valide, l'image est poussée vers Oracle Cloud Infrastructure Registry et signée avec la clé de chiffrement. - Lorsque vous créez une nouvelle fonction (ou mettez à jour une fonction existante) dans cette application à l'aide de la console ou de l'interface de ligne de commande Fn Project, vous devez spécifier une image existante qui a été signée à l'aide de la clé de chiffrement principale dans la politique de vérification de signature de l'application.
- Lorsqu'une fonction de cette application est appelée, le service des fonctions pour OCI vérifie d'abord l'image dans Oracle Cloud Infrastructure Registry. Le service des fonctions pour OCI extrait uniquement l'image d'Oracle Cloud Infrastructure Registry et appelle la fonction si la vérification de la clé de chiffrement réussit.
Utilisation de l'interface de ligne de commande Fn Project pour signer une image de fonction à déployer dans une application avec une politique de vérification de signature
Vous pouvez utiliser la commande fn deploy
de l'interface de ligne de commande Fn Project pour déployer une fonction dans une application dotée d'une politique de vérification de signature, en spécifiant la clé de chiffrement principale à partir de la politique de vérification de signature dans le fichier func.yaml de la fonction. L'image de la fonction est ensuite signée lors du déploiement.
Pour utiliser l'interface de ligne de commande Fn Project afin de déployer une fonction basée sur une image de fonction signée dans une application ayant une politique de vérification de signature activée :
-
Suivez les étapes sous Création et déploiement de fonctions pour créer une fonction à l'aide de la commande
fn init
, mais n'utilisez pas immédiatement la commandefn -v deploy
. À la place, suivez les instructions ci-dessous pour ajouter d'abord les détails de signature d'image au fichier func.yaml de la fonction, puis utilisez la commandefn -v deploy
. - Après avoir utilisé la commande
fn init
pour initialiser la fonction, accédez au répertoire nouvellement créé contenant le fichier func.yaml de la fonction. - Modifiez le fichier func.yaml de la fonction et ajoutez la section suivante :
signing_details: image_compartment_id: <root-compartment-ocid> kms_key_id: <key-ocid> kms_key_version_id: <key-version-ocid> signing_algorithm: <signing-algorithm>
où :
image_compartment_id: <root-compartment-ocid>
est l'OCID du compartiment racine de la location qui détient le référentiel dans Oracle Cloud Infrastructure Registry vers lequel vous allez pousser l'image de fonction. Par exemple,image_compartment_id: ocid1.tenancy.oc1..aaaaaaaa___ta
.kms-key-id: <key-ocid>
est l'OCID de la clé de chiffrement principale à utiliser pour signer l'image. Comme vous allez déployer une fonction basée sur cette image dans une application avec une politique de vérification de signature activée, vous devez spécifier l'OCID d'une clé de chiffrement principale incluse dans la politique de vérification de signature (voir Création d'une politique de vérification de signature pour une application). Par exemple,kms-key-id: ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj
kms-key-version-id: <key-version-ocid>
est l'OCID de la version de clé à utiliser pour signer l'image. Par exemple,kms-key-version-id: ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb
-
signing-algorithm: <signing-algorithm>
est l'un des algorithmes suivants à utiliser pour signer l'image :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'algorithme à choisir dépend du type de clé de chiffrement principale. Pour les clés RSA, les schémas de signature pris en charge comprennent PKCS #1 et RSASSA-PSS, ainsi que différents algorithmes de hachage. Pour les clés ECDSA, ECDSA est le schéma de signature pris en charge avec différents algorithmes de hachage. Pour obtenir la liste la plus récente des algorithmes pris en charge, voir Signer et la ressource SignDataDetails dans la documentation sur l'API du service de chambre forte.
Par exemple,
signing-algorithm: SHA_224_RSA_PKCS_PSS
Par exemple :
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
- Dans le répertoire contenant le fichier func.yaml de la fonction, entrez la commande Fn Project unique suivante pour créer et déployer la fonction et ses dépendances en tant qu'image Docker signée :
fn -v deploy --app <app-name>
où
<app-name>
est le nom d'une application avec une politique de vérification d'image activée.L'image est créée, poussée vers le registre Docker spécifié et signée avec la clé de chiffrement principale et la version de clé spécifiées dans le fichier func.yaml. La fonction basée sur l'image signée est déployée avec succès dans le service des fonctions pour OCI dans l'application avec la politique de vérification d'image activée que vous avez spécifiée dans la commande.
Utilisation de l'interface de ligne de commande OCI pour signer une image de fonction pour déploiement dans une application avec une politique de vérification de signature
Vous pouvez utiliser la commande d'interface de ligne de commande OCI oci artifacts container image-signature sign-upload
pour signer une image de fonction après avoir utilisé la commande d'interface de ligne de commande Fn Project fn push
pour pousser l'image vers Oracle Cloud Infrastructure Registry. Vous pouvez ensuite utiliser les commandes de l'interface de ligne de commande OCI oci fn function create
et oci fn function update
pour déployer une fonction basée sur l'image signée dans une application dotée d'une politique de vérification de signature.
Pour utiliser l'interface de ligne de commande OCI pour déployer une fonction basée sur une image de fonction signée dans une application ayant une politique de vérification de signature activée :
-
Suivez les étapes sous Création et déploiement de fonctions pour créer une fonction, mais n'utilisez pas la commande
fn -v deploy
. Au lieu d'utiliserfn -v deploy
, suivez les étapes numérotées ci-dessous pour :- utiliser la commande
fn -v build
pour créer la fonction et ses dépendances en tant qu'image Docker - utiliser la commande
fn -v push
pour marquer et pousser l'image vers le registre de conteneurs - utiliser la commande
oci artifacts container image-signature sign-upload
pour signer l'image - utiliser la commande
oci fn function create
pour créer une fonction basée sur l'image signée (ou utiliser la commandeoci fn function update
pour baser une fonction existante sur l'image signée)
- utiliser la commande
- Créez la fonction et ses dépendances en tant qu'image Docker à l'aide de la commande
fn -v build
. Par exemple :fn -v build
-
Notez le nom de l'image affiché dans la sortie de la commande précédente.
Par exemple, le nom de l'image peut être
phx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1
- Poussez l'image vers le registre de conteneurs à l'aide de la commande
fn -v push
. Par exemple :fn -v push
- Obtenez l'OCID de l'image, à l'aide de la console (voir Affichage des images et des détails de l'image), ou à l'aide de l'interface de ligne de commande (utilisez la commande
oci artifacts container image list --compartment-id <compartment-ocid> --repository-name <repository-name>
). - Signez l'image que vous avez poussée vers le registre de conteneurs à l'aide de la clé principale et de la version de clé dans le service de chambre forte, en créant une signature d'image, en entrant :
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>
où :--compartment-id <compartment-ocid>
est l'OCID du compartiment auquel appartient le référentiel de l'image. Par exemple,--compartment-id ocid1.compartment.oc1..aaaaaaaa23______smwa
--kms-key-id <key-ocid>
est l'OCID de la clé de chiffrement principale à utiliser pour signer l'image. Comme vous allez créer une fonction basée sur cette image dans une application avec une politique de vérification de signature activée, vous devez spécifier l'OCID d'une clé de chiffrement principale incluse dans la politique de vérification de signature (voir Création d'une politique de vérification de signature pour une application). Par exemple,--kms-key-id ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj
--kms-key-version-id <key-version-ocid>
est l'OCID de la version de clé à utiliser pour signer l'image. Par exemple,--kms-key-version-id ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb
-
--signing-algorithm <signing-algorithm>
est l'un des algorithmes suivants à utiliser pour signer l'image :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'algorithme à choisir dépend du type de clé de chiffrement principale. Pour les clés RSA, les schémas de signature pris en charge comprennent PKCS #1 et RSASSA-PSS, ainsi que différents algorithmes de hachage. Pour les clés ECDSA, ECDSA est le schéma de signature pris en charge avec différents algorithmes de hachage. Pour obtenir la liste la plus récente des algorithmes pris en charge, voir Signer et la ressource SignDataDetails dans la documentation sur l'API du service de chambre forte.
Par exemple,
--signing-algorithm SHA_224_RSA_PKCS_PSS
--image-id <image-ocid>
est l'OCID de l'image à signer. Par exemple,--image-id ocid1.containerimage.oc1.phx.0.ansh81vru1zp.aaaaaaaalqzj______yks
--description <signature-description>
est un texte facultatif de votre choix pour décrire l'image. La description est incluse dans la signature et est affichée dans la console. Par exemple,--description "Image for UAT testing"
Par exemple :
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'image de la fonction est maintenant signée avec la même clé de chiffrement principale que celle spécifiée dans la politique de vérification de signature de l'application.
-
Si vous souhaitez créer une fonction basée sur l'image signée, entrez :
oci fn function create --application-id <app-ocid> --display-name <function-name> --image <image-name> --memory-in-mbs <memory>
où :
<app-ocid>
est l'OCID de l'application avec la politique de vérification de signature activée, dans laquelle créer la nouvelle fonction.<function-name>
est le nom de la nouvelle fonction à créer. Évitez d'entrer des informations confidentielles.<image-name>
représente le nom de l'image signée dans le registre Docker sur laquelle baser la nouvelle fonction.<memory>
est la mémoire maximale utilisable pour la nouvelle fonction
Par exemple :
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
Une nouvelle fonction a été créée dans l'application avec la politique de vérification de signature. La fonction est basée sur l'image signée et avec le nom que vous avez spécifié.
-
Si vous souhaitez mettre à jour une fonction existante afin que la fonction soit basée sur l'image signée, mettez à jour la fonction existante en entrant :
oci fn function update --function-id <function-ocid> --image <image-name>
où :
<function-id>
est l'OCID de la fonction existante que vous voulez mettre à jour.<image-name>
représente le nom de l'image signée dans le registre Docker sur laquelle baser la fonction.
Par exemple :
oci fn function update --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --image phx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1