ファンクション・イメージの署名およびレジストリからの署名付きイメージの使用の強制

OCI Functionsを使用してファンクションをデプロイおよび起動するときに、ファンクション・イメージに署名する方法、およびOracle Cloud Infrastructure Registryからの署名付きイメージの使用を強制する方法について学習します。

コンプライアンスおよびセキュリティ上の理由から、システム管理者は多くの場合、次の条件を満たしている場合にのみ本番システムにソフトウェアをデプロイします:

  • ソフトウェアは信頼できるソースから取得されます
  • ソフトウェアが公開されてから変更されていないため、整合性が損なわれています

これらの要件を満たすために、Oracle Cloud Infrastructure Registryに格納されているイメージに署名できます。署名付きイメージは、イメージのソースとその整合性の両方を検証する方法を提供します。Oracle Cloud Infrastructure Registryを使用すると、ユーザーまたはシステムは、イメージをレジストリにプッシュして署名し、イメージ署名を作成できます。イメージ署名は、Oracle Cloud Infrastructure Vaultから取得したマスター暗号化キーにイメージを関連付けます。

Oracle Cloud Infrastructure Registryから署名付きイメージを取得するユーザーまたはシステムは、イメージのソースが信頼されていることと、イメージの整合性が損なわれていないことの両方を確信できます。詳細は、セキュリティのためのイメージの署名を参照してください。

セキュリティをさらに強化するために、OCI Functionsアプリケーションを構成して、特定のマスター暗号化キーによって署名されたOracle Cloud Infrastructure Registryのイメージに基づくファンクションの作成、更新、デプロイメントおよび呼出しのみを許可できます。大まかには、次のステップに従います:

  • Oracle Cloud Infrastructure Vaultからマスター暗号化キーを取得して、ファンクションの作成、更新、デプロイおよび起動時にOracle Cloud Infrastructure Registryにプッシュおよびプルされるイメージの署名に使用します。
  • アプリケーションのイメージ署名検証ポリシーを作成します。署名検証ポリシーは、アプリケーションでファンクションを作成、更新、デプロイおよび起動するときに、Oracle Cloud Infrastructure Registryにプッシュおよびプルされるイメージの署名に使用する必要があるマスター暗号化キーを定義します。
  • fn deployコマンドを使用して、署名検証ポリシーを持つアプリケーションにファンクションをデプロイする場合は、ファンクションのfunc.yamlファイルの署名検証ポリシーからマスター暗号化キーを指定します。Fn ProjectのCLIを使用してファンクションのイメージをOracle Cloud Infrastructure Registryにプッシュする場合、Fn ProjectのCLIはマスター暗号化キーでイメージに署名します。Fn Project CLIを使用した署名検証ポリシーを使用したアプリケーションのデプロイメント用のファンクション・イメージの署名を参照してください。
  • コンソールまたはfn create functionコマンドを使用して、署名検証ポリシーを使用してアプリケーションに新しいファンクションを作成する場合は、ポリシーのマスター暗号化キーによって署名された既存のDockerイメージに基づいてファンクションをベースにします。既存のDockerイメージからのファンクションの作成を参照してください。同様に、ファンクションを更新するときは、常に、ポリシー内のマスター暗号化キーによって署名された既存のイメージに基づいてファンクションをベースにします(ファンクションの更新を参照)。Oracle Cloud Infrastructure Registryでイメージに署名する方法については、セキュリティのためのイメージの署名を参照してください。

署名検証ポリシーを持つアプリケーション内のファンクションは、他のアプリケーションのファンクションとまったく同じ方法で起動します。ファンクションが呼び出されると、OCI Functionsはまず、Oracle Cloud Infrastructure Registryのファンクションのイメージが、アプリケーションの署名検証ポリシーで指定された暗号化キーで署名されていることを検証します。暗号化キーの検証が成功すると、OCI FunctionsOracle Cloud Infrastructure Registryからイメージをプルし、ファンクションを起動します。暗号化キーの検証が失敗した場合、エラー・コードとメッセージ(status 502: message: FunctionImageVerificationFail: Image cannot be verified or no valid signature found)は次のとおりです。

  • コール元に戻る
  • コンソール「メトリック」ページの「ファンクション・エラー」チャートに表示されます
  • コンソール「トレース」ページのデフォルトの起動スパンに示されています(ファンクション・トレースが有効な場合)

