Signature d'images de fonction et mise en application de l'utilisation des images signées de Registry
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 et de l'appel de fonctions à l'aide d'OCI Functions.
Pour des raisons de conformité et de sécurité, les administrateurs système veulent souvent déployer des logiciels dans un système de production uniquement lorsqu'ils sont convaincus que :
- le logiciel provient d'une source fiable,
- le logiciel n'a pas été modifié depuis sa publication, ce qui pourrait compromettre son intégrité.
Pour répondre à ces exigences, vous pouvez signer des images stockées dans Oracle Cloud Infrastructure Registry. Les images signées sont un moyen 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 propager des images vers le registre, puis de les signer en créant une signature d'image. Une signature d'image associe une image à une clé de cryptage maître obtenue à partir d'Oracle Cloud Infrastructure Vault.
Les utilisateurs ou les systèmes extrayant une image signée à partir d'Oracle Cloud Infrastructure Registry peuvent être sûrs que sa source est sécurisée et que son intégrité n'a pas été compromise. Pour plus d'informations, reportez-vous à Signature d'images à des fins de sécurité.
Pour améliorer encore la sécurité, vous pouvez configurer les applications OCI Functions afin d'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 cryptage maître particulières. Globalement, voici les étapes à suivre :
- Obtenez les clés de cryptage maître à partir d'Oracle Cloud Infrastructure Vault à utiliser pour signer les images propagées vers Oracle Cloud Infrastructure Registry et extraites de celui-ci lors de la création, de la mise à jour, du déploiement et de l'appel de fonctions.
- Créez une stratégie de vérification de signature d'image pour l'application. La stratégie de vérification de signature définit la clé de cryptage maître à utiliser pour signer les images propagées vers Oracle Cloud Infrastructure Registry et extraites de celui-ci 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 disposant d'une stratégie de vérification de signature, indiquez la clé de cryptage maître de la stratégie de vérification de signature dans le fichier func.yaml de la fonction. Lorsque vous propagez l'image de la fonction vers Oracle Cloud Infrastructure Registry à l'aide de l'interface de ligne de commande du projet Fn, l'interface de ligne de commande du projet Fn signe l'image avec la clé de cryptage maître. Reportez-vous à Utilisation de l'interface de ligne de commande du projet Fn pour signer une image de fonction pour le déploiement dans une application avec une stratégie de vérification de signature. - Lorsque vous utilisez la console ou la commande
fn create function
pour créer une fonction dans une application avec une stratégie de vérification de signature, basez la fonction sur une image Docker existante qui a été signée par une clé de cryptage maître dans la stratégie. Reportez-vous à 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 cryptage maître dans la stratégie (reportez-vous à Mise à jour d'une fonction). Pour savoir comment signer des images dans Oracle Cloud Infrastructure Registry, reportez-vous à Signature d'images à des fins de sécurité.
Vous appelez une fonction dans une application qui a une stratégie de vérification de signature de la même manière que les fonctions dans d'autres applications. Lorsque la fonction est appelée, OCI Functions vérifie d'abord que l'image de la fonction dans Oracle Cloud Infrastructure Registry a été signée avec la clé de cryptage indiquée dans la stratégie de vérification de signature de l'application. Si la vérification de la clé de cryptage réussit, OCI Functions extrait l'image à partir d'Oracle Cloud Infrastructure Registry et appelle la fonction. Si la vérification de la clé de chiffrement échoue, le code d'erreur et le message (status 502: message: FunctionImageVerificationFail: Image cannot be verified or no valid signature found
) sont les suivants :
- renvoyé à l'appelant
- affiché dans le graphique Erreurs de fonction sur la page Mesures de la console
- affiché dans l'étendue d'appel par défaut sur la page Traces de la console (lorsque la fonction de trace est activée)
Tenez compte des éléments suivants :
- Vous pouvez inclure jusqu'à cinq fonctions dans une application pour laquelle vous définissez une stratégie 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 stratégie de vérification de signature pour une application existante qui contient déjà six fonctions ou plus.
- Avant de créer une stratégie de vérification de signature pour une application existante, assurez-vous que toutes les fonctions existantes de l'application sont basées sur des images qui ont déjà été signées par la clé de cryptage maître que vous souhaitez spécifier dans la stratégie. Sinon, vous ne pourrez pas créer la stratégie de vérification de signature.
- Une image dans Oracle Cloud Infrastructure Registry peut être signée à l'aide de plusieurs signatures, chacune associée à une clé de cryptage maître différente. Si la stratégie de vérification de signature d'une application inclut l'une des clés de cryptage maître, l'application autorise l'extraction de l'image à partir d'Oracle Cloud Infrastructure Registry.
- Si vous autorisez une application à utiliser sa stratégie de vérification de signature mais qu'OCI Functions ne peut pas se connecter à Oracle Cloud Infrastructure Registry, aucune image ne peut être extraite d'Oracle Cloud Infrastructure Registry.
Stratégies IAM requises pour appliquer l'utilisation des images signées
Pour appliquer une stratégie de vérification de signature, OCI Functions doit disposer des droits suivants :
- accès permettant de vérifier les clés de cryptage maître dans Oracle Cloud Infrastructure Vault avec une stratégie 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éder aux images dans Oracle Cloud Infrastructure Registry avec une stratégie telle que :
Allow service faas to read repos in tenancy where request.operation='ListContainerImageSignatures'
Pour créer une stratégie de vérification de signature, vous devez disposer des droits suivants :
- accès aux clés de cryptage maître dans Oracle Cloud Infrastructure Vault avec une stratégie telle que :
Allow group <groupname> to read vaults in compartment <compartment-name>
Allow group <groupname> to use keys in compartment <compartment-name>
- accéder aux images dans Oracle Cloud Infrastructure Registry avec une stratégie telle que :
Allow group <groupname> to read repos in tenancy
Vous pouvez restreindre les clés de cryptage maître qui peuvent être utilisées pour la signature d'image de fonction et la vérification de signature à l'aide de stratégies plus restrictives (pour obtenir des exemples, reportez-vous à Instructions de stratégie permettant aux utilisateurs OCI Functions et OCI Functions d'accéder aux ressources Oracle Vault).
Obtention des clés de cryptage avec lesquelles signer les images de fonction (si elles n'existent pas déjà)
Pour obtenir la clé de cryptage maître à inclure dans la stratégie de vérification de signature d'une application et pour indiquer lors du déploiement d'une fonction dans l'application, procédez comme suit :
-
Si vous n'avez pas encore accès à une clé asymétrique RSA ou ECDSA dans Oracle Cloud Infrastructure Vault, accédez à une clé asymétrique RSA ou ECDSA existante ou créez une clé de cryptage maître en tant que clé asymétrique RSA ou ECDSA (reportez-vous à Création d'une clé de cryptage maître).
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é, reportez-vous à Présentation de Vault.
-
Notez à la fois l'OCID de la clé de cryptage maître et l'OCID de la version de clé stockée dans Oracle Cloud Infrastructure Vault. Reportez-vous à Liste des clés de cryptage maître.
Vous utilisez ces OCID lors du déploiement de la fonction.
Création d'une stratégie de vérification de signature pour une application
Pour définir une stratégie de vérification de signature pour une application et indiquer une clé de cryptage maître pouvant être utilisée pour signer des images, procédez comme suit :
- Sur la page de liste Applications, sélectionnez l'application pour laquelle vous voulez définir une stratégie de vérification de signature. Si vous avez besoin d'aide pour rechercher la page de liste ou l'application, reportez-vous à Liste des applications.
- Sélectionnez l'onglet Configuration.
- Sélectionnez Gérer la vérification de signature.
- Sélectionnez Activer les stratégies de vérification de la signature pour cette application pour permettre à l'application d'utiliser la stratégie de vérification de la signature que vous définissez.
Si aucune stratégie permettant d'accorder l'accès à OCI Functions à Oracle Cloud Infrastructure Registry n'existe, vous êtes invité à créer une telle stratégie. Si vous êtes administrateur, créez la stratégie. Sinon, demandez à l'administrateur de créer la stratégie pour vous. Reportez-vous à Stratégies IAM requises pour appliquer l'utilisation des images signées.
-
Sélectionnez une clé de cryptage maître dans Oracle Cloud Infrastructure Vault qui doit avoir été utilisée pour signer des images.
Si les stratégies permettant d'accorder à OCI Functions l'accès à la clé de cryptage maître dans Oracle Cloud Infrastructure Vault n'existent pas déjà, vous êtes invité à créer ces stratégies. Si vous êtes administrateur, créez les stratégies. Sinon, demandez à l'administrateur de créer les stratégies pour vous. Reportez-vous à Stratégies IAM requises pour appliquer l'utilisation des images signées.
Notez que toutes les fonctions existantes dans l'application doivent être basées sur des images déjà signées par la clé de cryptage maître que vous sélectionnez. Sinon, vous ne pourrez pas créer la stratégie de vérification de signature.
-
Sélectionnez Enregistrer les modifications.
A 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 les options de signature d'image. Ces options identifient la clé de cryptage maître dans la stratégie de vérification de signature de l'application, y compris l'OCID de la clé de cryptage maître. En supposant que vous indiquiez une clé de cryptage maître valide, l'image est propagée vers Oracle Cloud Infrastructure Registry et signée avec la clé de cryptage. - Lorsque vous créez une fonction (ou mettez à jour une fonction existante) dans cette application à l'aide de la console ou de l'interface de ligne de commande du projet Fn, vous devez indiquer une image existante qui a été signée à l'aide de la clé de cryptage maître dans la stratégie de vérification de signature de l'application.
- Lorsqu'une fonction de cette application est appelée, OCI Functions vérifie d'abord l'image dans Oracle Cloud Infrastructure Registry. OCI Functions extrait uniquement l'image à partir d'Oracle Cloud Infrastructure Registry et appelle la fonction si la vérification de la clé de cryptage réussit.
Utilisation de l'interface de ligne de commande du projet Fn pour signer une image de fonction à déployer dans une application avec une stratégie de vérification de signature
Vous pouvez utiliser la commande fn deploy
de l'interface de ligne de commande du projet Fn pour déployer une fonction dans une application dotée d'une stratégie de vérification de signature, en indiquant la clé de cryptage maître à partir de la stratégie 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 du projet Fn afin de déployer une fonction basée sur une image de fonction signée dans une application avec une stratégie de vérification de signature activée, procédez comme suit :
-
Suivez les étapes de la section 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
. Suivez plutôt 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 nouveau répertoire 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 propriétaire du référentiel dans Oracle Cloud Infrastructure Registry vers lequel vous allez propager 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 cryptage maître à utiliser pour signer l'image. Etant donné que vous allez déployer une fonction basée sur cette image dans une application avec une stratégie de vérification de signature activée, vous devez indiquer l'OCID d'une clé de cryptage maître incluse dans la stratégie de vérification de signature (reportez-vous à Création d'une stratégie 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 cryptage maître. Pour les clés RSA, les schémas de signature pris en charge incluent 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 dernière liste des algorithmes pris en charge, reportez-vous à Signer et à la ressource SignDataDetails dans la documentation de l'API Vault.
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 de projet Fn 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 stratégie de vérification d'image activée.L'image est créée, propagée vers le registre Docker indiqué et signée avec la clé de cryptage maître et la version de clé indiquées dans le fichier func.yaml. La fonction basée sur l'image signée a été déployée vers OCI Functions dans l'application avec la stratégie de vérification d'image activée que vous avez indiquée dans la commande.
Utilisation de l'interface de ligne de commande OCI pour signer une image de fonction à déployer dans une application avec une stratégie 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 de projet Fn fn push
pour propager l'image vers Oracle Cloud Infrastructure Registry. Vous pouvez ensuite utiliser les commandes d'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 disposant d'une stratégie de vérification de signature.
Pour utiliser l'interface de ligne de commande OCI afin de déployer une fonction basée sur une image de fonction signée dans une application dont la stratégie de vérification de signature est activée, procédez comme suit :
-
Suivez les étapes de la section 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 baliser et propager l'image vers Container Registry - 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
- propagez l'image vers Container Registry à l'aide de la commande
fn -v push
. Par exemple :fn -v push
- Obtenez l'OCID de l'image, à l'aide de la console (reportez-vous à Visualisation des images et des détails d'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 propagée vers Container Registry à l'aide de la clé maître et de la version de clé dans le service Vault, créant ainsi une signature d'image, en saisissant ce qui suit :
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 cryptage maître à utiliser pour signer l'image. Etant donné que vous allez créer une fonction basée sur cette image dans une application avec une stratégie de vérification de signature activée, vous devez indiquer l'OCID d'une clé de cryptage maître incluse dans la stratégie de vérification de signature (reportez-vous à Création d'une stratégie 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 cryptage maître. Pour les clés RSA, les schémas de signature pris en charge incluent 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 dernière liste des algorithmes pris en charge, reportez-vous à Signer et à la ressource SignDataDetails dans la documentation de l'API Vault.
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 le 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 fonction est maintenant signée avec la même clé de cryptage maître que celle spécifiée dans la stratégie de vérification de signature de l'application.
-
Si vous voulez créer une fonction basée sur l'image signée, saisissez :
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 stratégie de vérification de signature activée, dans laquelle créer la fonction.<function-name>
représente le nom de la fonction que vous voulez créer. Evitez de saisir des informations confidentielles.<image-name>
représente le nom de l'image signée dans le registre Docker sur laquelle la nouvelle fonction doit être basée.<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 qui dispose de la stratégie 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 de sorte que la fonction soit basée sur l'image signée, mettez à jour la fonction existante en saisissant ce qui suit :
oci fn function update --function-id <function-ocid> --image <image-name>
où :
<function-id>
représente l'OCID de la fonction existante à mettre à jour.<image-name>
représente le nom de l'image signée dans le registre Docker sur laquelle la fonction doit être basée.
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