IBM Cloud Docs
Container Registry でのコンテンツ機密性のためのイメージ暗号化

Container Registry でのコンテンツ機密性のためのイメージ暗号化

IBM Cloud® Container Registry のイメージの機密性を保護し、信頼できないホストではイメージを実行不能にすることができます。

暗号化された画像を作成し、 秘密鍵を持って対応する公開鍵のみが暗号化解除できるメッセージを暗号化するために使用される算法パターン。 秘密鍵は、対応する公開鍵によって暗号化されたメッセージの暗号化解除にも使用されます。 秘密鍵はユーザーのシステム上に保持され、パスワードによって保護されています。いない人がコンテンツにアクセスできないようにする。 RSA の公開鍵と秘密鍵のペアを使用してイメージの暗号化と復号を行うことにより、暗号化されたイメージを作成します。 公開鍵は秘密にされないので、誰でもそれを使用してイメージを暗号化できます。 秘密鍵は秘密にされ、秘密鍵を持つユーザーだけがそれを使用してイメージを復号できます。

暗号化は IBM Cloud Container Registry でサポートされ、以下の規格に準拠しています。

イメージの暗号化について詳しくは、 暗号化されたコンテナ・イメージによるコンテナ・イメージの静止時セキュリティ および 「コンテナイメージの暗号化によるイメージセキュリティとコンプライアンスの向上」を参照してください。

開始前に

  • IBM Cloud Container Registry の概説の指示を完了します。
  • IBM Cloud CLI に関する container-registry CLI プラグインの最新バージョンがあることを確認します。container-registry CLI プラグインの更新を参照してください。
  • 暗号化されたイメージのプッシュ先となるプライベート名前空間があることを確認します。名前空間のセットアップを参照してください。
  • Buildah バージョン 1.15 以降をインストールし、暗号化されたイメージを構築できるようにする。 Buildah は Linux® 環境でのみ機能します。 Linux® の代わりに、仮想マシンまたは Docker イメージを使用して Buildah を実行し、イメージをビルドすることもできます。
  • Podman をインストールします。

公開鍵と秘密鍵のペアの作成

OpenSSL コマンドを使用して公開鍵と秘密鍵のペアを作成します。

  1. 鍵を保管するための作業ディレクトリー (USER_KEYS など) を作成します。その後、そのディレクトリーに移動します。

    mkdir USER_KEYS; cd USER_KEYS
    
  2. OpenSSL を使用して秘密鍵を作成します。USER_KEY は鍵の ID です。

    openssl genrsa --out USER_KEYPrivate.pem
    
  3. 公開鍵を作成します。

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

    実動で秘密鍵を使用するには、秘密鍵を適切なストア内に安全に保管して保護する必要があります。 公開鍵も同じ方法で管理できます。 詳しくは、鍵の保管を参照してください。

  4. キーをリストして、それらが作成されたことを確認します。

    ls -l
    
  5. この鍵ペアを使用してイメージを暗号化するには、次の cat コマンドを実行して公開鍵を表示します。

    cat USER_KEYPub.pem
    

    以下の出力のような応答が表示されます。

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

イメージの暗号化

公開鍵を使ってイメージを暗号化し、 Dockerfileを使ってDocker イメージをビルドするための指示が含まれるテキスト・ファイル。コンテナ・イメージを構築する。

  1. アプリケーションを保管したディレクトリー (MY_APPなど) に移動します。

    cd MY_APP
    
  2. 次のコマンドを実行して Dockerfile を作成します。

    cat << EOF >> Dockerfile
    FROM nginx:latest
    RUN echo "some secret" > /secret-file
    EOF
    
  3. Buildah を使って暗号化されていないイメージを作成するには、以下のコマンドを実行します。 NAMESPACE はあなたのネームスペースです:

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

    us.icr.io/NAMESPACE/MY_APP は、ローカル・イメージ・ストアにコミットされます。

  4. 以下のコマンドを実行し、イメージの暗号化のために JSON Web Encryption (jwe) プロトコルを指定することにより、公開鍵を使用してイメージを暗号化し、そのイメージをレジストリーにアップロードします。USER_KEYS/USER_KEYPub.pem は暗号鍵です。

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

    Buildah バージョン 1.15 以降では、Docker のログイン資格情報を使用して認証します。 これらの認証情報が機能しない場合や、 APIキーをAPIリクエストの認証と承認に使用される固有のコード。 このコードは、呼び出し元のアプリケーションまたはユーザーを識別し、APIの使用状況を追跡・管理するためにAPIに渡されます。使用したい場合は、 —-creds <username> オプションを指定することができる。 <username> はユーザー名である。 —-creds <username> オプションを使用する場合は、要求されたときにレジストリのクレデンシャルのパスワードを入力する。

    マニフェストがイメージの宛先 (つまりレジストリー) に書き込まれたことを示す応答を受け取ります。

  5. レジストリーを調べて、そこにイメージがあることを確認してください。

