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

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

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

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

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

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

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

  • 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ファンクションはまず、Oracle Cloud Infrastructure Registryの関数のイメージが、アプリケーションの署名検証ポリシーで指定された暗号化キーで署名されていることを検証します。暗号化キーの検証が成功すると、OCIファンクションOracle 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ファンクションOracle Cloud Infrastructure Registryに接続できない場合、Oracle Cloud Infrastructure Registryからイメージをプルすることはできません。

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

署名検証ポリシーを強制するには、OCIファンクションが付与されている必要があります:

  • 次のようなポリシーを使用して、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ファンクション・サービスおよびOCIファンクション・ユーザーにOracle Vaultリソースへのアクセス権を付与するポリシー・ステートメントを参照)。

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

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

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

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

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

    これらのOCIDは、関数のデプロイ時に使用します。

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

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

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

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

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

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

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

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

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

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

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

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

今後:

  • このアプリケーションにファンクションをデプロイする場合(fn deployコマンドを使用する場合など)、イメージ署名オプションを設定する必要があります。これらのオプションでは、マスター暗号化キーのOCIDなど、アプリケーションの署名検証ポリシーのマスター暗号化キーを識別します。有効なマスター暗号化キーを指定すると、イメージはOracle Cloud Infrastructure Registryにプッシュされ、暗号化キーで署名されます。
  • コンソールまたはFn ProjectのCLIを使用してこのアプリケーションで新規ファンクションを作成(または既存のファンクションを更新)する場合は、アプリケーションの署名検証ポリシーのマスター暗号化キーを使用して署名された既存のイメージを指定する必要があります。
  • このアプリケーションのファンクションが呼び出されると、OCIファンクションはまずOracle Cloud Infrastructure Registryのイメージを検証します。OCIファンクションは、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. 次のように入力して、ボールト・サービスのマスター・キーとキー・バージョンを使用してコンテナ・レジストリにプッシュしたイメージを署名します。
    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