次に注意してください:

  • 署名検証ポリシーを定義するアプリケーションに最大5つの関数を含めることができます。このようなアプリケーションに6番目の関数を追加することはできません。また、すでに6つ以上の関数が含まれている既存のアプリケーションに対して署名検証ポリシーを定義することはできません。
  • 既存のアプリケーションの署名検証ポリシーを作成する前に、アプリケーション内の既存のファンクションが、ポリシーで指定するマスター暗号化キーによってすでに署名されているイメージに基づいていることを確認してください。そうしないと、署名検証ポリシーを作成できません。
  • Oracle Cloud Infrastructure Registryのイメージは、それぞれ異なるマスター暗号化キーに関連付けられた複数の署名を使用して署名できます。アプリケーションの署名検証ポリシーにマスター暗号化キーの1つが含まれている場合、アプリケーションではOracle Cloud Infrastructure Registryからイメージをプルできます。
  • アプリケーションが署名検証ポリシーを使用できるようにしても、OCI FunctionsOracle Cloud Infrastructure Registryに接続できない場合、Oracle Cloud Infrastructure Registryからイメージをプルすることはできません。

署名付きイメージの使用を強制するために必要なIAMポリシー

署名検証ポリシーを適用するには、OCI Functionsが付与されている必要があります:

  • 次のようなポリシーを使用して、Oracle Cloud Infrastructure Vaultのマスター暗号化キーを検証するためのアクセス:
    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'
  • 次のようなポリシーを使用して、Oracle Cloud Infrastructure Registryのイメージにアクセスします:
    Allow service faas to read repos in tenancy where request.operation='ListContainerImageSignatures'

署名検証ポリシーを作成するには、次の権限が付与されている必要があります。

  • 次のようなポリシーを使用して、Oracle Cloud Infrastructure Vaultのマスター暗号化キーにアクセスします:
    Allow group <groupname> to read vaults in compartment <compartment-name>
    Allow group <groupname> to use keys in compartment <compartment-name> 
    
  • 次のようなポリシーを使用して、Oracle Cloud Infrastructure Registryのイメージにアクセスします:
    Allow group <groupname> to read repos in tenancy

より限定的なポリシーを使用して、ファンクション・イメージの署名および署名検証に使用できるマスター暗号化キーを制限できます(例: OCI FunctionsサービスおよびOCI FunctionsユーザーにOracle Vaultリソースへのアクセス権を付与するポリシー・ステートメントを参照)。

ファンクション・イメージに署名する暗号化キーの取得(まだ存在しない場合)

アプリケーションの署名検証ポリシーに含めるマスター暗号化キーを取得し、アプリケーションにファンクションをデプロイするときに指定するには:

  1. Oracle Cloud Infrastructure VaultでRSAまたはECDSA非対称キーにアクセスできない場合は、既存のRSAまたはECDSA非対称キーへのアクセスを取得するか、RSAまたはECDSA非対称キーとして新しいマスター暗号化キーを作成します(マスター暗号化キーの作成を参照)。

    AES対称キーを使用したイメージの署名はサポートされていません。様々なキー・タイプの詳細は、Vaultの概要を参照してください。

  2. マスター暗号化キーのOCIDと、Oracle Cloud Infrastructure Vaultに格納されているキー・バージョンのOCIDの両方をノートにとります。マスター暗号化キーのリストを参照してください。

    これらのOCIDsは、ファンクションのデプロイ時に使用します。

アプリケーションの署名検証ポリシーの作成