イメージのプルおよび復号

レジストリーからイメージをプルし、秘密鍵を使用してそれを復号します。

  1. レジストリーからプルし、ローカル・キャッシュを使用することがないように、ローカルのイメージを削除します。

    buildah rmi -f us.icr.io/NAMESPACE/MY_APP
    
  2. (オプション) 復号鍵を指定しないでイメージをプルしてみると、イメージを復号できないことが確認できます。

    buildah pull us.icr.io/NAMESPACE/MY_APP
    

    出力には、以下のようなメッセージが含まれます。

    ...<truncated>...
    Error decrypting layer sha256:ab4ea03582e08a8e8fc35b778cc6f1a1fa797469fa9cc61cee85f703b316bb12: missing private key needed for decryption
    ERRO exit status 125
    
  3. Buildah を使用して、復号鍵によりイメージをプルします。USER_KEYS/USER_KEYPrivate.pem は復号鍵、us.icr.io/NAMESPACE/MY_APP はレジストリーです。

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

    暗号化されたイメージがレジストリーから取得され、復号され、ローカル・イメージ・ストアに保管されます。

  4. Podman を実行して、イメージが保管されたことを確認します。

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

鍵の保管

実動で秘密鍵を使用するには、秘密鍵を安全に保管して保護する必要があります。 公開鍵も同じ方法で管理して、イメージをビルドできるユーザーを制御できます。 IBM Key Protect を使用して、鍵を保管し、保護することができます。

IBM Key Protect は、非対称 PKI 鍵ではなくイメージの暗号化に使用される対称鍵を保管します。 ダッシュボード、CLI、または API を使用することにより、それらの鍵を 2 つの IBM Key Protect 標準鍵として個別に追加できます。IBM Key Protect では、Base64 データだけがインポートされる必要があります。 純粋な Base64 データを取得するために、Base64 のコンテンツをロードする前に "openssl enc -base64 -A -in USER_KEYPrivate.pem -out USER_KEYPrivate.b64" を実行して PEM ファイルをエンコードできます。そして、"openssl enc -base64 -A -d -in USER_KEYPrivate..b64 -out USER_KEYPrivate.pem" を実行して、その操作をリバースし、使用可能な鍵を再取得できます。

IBM Key Protect を使用して鍵を保管および保護する方法について詳しくは、暗号鍵をクラウドに移行するおよび独自の鍵のインポートを参照してください。

代わりに、IBM Key Protect ルート鍵を使用して鍵をラップすることにより、それらの鍵を独自のストア内で保護することもできます。 この操作では、IBM Key Protect と有効なルート鍵を使用して、それらを再びアンラップすることが必要になります。

例えば、CLI を使用して鍵をラップするにはコマンド "ibmcloud kp key wrap ROOT_KEY_ID -p <base64 encoded image key>" を実行し、鍵をアンラップするにはコマンド "ibmcloud kp key unwrap ROOT_KEY_ID -p <base64 cyphertext> を実行します。ROOT_KEY_ID は、使用しているルート鍵の ID です。

IBM Key Protect ルート鍵を使用して鍵をラップすることによってそれらの鍵を独自のストア内で保護する方法について詳しくは、鍵のラッピングを参照してください。

暗号化されたイメージは、Vulnerability Advisorにスキャンされません。

次のステップ

Image Key Synchronizer クラスター・アドオンを使用して、暗号化されたイメージを Red Hat OpenShift on IBM Cloud クラスターで実行します。