Assinando Imagens de Função e Impondo o Uso de Imagens Assinadas do Registro

Descubra como assinar imagens de função e como impor o uso de imagens assinadas do Oracle Cloud Infrastructure Registry ao implantar ao implantar e chamar funções usando o OCI Functions.

Por motivos de conformidade e segurança, os administradores de sistema geralmente só querem implantar software em um sistema de produção quando estão satisfeitos que:

  • o software vem de uma fonte confiável
  • o software não foi modificado desde sua publicação, comprometendo sua integridade

Para atender a esses requisitos, você pode assinar as imagens armazenadas no Oracle Cloud Infrastructure Registry. As imagens assinadas fornecem uma maneira de verificar a origem de uma imagem e sua integridade. O Oracle Cloud Infrastructure Registry permite que usuários ou sistemas enviem imagens para o registro e depois as assinem criando uma assinatura de imagem. Uma assinatura de imagem associa uma imagem a uma chave de criptografia principal obtida do Oracle Cloud Infrastructure Vault.

Os usuários ou os sistemas que extraem uma imagem assinada do Oracle Cloud Infrastructure Registry podem ter certeza de que a origem da imagem é confiável e que a integridade da imagem não foi comprometida. Para obter mais informações, consulte Assinando Imagens para Segurança.

Para aumentar ainda mais a segurança, você pode configurar aplicativos do OCI Functions para permitir apenas a criação, atualização, implantação e chamada de funções com base em imagens no Oracle Cloud Infrastructure Registry que foram assinadas por chaves de criptografia principais específicas. Em alto nível, estas são as etapas que devem ser seguidas:

  • Obtenha as chaves de criptografia principais do Oracle Cloud Infrastructure Vault a serem usadas para assinar as imagens que são enviadas e extraídas do Oracle Cloud Infrastructure Registry ao criar, atualizar, implantar e chamar funções.
  • Crie uma política de verificação de assinatura de imagem para o aplicativo. A política de verificação de assinatura define a chave de criptografia principal que deve ser usada para assinar imagens enviadas e extraídas do Oracle Cloud Infrastructure Registry ao criar, atualizar, implantar e chamar funções no aplicativo.
  • Ao usar o comando fn deploy para implantar funções em um aplicativo que tenha uma política de verificação de assinatura, especifique a chave de criptografia principal da política de verificação de assinatura no arquivo func.yaml da função. Ao enviar a imagem da função para o Oracle Cloud Infrastructure Registry usando a CLI do Fn Project, a CLI do Fn Project assina a imagem com a chave de criptografia principal. Consulte Usando a CLI do Fn Project para Assinar uma Imagem de Função para Implantação em um Aplicativo com uma Política de Verificação de Assinatura.
  • Ao usar a Console ou o comando fn create function para criar uma nova função em um aplicativo com uma política de verificação de assinatura, baseie a função em uma imagem existente do Docker que foi assinada por uma chave mestra de criptografia na política. Consulte Criando Funções com base em Imagens Docker Existentes. Da mesma forma, ao atualizar uma função, sempre baseie a função em uma imagem existente que tenha sido assinada por uma chave de criptografia mestra na política (consulte Atualizando uma Função). Para saber como assinar imagens no Oracle Cloud Infrastructure Registry, consulte Assinando Imagens para Segurança.

Você chama uma função em um aplicativo que tem uma política de verificação de assinatura exatamente da mesma maneira que as funções em outros aplicativos. Quando a função é chamada, o OCI Functions primeiro verifica se a imagem da função no Oracle Cloud Infrastructure Registry foi assinada com a chave de criptografia especificada na política de verificação de assinatura do aplicativo. Se a verificação da chave de criptografia for bem-sucedida, o OCI Functions extrairá a imagem do Oracle Cloud Infrastructure Registry e chamará a função. Se a verificação da chave de criptografia não for bem-sucedida, o código de erro e a mensagem (status 502: message: FunctionImageVerificationFail: Image cannot be verified or no valid signature found) serão:

  • retornou ao chamador
  • mostrado no gráfico Erros de Função na página Métricas na Console
  • mostrado no intervalo de chamada padrão na página Rastreamentos na Console (quando o rastreamento de função está ativado)