アプリケーションの署名検証ポリシーを定義し、イメージの署名に使用できるマスター暗号化キーを指定するには:

  1. ファンクション開発者としてコンソールにサインインします。
  2. ナビゲーション・メニューを開き、「開発者サービス」をクリックします「ファンクション」で、「アプリケーション」をクリックします。
  3. OCI Functionsで使用しているリージョンを選択します。

    Fn ProjectのCLIコンテキストで指定されているDockerレジストリと同じリージョンを使用することをお薦めします。 Oracle Cloud Infrastructureに接続するためのFnプロジェクトのCLIコンテキストの作成を参照してください。

  4. 署名検証ポリシーを定義するアプリケーションを含むコンパートメントを選択します。

    「アプリケーション」ページには、選択したコンパートメント内のすべてのアプリケーションが表示されます。

  5. 署名検証ポリシーを定義するアプリケーションの名前をクリックします。
  6. 「リソース」で、「署名の検証」をクリックします。
  7. 「署名の検証の管理」をクリックします。
  8. 「このアプリケーションの署名の検証ポリシーの有効化」を選択して、定義した署名の検証ポリシーをアプリケーションで使用できるようにします。

    OCI FunctionsOracle Cloud Infrastructure Registryへのアクセス権を付与するポリシーがまだ存在しない場合は、そのようなポリシーを作成するように求められます。管理者の場合は、ポリシーを作成します。それ以外の場合は、管理者にポリシーの作成を依頼してください。署名付きイメージの使用を強制するために必要なIAMポリシーを参照してください。

  9. イメージの署名に使用されている必要があるOracle Cloud Infrastructure Vaultのマスター暗号化キーを選択します。

    OCI FunctionsOracle Cloud Infrastructure Vaultのマスター暗号化キーへのアクセス権を付与するポリシーがまだ存在しない場合は、そのようなポリシーを作成するように求められます。管理者の場合は、ポリシーを作成します。それ以外の場合は、管理者にポリシーの作成を依頼してください。署名付きイメージの使用を強制するために必要なIAMポリシーを参照してください。

    アプリケーション内の既存の関数は、選択したマスター暗号化キーによってすでに署名されているイメージに基づいている必要があります。そうしないと、署名検証ポリシーを作成できません。

  10. 「変更の保存」をクリックします

これから:

  • このアプリケーションでファンクションをデプロイする場合(たとえば、fn deployコマンドを使用)、イメージ署名オプションを設定する必要があります。これらのオプションは、マスター暗号化キーのOCIDなど、アプリケーションの署名検証ポリシー内のマスター暗号化キーを識別します。有効なマスター暗号化キーを指定すると、イメージはOracle Cloud Infrastructure Registryにプッシュされ、暗号化キーで署名されます。
  • コンソールまたはFn ProjectのCLIを使用して、このアプリケーションで新しいファンクションを作成(または既存のファンクションを更新)する場合は、アプリケーションの署名検証ポリシーでマスター暗号化キーを使用して署名された既存のイメージを指定する必要があります。
  • このアプリケーションのファンクションが呼び出されると、OCI FunctionsはまずOracle Cloud Infrastructure Registryのイメージを検証します。OCI Functionsは、Oracle Cloud Infrastructure Registryからイメージのみをプルし、暗号化キーの検証が成功した場合にファンクションを呼び出します。

Fn Project CLIを使用した署名検証ポリシーを使用したアプリケーションへのデプロイメント用のファンクション・イメージの署名

Fn ProjectのCLIコマンドのfn deployコマンドを使用すると、ファンクションのfunc.yamlファイルの署名検証ポリシーからマスター暗号化キーを指定することで、署名検証ポリシーを持つアプリケーションにファンクションをデプロイできます。その後、ファンクション・イメージはデプロイメント中に署名されます。

