IBM Cloud Docs
Criptografando imagens para confidencialidade de conteúdo no Container Registry

Criptografando imagens para confidencialidade de conteúdo no Container Registry

É possível proteger a confidencialidade de suas imagens do IBM Cloud® Container Registry e assegurar que hosts não confiáveis não possam executar as imagens.

Crie uma imagem criptografada para que as pessoas sem a chave privadaUm padrão de algoritmo usado para criptografar mensagens que somente a chave pública correspondente pode decriptografar. A chave privada também é usada para decriptografar mensagens que foram criptografadas pela chave pública correspondente. A chave privada é mantida no sistema do usuário e é protegida por uma senha. não possam acessar o conteúdo. Crie a imagem criptografada usando um par de chaves RSA pública/privada para criptografar e decriptografar a imagem. Uma chave pública não é um segredo e qualquer um pode usá-la para criptografar uma imagem. Uma chave privada é um segredo e apenas os usuários que as possuem podem usá-la para decriptografar a imagem.

A criptografia é suportada no IBM Cloud Container Registry e obedece as normas a seguir:

Para obter mais informações sobre como criptografar imagens, consulte Imagens de contêiner criptografadas para segurança de imagem de contêiner em repouso e Avançar a segurança de imagem e a conformidade por meio da Criptografia de imagem de contêiner.

Antes de Iniciar

Criar o par de chaves pública/privada

Crie um par de chaves pública/privada usando comandos OpenSSL.

  1. Crie um diretório de trabalho, por exemplo, USER_KEYS, para armazenar as chaves e alterar para esse diretório:

    mkdir USER_KEYS; cd USER_KEYS
    
  2. Use o OpenSSL para criar uma chave privada, em que USER_KEY é o nome para a identidade da sua chave:

    openssl genrsa --out USER_KEYPrivate.pem
    
  3. Crie uma chave pública:

    openssl rsa -in USER_KEYPrivate.pem -pubout -out USER_KEYPub.pem
    

    Para usar a chave privada na produção, ela deve ser armazenada e protegida com segurança em um armazenamento adequado. Também é possível que você queira gerenciar a chave pública da mesma maneira. Para obter mais informações, consulte Armazenando chaves.

  4. Liste as chaves para assegurar que elas sejam criadas:

    ls -l
    
  5. Para usar esse par de chaves para criptografar imagens, exiba a chave pública executando o comando cat a seguir:

    cat USER_KEYPub.pem
    

    Você obtém uma resposta semelhante à saída a seguir:

    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv8Ny7dCWQ8Pdq1ddYSwk
    QOCB3lUEZVEyj9StX3jnISF/rxIsUZzJfbOrQN0fGkm+1sCCtltgQdztTjito8Fh
    DGflqQBSmV40XP3iZnNUJDrHuAol463Z/BuxxFXL3ry6rTosLGfrRwdQjxp8RSsn
    WyIIO2rmcqXZYe4SCtiMjMejLlTIDWLIMdYL3d6hA4DpgDLoh6EPmhKMVVwRt5b0
    ew5eMLcDuq6ButOM5yv4zYVHNrajY41NK+abSlFb6wzMg2AUDiC/MxV1LRq6mpyZ
    GJllx3LS1M1j7fDO3pmh/M0X7yD/4RgHwFaW4/4CQBw3fyxrOv0pZzZay+o
    -----END PUBLIC KEY-----
    

Criptografar a imagem

Criptografe a imagem usando a chave pública e, em seguida, crie uma imagem de contêiner usando um DockerfileUm arquivo de texto que contém instruções para construir uma imagem do Docker..

  1. Vá para o diretório em que você armazena seus apps, por exemplo, MY_APP.

    cd MY_APP
    
  2. Crie o Dockerfile executando o comando a seguir:

    cat << EOF >> Dockerfile
    FROM nginx:latest
    RUN echo "some secret" > /secret-file
    EOF
    
  3. Use Buildah para criar uma imagem não criptografada executando o seguinte comando, em que NAMESPACE é seu namespace:

    buildah bud -t us.icr.io/NAMESPACE/MY_APP .
    

    O us.icr.io/NAMESPACE/MY_APP está comprometido com o armazenamento de imagens local.

  4. Criptografe a imagem usando a chave pública e faça upload da imagem para o registro, executando os comandos a seguir e especificando o protocolo JSON Web Encryption (jwe) para criptografar a imagem, em que USER_KEYS/USER_KEYPub.pem é a chave de criptografia.

    buildah push --encryption-key jwe:..USER_KEYS/USER_KEYPub.pem us.icr.io/NAMESPACE/MY_APP
    

    O Buildah versão 1.15 ou mais recente usa as credenciais de login do Docker para a autenticação. Se essas credenciais não funcionarem ou se você quiser usar uma chave de APIUm código exclusivo que é usado para autenticar e autorizar solicitações de API. O código é passado para uma API para identificar o aplicativo ou o usuário que faz a chamada e para rastrear e controlar como a API é usada., poderá fornecer a opção —-creds <username>, em que <username> é o nome de usuário. Se você usar a opção —-creds <username>, quando solicitado, digite a senha da credencial do registro.

    Você recebe uma resposta que informa que o manifest está gravado no destino da imagem, que é o registro.

  5. Confira seu registro para certificar-se de que a imagem está lá.

