IBM Cloud Docs
Cifrado de imágenes para la confidencialidad de contenido en Container Registry

Cifrado de imágenes para la confidencialidad de contenido en Container Registry

Puede proteger la confidencialidad de las imágenes de IBM Cloud® Container Registry y asegurarse de que los hosts que no son de confianza no puedan ejecutar las imágenes.

Crea una imagen cifrada para que las personas sin la clavePatrón algorítmico que se utiliza para cifrar mensajes que sólo la correspondiente clave pública puede descifrar. La clave privada también se utiliza para descifrar mensajes que se han cifrado mediante la clave pública correspondiente. La clave privada se guarda en el sistema del usuario y se protege mediante una contraseña. privada no puedan acceder al contenido. Cree la imagen cifrada utilizando un par de claves públicas-privadas RSA para cifrar y descifrar la imagen. Una clave pública no es un secreto y cualquiera puede utilizarla para cifrar una imagen. Una clave privada es un secreto y solo los usuarios que tienen dicha clave privada pueden utilizarla para descifrar la imagen.

Se ofrece soporte al cifrado en IBM Cloud Container Registry y cumple los estándares siguientes:

Para obtener más información sobre el cifrado de imágenes, consulte Imágenes de contenedor cifradas para la seguridad de imágenes de contenedor en reposo y Avanzar en la seguridad y conformidad de imágenes a través del cifrado de imágenes de contenedor.

Antes de empezar

Crear el par de claves públicas-privadas

Cree un par de claves públicas-privadas utilizando mandatos OpenSSL.

  1. Cree un directorio de trabajo, por ejemplo, USER_KEYS, en el que almacenar las claves y cambiar a ese directorio:

    mkdir USER_KEYS; cd USER_KEYS
    
  2. Utilice OpenSSL para crear una clave privada, donde USER_KEY es el nombre de la identidad de su clave:

    openssl genrsa --out USER_KEYPrivate.pem
    
  3. Cree una clave pública:

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

    Para utilizar la clave privada en producción, debe almacenar de forma segura y proteger la clave privada en un almacén adecuado. También puede gestionar la clave pública de la misma forma. Para obtener más información, consulte Almacenamiento de claves.

  4. Liste las claves para asegurarse de que se han creado:

    ls -l
    
  5. Para utilizar este par de claves para cifrar imágenes, visualice la clave pública ejecutando el siguiente mandato cat:

    cat USER_KEYPub.pem
    

    Obtenga una respuesta similar a la siguiente salida:

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

Cifrar la imagen

Cifre la imagen utilizando la clave pública y, a continuación, cree una imagen de contenedor utilizando un archivo DockerfileUn archivo de texto que contiene instrucciones para crear una imagen de Docker..

  1. Vaya al directorio donde almacena las aplicaciones, por ejemplo, MY_APP.

    cd MY_APP
    
  2. Cree el Dockerfile ejecutando el siguiente mandato:

    cat << EOF >> Dockerfile
    FROM nginx:latest
    RUN echo "some secret" > /secret-file
    EOF
    
  3. Utilice Buildah para crear una imagen sin cifrar ejecutando el siguiente comando, donde NAMESPACE es su espacio de nombres:

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

    us.icr.io/NAMESPACE/MY_APP está comprometido con el almacén de imágenes local.

  4. Cifre la imagen utilizando la clave pública y cargue la imagen al registro ejecutando los mandatos siguientes y especificando el protocolo JSON Web Encryption (jwe) para cifrar la imagen, donde USER_KEYS/USER_KEYPub.pem es la clave de cifrado.

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

    Buildah versión 1.15, o posterior, utiliza credenciales de inicio de sesión de Docker para la autenticación. Si estas credenciales no funcionan o desea utilizar una clave de APIUn código único que se utiliza para autenticar y autorizar las solicitudes de API. El código se pasa a una API para identificar la aplicación o el usuario que llama y para rastrear y controlar cómo se utiliza la API., puede proporcionar la opción —-creds <username>, donde <username> es el nombre de usuario. Si utiliza la opción —-creds <username>, cuando se le solicite, escriba la contraseña de la credencial de registro.

    Obtiene una respuesta que le indica que el manifiesto se escribe en el destino de imagen, que es el registro.

  5. Compruebe el registro para asegurarse de que la imagen está allí.