Fn ProjectのCLIを使用して、署名検証ポリシーが有効になっているアプリケーションで署名付きファンクション・イメージに基づいてファンクションをデプロイするには:

  1. ファンクションの作成およびデプロイのステップに従って、fn initコマンドを使用してファンクションを作成しますが、fn -v deployコマンドをすぐに使用しないでください。かわりに、次の手順に従って、最初にファンクションのfunc.yamlファイルにイメージ署名の詳細を追加し、次にfn -v deployコマンドを使用します。

  2. fn initコマンドを使用してファンクションを初期化したら、そのファンクションのfunc.yamlファイルを含む新しく作成されたディレクトリにディレクトリを変更します。
  3. ファンクションのfunc.yamlファイルを編集し、次のセクションを追加します。
    signing_details:
        image_compartment_id: <root-compartment-ocid>
        kms_key_id: <key-ocid>
        kms_key_version_id: <key-version-ocid>
        signing_algorithm: <signing-algorithm>

    ここでは:

    • image_compartment_id: <root-compartment-ocid>は、ファンクション・イメージをプッシュするOracle Cloud Infrastructure Registryのリポジトリを所有するテナンシのルート・コンパートメントのOCIDです。たとえば、image_compartment_id: ocid1.tenancy.oc1..aaaaaaaa___taです。
    • kms-key-id: <key-ocid>は、イメージの署名に使用するマスター暗号化キーのOCIDです。このイメージに基づくファンクションを有効な署名検証ポリシーを持つアプリケーションにデプロイするため、署名検証ポリシーに含まれるマスター暗号化キー(アプリケーションの署名検証ポリシーの作成を参照)のOCIDを指定する必要があります。たとえば、kms-key-id: ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qljです。
    • kms-key-version-id: <key-version-ocid>は、イメージの署名に使用するキー・バージョンのOCIDです。たとえば、kms-key-version-id: ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbbです。
    • signing-algorithm: <signing-algorithm>は、イメージの署名に使用する次のアルゴリズムのいずれかです。

      • 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

      選択するアルゴリズムは、マスター暗号化キーのタイプによって異なります。RSAキーの場合、サポートされている署名スキームには、PKCS #1とRSASSA-PSS、および異なるハッシュ・アルゴリズムが含まれます。ECDSAキーの場合、ECDSAは様々なハッシュ・アルゴリズムでサポートされる署名スキームです。サポートされているアルゴリズムの最新のリストは、Vault APIドキュメントの署名およびSignDataDetailsリソースを参照してください。

      たとえば、signing-algorithm: SHA_224_RSA_PKCS_PSSです。

    例:

    
    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. ファンクションのfunc.yamlファイルを含むディレクトリに、次の単一のFn Projectコマンドを入力して、ファンクションとその依存性を署名付きDockerイメージとしてビルドおよびデプロイします:
    fn -v deploy --app <app-name>

    <app-name>は、有効なイメージ検証ポリシーを持つアプリケーションの名前です。

    イメージは構築され、指定されたDockerレジストリにプッシュされ、func.yamlファイルで指定されたマスター暗号化キーおよびキー・バージョンで署名されます。署名済イメージに基づくファンクションは、コマンドで指定した有効なイメージ検証ポリシーを使用して、アプリケーションのOCIファンクションに正常にデプロイされます。

OCI CLIを使用した署名検証ポリシーを使用したアプリケーションへのデプロイメント用のファンクション・イメージの署名

Fn ProjectのCLIコマンドfn pushを使用してイメージをOracle Cloud Infrastructure Registryにプッシュした後、OCI CLIコマンドoci artifacts container image-signature sign-uploadを使用してファンクション・イメージに署名できます。その後、OCI CLIコマンドoci fn function createおよびoci fn function updateを使用して、署名付きイメージに基づくファンクションを、署名検証ポリシーを持つアプリケーションにデプロイできます。