Observe o seguinte:

  • Você pode incluir até cinco funções em um aplicativo para o qual define uma política de verificação de assinatura. Não é possível adicionar uma sexta função a esse aplicativo. Observe também que não é possível definir uma política de verificação de assinatura para um aplicativo existente que já contém seis ou mais funções.
  • Antes de criar uma política de verificação de assinatura para um aplicativo existente, certifique-se de que todas as funções existentes no aplicativo sejam baseadas em imagens que já foram assinadas pela chave de criptografia mestra que você pretende especificar na política. Caso contrário, você não poderá criar a política de verificação de assinatura.
  • Uma imagem no Oracle Cloud Infrastructure Registry pode ser assinada usando várias assinaturas, cada uma associada a uma chave de criptografia principal distinta. Desde que a política de verificação de assinatura de um aplicativo inclua uma das chaves de criptografia principais, o aplicativo permitirá que a imagem seja extraída do Oracle Cloud Infrastructure Registry.
  • Se você permitir que um aplicativo use sua política de verificação de assinatura, mas o OCI Functions não puder estabelecer conexão com o Oracle Cloud Infrastructure Registry, nenhuma imagem poderá ser extraída do Oracle Cloud Infrastructure Registry.

Políticas Obrigatórias do IAM para Impor o Uso de Imagens Assinadas

Para impor uma política de verificação de assinatura, o OCI Functions deve ter recebido:

  • acesso para verificar chaves de criptografia principais no Oracle Cloud Infrastructure Vault com uma 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'
  • acesso a imagens no Oracle Cloud Infrastructure Registry com uma política como:
    Allow service faas to read repos in tenancy where request.operation='ListContainerImageSignatures'

Para criar uma política de verificação de assinatura, você deve ter recebido o seguinte:

  • acesso a chaves de criptografia principais no Oracle Cloud Infrastructure Vault com uma política como:
    Allow group <groupname> to read vaults in compartment <compartment-name>
    Allow group <groupname> to use keys in compartment <compartment-name> 
    
  • acesso a imagens no Oracle Cloud Infrastructure Registry com uma política como:
    Allow group <groupname> to read repos in tenancy

Você pode restringir as chaves de criptografia principais que podem ser usadas para assinatura de imagem de função e verificação de assinatura usando políticas mais restritivas (para obter exemplos, consulte Instruções de Política para Conceder ao Serviço OCI Functions e aos Usuários do OCI Functions Acesso aos Recursos do Oracle Vault).

Obtendo Chaves de Criptografia com as quais Assinar Imagens de Função (se elas ainda não existirem)

Para obter a chave de criptografia mestra a ser incluída na política de verificação de assinatura de um aplicativo e para especificar ao implantar uma função no aplicativo:

  1. Se você ainda não tiver acesso a uma chave assimétrica RSA ou ECDSA no Oracle Cloud Infrastructure Vault, obtenha acesso a uma chave assimétrica RSA ou ECDSA existente ou crie uma nova chave mestra de criptografia como uma chave assimétrica RSA ou ECDSA (consulte Criando uma Chave Mestra de Criptografia).

    Observe que o uso de chaves simétricas AES para assinar imagens não é suportado. Para obter mais informações sobre diferentes tipos de chave, consulte Visão Geral do Serviço Vault.

  2. Anote o OCID da chave principal de criptografia e o OCID da versão da chave armazenada no Oracle Cloud Infrastructure Vault. Consulte Listando Chaves de Criptografia Principais.

    Você usa esses OCIDs ao implantar a função.

Criar uma política de verificação de assinatura para um aplicativo

Para definir uma política de verificação de assinatura para um aplicativo e especificar uma chave de criptografia mestra que possa ser usada para assinar imagens:

  1. Na página da lista Aplicativos, selecione o aplicativo para o qual você deseja definir uma política de verificação de assinatura. Se precisar de ajuda para localizar a página de lista ou o aplicativo, consulte Listando Aplicativos.
  2. Selecione a tab Configuração.
  3. Selecione Gerenciar Verificação de Assinatura.
  4. Selecione Ativar políticas de verificação de assinatura para este aplicativo para permitir que o aplicativo use a política de verificação de assinatura definida.

    Se ainda não existir uma política para conceder ao OCI Functions acesso ao Oracle Cloud Infrastructure Registry, você será solicitado a criar essa política. Se você for um administrador, crie a política. Caso contrário, peça ao administrador para criar a política para você. Consulte Políticas Obrigatórias do IAM para Impor o Uso de Imagens Assinadas.

  5. Selecione uma chave de criptografia principal no Oracle Cloud Infrastructure Vault que deverá ter sido usada para assinar imagens.

    Se as políticas para conceder ao OCI Functions acesso à chave de criptografia principal no Oracle Cloud Infrastructure Vault ainda não existirem, você será solicitado a criar essas políticas. Se você for um administrador, crie as políticas. Caso contrário, peça ao administrador para criar as políticas para você. Consulte Políticas Obrigatórias do IAM para Impor o Uso de Imagens Assinadas.

    Observe que todas as funções existentes no aplicativo devem se basear em imagens que já foram assinadas pela chave de criptografia mestra selecionada. Caso contrário, você não poderá criar a política de verificação de assinatura.

  6. Selecione Salvar Alterações.

