Firma de imágenes de función y aplicación del uso de imágenes firmadas del registro
Descubra cómo firmar imágenes de funciones y cómo aplicar el uso de imágenes firmadas desde Oracle Cloud Infrastructure Registry al desplegar y llamar a funciones mediante OCI Functions.
Por motivos de conformidad y seguridad, los administradores de sistemas a menudo desean desplegar software en un sistema de producción solo cuando están seguros de que:
- el software proviene de un origen de confianza
- el software no ha sido modificado desde su publicación, lo que comprometería su integridad
Para cumplir estos requisitos, puede firmar imágenes almacenadas en Oracle Cloud Infrastructure Registry. Las imágenes firmadas proporcionan una forma de verificar tanto el origen de una imagen como su integridad. Oracle Cloud Infrastructure Registry permite a los usuarios o sistemas enviar imágenes al registro y, a continuación, firmarlas creando una firma de imagen. Una firma de imagen asocia una imagen con una clave de cifrado maestra obtenida de Oracle Cloud Infrastructure Vault.
Los usuarios o sistemas que extraen una imagen firmada de Oracle Cloud Infrastructure Registry pueden estar seguros de que el origen de la imagen es de confianza y de que la integridad de la imagen no se ha visto comprometida. Para obtener más información, consulte Firma de imágenes por seguridad.
Para mejorar aún más la seguridad, puede configurar las aplicaciones de OCI Functions para permitir solo la creación, actualización, despliegue y llamada de funciones basadas en imágenes de Oracle Cloud Infrastructure Registry firmadas por claves de cifrado maestras concretas. En un nivel superior, estos son los pasos a seguir:
- Obtenga las claves de cifrado maestras de Oracle Cloud Infrastructure Vault que se utilizarán para firmar las imágenes que se transfieren a Oracle Cloud Infrastructure Registry y se extraen de ellas al crear, actualizar, desplegar y llamar a funciones.
- Cree una política de verificación de firma de imagen para la aplicación. La política de verificación de firmas define la clave de cifrado maestra que se debe utilizar para firmar imágenes que se transfieren a Oracle Cloud Infrastructure Registry y se extraen de ella al crear, actualizar, desplegar y llamar a funciones en la aplicación.
- Al utilizar el comando
fn deploy
para desplegar funciones en una aplicación que tenga una política de verificación de firmas, especifique la clave de cifrado maestra de la política de verificación de firmas en el archivo func.yaml de la función. Al transferir la imagen de la función a Oracle Cloud Infrastructure Registry mediante la CLI de Fn Project, la CLI de Fn Project firma la imagen con la clave de cifrado maestra. Consulte Using the Fn Project CLI to Sign a Function Image for Deployment in an Application With a Signature Verification Policy. - Al utilizar la consola o el comando
fn create function
para crear una nueva función en una aplicación con una política de verificación de firmas, base la función en una imagen de Docker existente firmada por una clave de cifrado maestra en la política. Consulte Creación de funciones a partir de imágenes de Docker existentes. Del mismo modo, al actualizar una función, siempre base la función en una imagen existente firmada por una clave de cifrado maestra en la política (consulte Actualización de una función). Para obtener más información sobre cómo conectar imágenes en Oracle Cloud Infrastructure Registry, consulte Firma de imágenes para seguridad.
Llama a una función de una aplicación que tiene una política de verificación de firmas exactamente de la misma forma que las funciones de otras aplicaciones. Cuando se llama a la función, OCI Functions verifica primero que la imagen de la función en Oracle Cloud Infrastructure Registry se haya firmado con la clave de cifrado especificada en la política de verificación de firmas de la aplicación. Si la verificación de claves de cifrado se realiza correctamente, OCI Functions extrae la imagen de Oracle Cloud Infrastructure Registry y llama a la función. Si la verificación de la clave de cifrado no se realiza correctamente, el código de error y el mensaje (status 502: message: FunctionImageVerificationFail: Image cannot be verified or no valid signature found
) son:
- devuelto a la persona que llama
- que se muestra en el gráfico Errores de función de la página Métricas de la consola
- se muestra en el período de llamada por defecto en la página Rastreos de la consola (cuando el rastreo de funciones está activado)
Tenga en cuenta lo siguiente:
- Puede incluir hasta cinco funciones en una aplicación para la que defina una política de verificación de firmas. No puede agregar una sexta función a dicha aplicación. Tenga en cuenta también que no puede definir una política de verificación de firmas para una aplicación existente que ya contenga seis o más funciones.
- Antes de crear una política de verificación de firmas para una aplicación existente, asegúrese de que las funciones existentes en la aplicación se basan en imágenes que ya han sido firmadas por la clave de cifrado maestra que desea especificar en la política. De lo contrario, no podrá crear la política de verificación de firmas.
- Una imagen en Oracle Cloud Infrastructure Registry se puede firmar con varias firmas, cada una de ellas asociada con una clave de cifrado maestra diferente. Si la política de verificación de firmas de una aplicación incluye una de las claves de cifrado maestras, la aplicación permite extraer la imagen de Oracle Cloud Infrastructure Registry.
- Si activa una aplicación para utilizar su política de verificación de firmas, pero OCI Functions no puede conectarse a Oracle Cloud Infrastructure Registry, no se pueden extraer imágenes de Oracle Cloud Infrastructure Registry.
Políticas de IAM necesarias para aplicar el uso de imágenes firmadas
Para aplicar una política de verificación de firmas, se debe haber otorgado a OCI Functions:
- acceso para verificar las claves de cifrado maestras en Oracle Cloud Infrastructure Vault con una política como:
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'
- acceso a imágenes en Oracle Cloud Infrastructure Registry con una política como:
Allow service faas to read repos in tenancy where request.operation='ListContainerImageSignatures'
Para crear una política de verificación de firmas, se le debe haber otorgado:
- acceso a claves de cifrado maestras en Oracle Cloud Infrastructure Vault con una política como:
Allow group <groupname> to read vaults in compartment <compartment-name>
Allow group <groupname> to use keys in compartment <compartment-name>
- acceso a imágenes en Oracle Cloud Infrastructure Registry con una política como:
Allow group <groupname> to read repos in tenancy
Puede restringir las claves de cifrado maestras que se pueden utilizar para la firma de imágenes de función y la verificación de firmas mediante políticas más restrictivas (por ejemplo, consulte Sentencias de política para proporcionar al servicio OCI Functions y a los usuarios de OCI Functions acceso a los recursos de Oracle Vault).
Obtención de claves de cifrado con las que firmar imágenes de función (si aún no existen)
Para obtener la clave de cifrado maestra que se va a incluir en la política de verificación de firmas de una aplicación y especificar al desplegar una función en la aplicación:
-
Si aún no tiene acceso a una clave asimétrica RSA o ECDSA en Oracle Cloud Infrastructure Vault, obtenga acceso a una clave asimétrica RSA o ECDSA existente o cree una nueva clave de cifrado maestra como clave asimétrica RSA o ECDSA (consulte Creación de una clave de cifrado maestra).
Tenga en cuenta que no se admite el uso de claves simétricas AES para firmar imágenes. Para obtener más información sobre los diferentes tipos de clave, consulte Descripción general de Vault.
-
Anote el OCID de la clave de cifrado maestra y el OCID de la versión de clave almacenada en Oracle Cloud Infrastructure Vault. Consulte Listing Master Encryption Keys.
Utilice estos OCID al desplegar la función.
Creación de una política de verificación de firma para una aplicación
Para definir una política de verificación de firmas para una aplicación y especificar una clave de cifrado maestra que se pueda utilizar para firmar imágenes:
- En la página de lista Aplicaciones, seleccione la aplicación para la que desea definir una política de verificación de firma. Si necesita ayuda para buscar la página de lista o la aplicación, consulte Listado de aplicaciones.
- Seleccione el separador Configuración.
- Seleccione Gestionar verificación de firma.
- Seleccione Activar políticas de verificación de firma para esta aplicación para permitir que la aplicación utilice la política de verificación de firma que defina.
Si aún no existe una política para otorgar acceso a OCI Functions a Oracle Cloud Infrastructure Registry, se le solicitará que cree dicha política. Si es administrador, cree la política. De lo contrario, pida al administrador que cree la política por usted. Consulte Políticas de IAM necesarias para aplicar el uso de imágenes firmadas.
-
Seleccione una clave de cifrado maestra en Oracle Cloud Infrastructure Vault que se debe haber utilizado para firmar imágenes.
Si aún no existen políticas para otorgar a OCI Functions acceso a la clave de cifrado maestra en Oracle Cloud Infrastructure Vault, se le pedirá que cree dichas políticas. Si es un administrador, cree las políticas. De lo contrario, pida al administrador que cree las políticas por usted. Consulte Políticas de IAM necesarias para aplicar el uso de imágenes firmadas.
Tenga en cuenta que cualquier función existente en la aplicación debe basarse en imágenes que ya hayan sido firmadas por la clave de cifrado maestra que seleccione. De lo contrario, no podrá crear la política de verificación de firmas.
-
Seleccione Guardar cambios.
A partir de ahora:
- Al desplegar una función en esta aplicación (por ejemplo, mediante el comando
fn deploy
), debe definir las opciones de firma de imagen. Estas opciones identifican la clave de cifrado maestra en la política de verificación de firmas de la aplicación, incluido el OCID de la clave de cifrado maestra. Suponiendo que especifique una clave de cifrado maestra válida, la imagen se transfiere a Oracle Cloud Infrastructure Registry y se firma con la clave de cifrado. - Al crear una nueva función (o actualizar una función existente) en esta aplicación mediante la consola o la CLI de Fn Project, debe especificar una imagen existente que se haya firmado mediante la clave de cifrado maestra en la política de verificación de firmas de la aplicación.
- Cuando se llama a una función de esta aplicación, OCI Functions verifica primero la imagen en Oracle Cloud Infrastructure Registry. OCI Functions solo extrae la imagen de Oracle Cloud Infrastructure Registry y llama a la función si la verificación de clave de cifrado se realiza correctamente.
Uso de la CLI de Fn Project para firmar una imagen de función para el despliegue en una aplicación con una política de verificación de firma
Puede utilizar el comando fn deploy
de la CLI de Fn Project para desplegar una función en una aplicación que tenga una política de verificación de firmas especificando la clave de cifrado maestra de la política de verificación de firmas en el archivo func.yaml de la función. A continuación, la imagen de función se firma durante el despliegue.
Para utilizar la CLI de Fn Project para desplegar una función basada en una imagen de función firmada en una aplicación que tiene una política de verificación de firma activada:
-
Siga los pasos de Creación y despliegue de funciones para crear una función mediante el comando
fn init
, pero no utilice inmediatamente el comandofn -v deploy
. En su lugar, siga las instrucciones a continuación para agregar primero los detalles de firma de imagen al archivo func.yaml de la función y, a continuación, utilice el comandofn -v deploy
. - Después de utilizar el comando
fn init
para inicializar la función, cambie el directorio al directorio recién creado que contiene el archivo func.yaml de la función. - Edite el archivo func.yaml de la función y agregue la siguiente sección:
signing_details: image_compartment_id: <root-compartment-ocid> kms_key_id: <key-ocid> kms_key_version_id: <key-version-ocid> signing_algorithm: <signing-algorithm>
donde:
image_compartment_id: <root-compartment-ocid>
es el OCID del compartimento raíz del arrendamiento propietario del repositorio en Oracle Cloud Infrastructure Registry al que va a transferir la imagen de función. Por ejemplo,image_compartment_id: ocid1.tenancy.oc1..aaaaaaaa___ta
.kms-key-id: <key-ocid>
es el OCID de la clave de cifrado maestra que se va a utilizar para firmar la imagen. Puesto que desplegará una función basada en esta imagen en una aplicación con una política de verificación de firmas activada, debe especificar el OCID de una clave de cifrado maestra que se incluye en la política de verificación de firmas (consulte Creación de una política de verificación de firmas para una aplicación). Por ejemplo,kms-key-id: ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj
kms-key-version-id: <key-version-ocid>
es el OCID de la versión de clave que se va a utilizar para firmar la imagen. Por ejemplo,kms-key-version-id: ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb
-
signing-algorithm: <signing-algorithm>
es uno de los siguientes algoritmos que se deben utilizar para firmar la imagen: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
El algoritmo que debe seleccionarse depende del tipo de clave del cifrado maestra. Para las claves RSA, los esquemas de firma soportados incluyen PKCS #1 y RSASSA-PSS, junto con diferentes algoritmos de hash. Para las claves ECDSA, ECDSA es el esquema de firmas admitido con diferentes algoritmos de hash. Para obtener la lista más reciente de algoritmos soportados, consulte Firma y el recurso SignDataDetails en la documentación de la API de Vault.
Por ejemplo,
signing-algorithm: SHA_224_RSA_PKCS_PSS
Por ejemplo:
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
- En el directorio que contiene el archivo func.yaml de la función, introduzca el siguiente comando único de Fn Project para crear y desplegar la función y sus dependencias como una imagen de Docker firmada:
fn -v deploy --app <app-name>
donde
<app-name>
es el nombre de una aplicación con una política de verificación de imágenes activada.La imagen se crea, se transfiere al registro de Docker especificado y se firma con la clave de cifrado maestra y la versión de clave especificada en el archivo func.yaml. La función basada en la imagen firmada se despliega correctamente en OCI Functions en la aplicación con la política de verificación de imagen activada que ha especificado en el comando.
Uso de la CLI de OCI para firmar una imagen de función para el despliegue en una aplicación con una política de verificación de firma
Puede utilizar el comando de la CLI de OCI oci artifacts container image-signature sign-upload
para firmar una imagen de función después de haber utilizado el comando de la CLI de Fn Project fn push
para transferir la imagen a Oracle Cloud Infrastructure Registry. A continuación, puede utilizar los comandos de la CLI de OCI oci fn function create
y oci fn function update
para desplegar una función basada en la imagen firmada en una aplicación que tenga una política de verificación de firmas.
Para utilizar la CLI de OCI para desplegar una función basada en una imagen de función firmada en una aplicación que tenga una política de verificación de firmas activada:
-
Siga los pasos de Creación y despliegue de funciones para crear una función, pero no utilice el comando
fn -v deploy
. En lugar de utilizarfn -v deploy
, siga los siguientes pasos numerados para:- Utilizar el comando
fn -v build
para crear la función y sus dependencias como una imagen de Docker - utilizar el comando
fn -v push
para etiquetar y transferir la imagen a Container Registry - utilice el comando
oci artifacts container image-signature sign-upload
para firmar la imagen - Utilizar el comando
oci fn function create
para crear una función basada en la imagen firmada (o utilizar el comandooci fn function update
para basar una función existente en la imagen firmada)
- Utilizar el comando
- Cree la función y sus dependencias como una imagen de Docker mediante el comando
fn -v build
. Por ejemplo:fn -v build
-
Anote el nombre de la imagen que se muestra en la salida del comando anterior.
Por ejemplo, el nombre de la imagen puede ser
phx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1
- Transfiera la imagen a Container Registry mediante el comando
fn -v push
. Por ejemplo:fn -v push
- Obtenga el OCID de la imagen, ya sea mediante la consola (consulte Visualización de imágenes y detalles de imagen) o mediante la CLI (utilice el comando
oci artifacts container image list --compartment-id <compartment-ocid> --repository-name <repository-name>
). - Firme la imagen que ha transferido a Container Registry utilizando la clave maestra y la versión de clave en el servicio Vault, creando una firma de imagen introduciendo:
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>
donde:--compartment-id <compartment-ocid>
es el OCID del compartimento al que pertenece el repositorio de la imagen. Por ejemplo,--compartment-id ocid1.compartment.oc1..aaaaaaaa23______smwa
--kms-key-id <key-ocid>
es el OCID de la clave de cifrado maestra que se va a utilizar para firmar la imagen. Puesto que va a crear una función basada en esta imagen en una aplicación con una política de verificación de firmas activada, debe especificar el OCID de una clave de cifrado maestra que se incluye en la política de verificación de firmas (consulte Creación de una política de verificación de firmas para una aplicación). Por ejemplo,--kms-key-id ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj
--kms-key-version-id <key-version-ocid>
es el OCID de la versión de clave que se va a utilizar para firmar la imagen. Por ejemplo,--kms-key-version-id ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb
-
--signing-algorithm <signing-algorithm>
es uno de los siguientes algoritmos que se deben utilizar para firmar la imagen: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
El algoritmo que debe seleccionarse depende del tipo de clave del cifrado maestra. Para las claves RSA, los esquemas de firma soportados incluyen PKCS #1 y RSASSA-PSS, junto con diferentes algoritmos de hash. Para las claves ECDSA, ECDSA es el esquema de firmas admitido con diferentes algoritmos de hash. Para obtener la lista más reciente de algoritmos soportados, consulte Firma y el recurso SignDataDetails en la documentación de la API de Vault.
Por ejemplo,
--signing-algorithm SHA_224_RSA_PKCS_PSS
--image-id <image-ocid>
es el OCID de la imagen que se debe firmar. Por ejemplo,--image-id ocid1.containerimage.oc1.phx.0.ansh81vru1zp.aaaaaaaalqzj______yks
--description <signature-description>
es el texto opcional que elija para describir la imagen. La descripción se incluye como parte de la firma y se muestra en la consola. Por ejemplo,--description "Image for UAT testing"
Por ejemplo:
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"
La imagen de función ahora está firmada con la misma clave de cifrado maestra que se especifica en la política de verificación de firmas de la aplicación.
-
Si desea crear una nueva función basada en la imagen firmada, escriba:
oci fn function create --application-id <app-ocid> --display-name <function-name> --image <image-name> --memory-in-mbs <memory>
donde:
<app-ocid>
es el OCID de la aplicación con la política de verificación de firmas activada, en la que crear la nueva función.<function-name>
es el nombre de la nueva función que desea crear. Evite introducir información confidencial.<image-name>
es el nombre de la imagen firmada en el registro de Docker en el que se basará la nueva función.<memory>
es la memoria máxima utilizable para la nueva función
Por ejemplo:
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
Se ha creado correctamente una nueva función en la aplicación que tiene la política de verificación de firmas. La función se basa en la imagen firmada y con el nombre especificado.
-
Si desea actualizar una función existente para que la función se base en la imagen firmada, actualice la función existente introduciendo:
oci fn function update --function-id <function-ocid> --image <image-name>
donde:
<function-id>
es el OCID de la función existente que desea actualizar.<image-name>
es el nombre de la imagen firmada en el registro de Docker en el que se basará la función.
Por ejemplo:
oci fn function update --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --image phx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1