OCI CLIを使用して、署名検証ポリシーが有効になっているアプリケーションで署名付きファンクション・イメージに基づくファンクションをデプロイするには:

  1. ファンクションの作成およびデプロイのステップに従ってファンクションを作成しますが、fn -v deployコマンドは使用しないでください。fn -v deployを使用するかわりに、次の番号付きステップに従って次のことを行います。

    • fn -v buildコマンドを使用して、ファンクションとその依存性をDockerイメージとしてビルドします
    • fn -v pushコマンドを使用して、イメージにタグ付けし、コンテナ・レジストリにプッシュします
    • oci artifacts container image-signature sign-uploadコマンドを使用してイメージに署名します。
    • oci fn function createコマンドを使用して、署名付きイメージに基づくファンクションを作成します(または、oci fn function updateコマンドを使用して、署名付きイメージに基づく既存のファンクションを使用します)。
  2. fn -v buildコマンドを使用して、ファンクションとその依存関係をDockerイメージとして構築します。例:
    fn -v build
  3. 前のコマンドの出力に示されたイメージ名をノートにとります。

    たとえば、イメージ名はphx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1です。

  4. fn -v pushコマンドを使用して、イメージをコンテナ・レジストリにプッシュします。例:
    fn -v push
  5. コンソール(イメージおよびイメージの詳細の表示を参照)を使用するか、CLI (oci artifacts container image list --compartment-id <compartment-ocid> --repository-name <repository-name>コマンドを使用)を使用して、イメージのOCIDを取得します。
  6. Sign the image you pushed to Container Registry using the master key and key version in the Vault service, creating an image signature, by entering:
    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>
    ここでは:
    • --compartment-id <compartment-ocid>は、イメージのリポジトリが属するコンパートメントのOCIDです。たとえば、--compartment-id ocid1.compartment.oc1..aaaaaaaa23______smwaです。
    • --kms-key-id <key-ocid>は、イメージの署名に使用するマスター暗号化キーのOCIDです。署名検証ポリシーが有効なアプリケーションで、このイメージに基づくファンクションを作成するため、署名検証ポリシーに含まれるマスター暗号化キー(アプリケーションの署名検証ポリシーの作成を参照)のOCIDを指定する必要があります。たとえば、--kms-key-id ocid1.key.oc1.phx.bbqehaq3aadfa.abyh______qljです。
    • --kms-key-version-id <key-version-ocid>は、イメージの署名に使用するキー・バージョンのOCIDです。たとえば、--kms-key-version-id ocid1.keyversion.oc1.phx.0.bbqehaq3aadfa.acy6______mbbです。
    • --signing-algorithm <signing-algorithm>は、イメージの署名に使用する次のアルゴリズムのいずれかです。

      • 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

      選択するアルゴリズムは、マスター暗号化キーのタイプによって異なります。RSAキーの場合、サポートされている署名スキームには、PKCS #1とRSASSA-PSS、および異なるハッシュ・アルゴリズムが含まれます。ECDSAキーの場合、ECDSAは様々なハッシュ・アルゴリズムでサポートされる署名スキームです。サポートされているアルゴリズムの最新のリストは、Vault APIドキュメントの署名およびSignDataDetailsリソースを参照してください。

      たとえば、--signing-algorithm SHA_224_RSA_PKCS_PSSです。

    • --image-id <image-ocid>は、署名するイメージのOCIDです。たとえば、--image-id ocid1.containerimage.oc1.phx.0.ansh81vru1zp.aaaaaaaalqzj______yksです。
    • --description <signature-description>は、イメージを説明する任意のテキストです。説明は署名の一部として含まれ、コンソールに表示されます。たとえば、--description "Image for UAT testing"です。

    例:

    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"

    ファンクション・イメージは、アプリケーションの署名検証ポリシーで指定されたものと同じマスター暗号化キーで署名されるようになりました。

  7. 署名付きイメージに基づいて新しい関数を作成する場合は、次のように入力します。

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

    ここでは:

    • <app-ocid>は、有効な署名検証ポリシーを持つアプリケーションのOCIDで、新しいファンクションを作成します。
    • <function-name>は、作成する新しいファンクションの名前です。機密情報の入力は避けてください。
    • <image-name>は、新しいファンクションのベースとなるDockerレジストリ内の署名付きイメージの名前です。
    • <memory>は、新しいファンクションで使用可能な最大メモリーです。

    例:

    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

    署名検証ポリシーを持つ新しいファンクションがアプリケーションに正常に作成されます。この関数は、署名付きイメージおよび指定した名前に基づいています。

  8. 関数が署名付きイメージに基づいているように既存の関数を更新する場合は、次のように入力して既存の関数を更新します。

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

    ここでは:

    • <function-id>は、更新する既存のファンクションのOCIDです。
    • <image-name>は、ファンクションのベースとなるDockerレジストリ内の署名付きイメージの名前です。

    例:

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