A partir de agora:

  • Ao implantar uma função neste aplicativo (por exemplo, usando o comando fn deploy), você precisa definir opções de assinatura de imagem. Essas opções identificam a chave de criptografia principal na política de verificação de assinatura do aplicativo, incluindo o OCID da chave de criptografia principal. Supondo que você especifique uma chave de criptografia principal válida, a imagem será enviada ao Oracle Cloud Infrastructure Registry e assinada com a chave de criptografia.
  • Quando você cria uma nova função (ou atualiza uma função existente) neste aplicativo usando a Console ou a CLI do Fn Project, é necessário especificar uma imagem existente que foi assinada usando a chave de criptografia mestra na política de verificação de assinatura do aplicativo.
  • Quando uma função neste aplicativo é chamada, o OCI Functions primeiro verifica a imagem no Oracle Cloud Infrastructure Registry. O OCI Functions só extrai a imagem do Oracle Cloud Infrastructure Registry e chama a função se a verificação da chave de criptografia for bem-sucedida.

Usando a CLI do Fn Project para Assinar uma Imagem de Função para Implantação em um Aplicativo com uma Política de Verificação de Assinatura

Você pode usar o comando fn deploy da CLI do Fn Project para implantar uma função em um aplicativo que tenha uma política de verificação de assinatura, especificando a chave de criptografia mestra da política de verificação de assinatura no arquivo func.yaml da função. A imagem da função é assinada durante a implantação.

Para usar a CLI do Fn Project para implantar uma função com base em uma imagem de função assinada em um aplicativo que tenha uma política de verificação de assinatura ativada:

  1. Siga as etapas em Criando e Implantando Funções para criar uma função usando o comando fn init, mas não use imediatamente o comando fn -v deploy. Em vez disso, siga as instruções abaixo para primeiro adicionar detalhes de assinatura de imagem ao arquivo func.yaml da função e use o comando fn -v deploy.

  2. Depois de usar o comando fn init para inicializar a função, altere o diretório para o diretório recém-criado que contém o arquivo func.yaml da função.
  3. Edite o arquivo func.yaml da função e adicione a seguinte seção:
    signing_details:
        image_compartment_id: <root-compartment-ocid>
        kms_key_id: <key-ocid>
        kms_key_version_id: <key-version-ocid>
        signing_algorithm: <signing-algorithm>

    em que:

    • image_compartment_id: <root-compartment-ocid> é o OCID do compartimento raiz da tenancy que possui o repositório no Oracle Cloud Infrastructure Registry para o qual você enviará a imagem de função. Por exemplo, image_compartment_id: ocid1.tenancy.oc1..aaaaaaaa___ta.
    • kms-key-id: <key-ocid> é o OCID da chave de criptografia mestra a ser usada para assinar a imagem. Como você implantará uma função com base nessa imagem em um aplicativo com uma política de verificação de assinatura ativada, especifique o OCID de uma chave de criptografia mestra incluída na política de verificação de assinatura (consulte Criando uma Política de Verificação de Assinatura para um Aplicativo). Por exemplo, kms-key-id: ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj
    • kms-key-version-id: <key-version-ocid> é o OCID da versão da chave a ser usada para assinar a imagem. Por exemplo, kms-key-version-id: ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb
    • signing-algorithm: <signing-algorithm> é um dos seguintes algoritmos a serem usados para assinar a imagem:

      • 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

      O algoritmo a ser selecionado depende do tipo da chave de criptografia principal. Para chaves RSA, os esquemas de assinatura suportados incluem PKCS #1 e RSASSA-PSS, além de diferentes algoritmos de hash. Para chaves ECDSA, ECDSA é o esquema de assinatura suportado com diferentes algoritmos de hash. Para obter a lista mais recente de algoritmos suportados, consulte Assinar e o recurso SignDataDetails na documentação da API do serviço Vault.

      Por exemplo, signing-algorithm: SHA_224_RSA_PKCS_PSS

    Por exemplo:

    
    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. No diretório que contém o arquivo func.yaml da função, informe o seguinte comando Fn Project único para criar e implantar a função e suas dependências como uma imagem do Docker assinada:
    fn -v deploy --app <app-name>

    em que <app-name> é o nome de um aplicativo com uma política de verificação de imagem ativada.

    A imagem é criada, enviada para o registro do Docker especificado e assinada com a chave de criptografia principal e a versão da chave especificada no arquivo func.yaml. A função baseada na imagem assinada é implantada com sucesso no OCI Functions no aplicativo com a política de verificação de imagem ativada especificada no comando.

Usando a CLI do OCI para Assinar uma Imagem de Função para Implantação em um Aplicativo com uma Política de Verificação de Assinatura