Extraer y descifrar la imagen

Extraiga la imagen del registro y descífrela utilizando la clave privada.

  1. Para asegurarse de que está extrayendo del registro y de que no está utilizando la memoria caché local, elimine la imagen localmente:

    buildah rmi -f us.icr.io/NAMESPACE/MY_APP
    
  2. (Opcional) Puede intentar extraer la imagen sin proporcionar la clave de descifrado para confirmar que la imagen no se puede descifrar:

    buildah pull us.icr.io/NAMESPACE/MY_APP
    

    La salida contiene un mensaje parecido al siguiente:

    ...<truncated>...
    Error decrypting layer sha256:ab4ea03582e08a8e8fc35b778cc6f1a1fa797469fa9cc61cee85f703b316bb12: missing private key needed for decryption
    ERRO exit status 125
    
  3. Utilice Buildah para extraer la imagen con la clave de descifrado, donde USER_KEYS/USER_KEYPrivate.pem es la clave de descifrado y us.icr.io/NAMESPACE/MY_APP es el registro:

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

    La imagen cifrada se recupera del registro, descifra y almacena en el almacén local de imágenes.

  4. Confirme que la imagen se está almacenada ejecutando Podman:

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

Almacenamiento de claves

Para utilizar la clave privada en producción, debe almacenar de forma segura y proteger la clave privada. También puede gestionar la clave pública de la misma forma para controlar quién puede compilar imágenes. Puede utilizar IBM Key Protect para almacenar y proteger las claves.

IBM Key Protect almacena claves simétricas en lugar de las claves PKI asimétricas que se utilizan para el cifrado de imágenes. Puede añadir sus claves por separado como dos claves estándar de IBM Key Protect utilizando el panel de control, la CLI o la API.de IBM Key Protect requieren que sólo se importen los datos en Base64. Para obtener datos Base64 puros, puede codificar los archivos PEM ejecutando "openssl enc -base64 -A -in USER_KEYPrivate.pem -out USER_KEYPrivate.b64" antes de cargar el contenido de Base64 y revertir esta acción para obtener de nuevo la clave utilizable ejecutando "openssl enc -base64 -A -d -in USER_KEYPrivate..b64 -out USER_KEYPrivate.pem".

Para obtener más información sobre cómo utilizar IBM Key Protect para almacenar y proteger las claves, consulte Traslado de las claves de cifrado a la nube e Importación de sus propias claves.

Como alternativa, puede proteger las claves de su propio almacén utilizando una clave raíz de IBM Key Protect para envolverlas. Esta acción significa que debe volver a desenvolverlas utilizando IBM Key Protect y la clave raíz válida.

Por ejemplo, para envolver las claves utilizando la CLI, ejecute el mandato "ibmcloud kp key wrap ROOT_KEY_ID -p <base64 encoded image key>" y para desenvolver las claves, ejecute el mandato "ibmcloud kp key unwrap ROOT_KEY_ID -p <base64 cyphertext>, donde ROOT_KEY_ID es el ID de la clave raíz que está utilizando.

Para obtener más información sobre cómo proteger las claves de su propio almacén utilizando una clave raíz de IBM Key Protect para envolverlas, consulte Envolvimiento de claves.

El Asesor de vulnerabilidades no explora las imágenes cifradas.

Próximos pasos

Ejecute la imagen cifrada en un clúster de Red Hat® OpenShift® on IBM Cloud® utilizando Complemento de clúster de Image Key Synchronizer.