Puxar e decriptografar a imagem

Puxe a imagem do registro e decriptografe-a usando a chave privada.

  1. Para assegurar que você esteja puxando do registro e que não esteja usando o cache local, remova a imagem localmente:

    buildah rmi -f us.icr.io/NAMESPACE/MY_APP
    
  2. (Opcional) É possível tentar puxar a imagem sem fornecer a chave de decriptografia para confirmar que não é possível decriptografá-la:

    buildah pull us.icr.io/NAMESPACE/MY_APP
    

    A saída contém uma mensagem semelhante à seguinte:

    ...<truncated>...
    Error decrypting layer sha256:ab4ea03582e08a8e8fc35b778cc6f1a1fa797469fa9cc61cee85f703b316bb12: missing private key needed for decryption
    ERRO exit status 125
    
  3. Use o Buildah para fazer pull da imagem com a chave de decriptografia, em que USER_KEYS/USER_KEYPrivate.pem é a chave de decriptografia e us.icr.io/NAMESPACE/MY_APP é o registro:

    buildah pull --decryption-key ../USER_KEYS/USER_KEYPrivate.pem us.icr.io/NAMESPACE/MY_APP
    

    A imagem criptografada é recuperada do registro, decriptografada e armazenada no armazenamento de imagem local.

  4. Confirme se a imagem está armazenada executando o Podman:

    podman run -it us.icr.io/NAMESPACE/MY_APP /bin/bash
    

Armazenando chaves

Para usar a chave privada na produção, ela deve ser armazenada e protegida com segurança. Também é possível que você queira gerenciar a chave pública da mesma maneira para controlar quem pode construir imagens. É possível usar o IBM Key Protect para armazenar e proteger suas chaves.

O IBM Key Protect armazena chaves simétricas, em vez das chaves PKI assimétricas usadas para a criptografia de imagem. É possível incluir suas chaves separadamente como duas chaves padrão do IBM Key Protect usando o painel, a CLI ou a API. O IBM Key Protect exige que apenas os dados Base64 sejam importados. Para obter dados de Base64 puros, é possível codificar os arquivos PEM executando "openssl enc -base64 -A -in USER_KEYPrivate.pem -out USER_KEYPrivate.b64" antes de carregar o conteúdo Base64 e reverter esta ação para obter a chave utilizável novamente, executando "openssl enc -base64 -A -d -in USER_KEYPrivate..b64 -out USER_KEYPrivate.pem".

Para obter mais informações sobre como usar o IBM Key Protect para armazenar e proteger as suas chaves, consulte Trazendo as suas chaves de criptografia para a nuvem e Importando as suas próprias chaves.

Como uma alternativa, é possível proteger as suas chaves em seu próprio armazenamento usando uma chave raiz do IBM Key Protect para agrupá-las. Essa ação significa que elas devem ser desagrupadas novamente usando o IBM Key Protect e a chave raiz válida.

Por exemplo, para agrupar chaves usando a CLI, execute o comando "ibmcloud kp key wrap ROOT_KEY_ID -p <base64 encoded image key>", e para desagrupar chaves, execute o comando "ibmcloud kp key unwrap ROOT_KEY_ID -p <base64 cyphertext>, em que ROOT_KEY_ID é o ID da chave raiz que você está usando.

Para obter mais informações sobre como é possível proteger as suas chaves em seu próprio armazenamento usando uma chave raiz do IBM Key Protect para agrupá-las, consulte Agrupando chaves.

As imagens criptografadas não são digitalizadas pelo Vulnerability Advisor.

Próximas etapas

Execute sua imagem criptografada em um cluster do Red Hat® OpenShift® on IBM Cloud® usando o Complemento de cluster do sincronizador de Chave de imagem.