Você pode usar o comando oci artifacts container image-signature sign-upload da CLI do OCI para assinar uma imagem de função depois de usar o comando fn push da CLI do Fn Project para enviar a imagem ao Oracle Cloud Infrastructure Registry. Em seguida, você pode usar os comandos oci fn function create e oci fn function update da CLI do OCI para implantar uma função com base na imagem assinada em um aplicativo que tenha uma política de verificação de assinatura.

Para usar a CLI do OCI para implantar uma função com base em uma imagem de função assinada em um aplicativo que tenha uma política de verificação de assinatura ativada:

  1. Siga as etapas em Criando e Implantando Funções para criar uma função, mas não use o comando fn -v deploy. Em vez de usar fn -v deploy, siga as etapas numeradas abaixo para:

    • usar o comando fn -v build para criar a função e suas dependências como uma imagem do Docker
    • usar o comando fn -v push para marcar e enviar a imagem ao Container Registry
    • usar o comando oci artifacts container image-signature sign-upload para assinar a imagem
    • usar o comando oci fn function create para criar uma função com base na imagem assinada (ou usar o comando oci fn function update para basear uma função existente na imagem assinada)
  2. Crie a função e suas dependências como uma imagem do Docker usando o comando fn -v build. Por exemplo:
    fn -v build
  3. Anote o nome da imagem mostrado na saída do comando anterior.

    Por exemplo, o nome da imagem pode ser phx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1

  4. Envie a imagem ao Container Registry usando o comando fn -v push. Por exemplo:
    fn -v push
  5. Obtenha o OCID da imagem usando a Console (consulte Exibindo Imagens e Detalhes da Imagem) ou usando a CLI (use o comando oci artifacts container image list --compartment-id <compartment-ocid> --repository-name <repository-name>).
  6. Assine a imagem que você enviou ao Container Registry usando a chave principal e a versão da chave no serviço Vault, criando uma assinatura de imagem, digitando:
    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>
    em que:
    • --compartment-id <compartment-ocid> é o OCID do compartimento ao qual o repositório da imagem pertence. Por exemplo, --compartment-id ocid1.compartment.oc1..aaaaaaaa23______smwa
    • --kms-key-id <key-ocid> é o OCID da chave de criptografia mestra a ser usada para assinar a imagem. Como você criará uma função com base nessa imagem em um aplicativo com uma política de verificação de assinatura ativada, especifique o OCID de uma chave de criptografia mestra incluída na política de verificação de assinatura (consulte Criando uma Política de Verificação de Assinatura para um Aplicativo). Por exemplo, --kms-key-id ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qlj
    • --kms-key-version-id <key-version-ocid> é o OCID da versão da chave a ser usada para assinar a imagem. Por exemplo, --kms-key-version-id ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbb
    • --signing-algorithm <signing-algorithm> é um dos seguintes algoritmos a serem usados para assinar a imagem:

      • 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

      O algoritmo a ser selecionado depende do tipo da chave de criptografia principal. Para chaves RSA, os esquemas de assinatura suportados incluem PKCS #1 e RSASSA-PSS, além de diferentes algoritmos de hash. Para chaves ECDSA, ECDSA é o esquema de assinatura suportado com diferentes algoritmos de hash. Para obter a lista mais recente de algoritmos suportados, consulte Assinar e o recurso SignDataDetails na documentação da API do serviço Vault.

      Por exemplo, --signing-algorithm SHA_224_RSA_PKCS_PSS

    • --image-id <image-ocid> é o OCID da imagem a ser assinada. Por exemplo, --image-id ocid1.containerimage.oc1.phx.0.ansh81vru1zp.aaaaaaaalqzj______yks
    • --description <signature-description> é o texto opcional de sua escolha para descrever a imagem. A descrição é incluída como parte da assinatura e é mostrada na Console. Por exemplo, --description "Image for UAT testing"

    Por exemplo:

    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"

    A imagem de função agora é assinada com a mesma chave de criptografia mestra especificada na política de verificação de assinatura do aplicativo.

  7. Se quiser criar uma nova função com base na imagem assinada, digite:

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

    em que:

    • <app-ocid> é o OCID do aplicativo com a política de verificação de assinatura ativada, na qual a nova função será criada.
    • <function-name> é o nome da nova função que você deseja criar. Evite digitar informações confidenciais.
    • <image-name> é o nome da imagem assinada no registro do Docker no qual a nova função será baseada.
    • <memory> é a memória máxima utilizável para a nova função

    Por exemplo:

    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

    Uma nova função é criada com sucesso no aplicativo que tem a política de verificação de assinatura. A função é baseada na imagem assinada e com o nome especificado.

  8. Se você quiser atualizar uma função existente para que a função se baseie na imagem assinada, atualize a função existente digitando:

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

    em que:

    • <function-id> é o OCID da função existente que você deseja atualizar.
    • <image-name> é o nome da imagem assinada no registro do Docker no qual a função será baseada.

    Por exemplo:

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