ファンクション・イメージの署名およびレジストリからの署名付きイメージの使用の強制
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ファンクションはまず、Oracle Cloud Infrastructure Registryのファンクションのイメージが、アプリケーションの署名検証ポリシーで指定された暗号化キーで署名されていることを検証します。暗号化キーの検証が成功すると、OCI Functionsは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 Functionsが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 FunctionsサービスおよびOCI FunctionsユーザーにOracle Vaultリソースへのアクセス権を付与するポリシー・ステートメントを参照)。
ファンクション・イメージに署名する暗号化キーの取得(まだ存在しない場合)
アプリケーションの署名検証ポリシーに含めるマスター暗号化キーを取得し、アプリケーションにファンクションをデプロイするときに指定するには:
-
Oracle Cloud Infrastructure VaultでRSAまたはECDSA非対称キーにアクセスできない場合は、既存のRSAまたはECDSA非対称キーへのアクセス権を取得するか、RSAまたはECDSA非対称キーとして新しいマスター暗号化キーを作成します(マスター暗号化キーの作成を参照)。
AES対称キーを使用したイメージの署名はサポートされていません。様々なキー・タイプの詳細は、Vaultの概要を参照してください。
-
マスター暗号化キーのOCIDと、Oracle Cloud Infrastructure Vaultに格納されているキー・バージョンのOCIDの両方をノートにとります。マスター暗号化キーのリストを参照してください。
これらのOCIDsは、ファンクションのデプロイ時に使用します。
アプリケーションの署名検証ポリシーの作成
アプリケーションの署名検証ポリシーを定義し、イメージの署名に使用できるマスター暗号化キーを指定するには:
- 「アプリケーション」リスト・ページで、署名検証ポリシーを定義するアプリケーションを選択します。リストページまたはアプリケーションの検索に関するヘルプが必要な場合は、Listing Applicationsを参照してください。
- 「リソース」で、「署名検証」を選択します。
- 「署名の検証の管理」を選択します。
- 「このアプリケーションの署名の検証ポリシーの有効化」を選択して、定義した署名の検証ポリシーをアプリケーションで使用できるようにします。
OCI FunctionsにOracle Cloud Infrastructure Registryへのアクセス権を付与するポリシーがまだ存在しない場合は、そのようなポリシーを作成するように求められます。管理者の場合は、ポリシーを作成します。それ以外の場合は、管理者にポリシーの作成を依頼してください。署名付きイメージの使用を強制するために必要なIAMポリシーを参照してください。
-
イメージの署名に使用されている必要があるOracle Cloud Infrastructure Vaultのマスター暗号化キーを選択します。
OCI FunctionsにOracle Cloud Infrastructure Vaultのマスター暗号化キーへのアクセス権を付与するポリシーがまだ存在しない場合は、そのようなポリシーを作成するよう求められます。管理者の場合は、ポリシーを作成します。それ以外の場合は、管理者にポリシーの作成を依頼してください。署名付きイメージの使用を強制するために必要なIAMポリシーを参照してください。
アプリケーション内の既存の関数は、選択したマスター暗号化キーによってすでに署名されているイメージに基づいている必要があります。そうしないと、署名検証ポリシーを作成できません。
-
「Save Changes」を選択します。
これから:
- このアプリケーションでファンクションをデプロイする場合(たとえば、
fn deploy
コマンドを使用)、イメージ署名オプションを設定する必要があります。これらのオプションは、マスター暗号化キーのOCIDなど、アプリケーションの署名検証ポリシー内のマスター暗号化キーを識別します。有効なマスター暗号化キーを指定すると、イメージはOracle Cloud Infrastructure Registryにプッシュされ、暗号化キーで署名されます。 - コンソールまたはFn ProjectのCLIを使用して、このアプリケーションで新しいファンクションを作成(または既存のファンクションを更新)する場合は、アプリケーションの署名検証ポリシーでマスター暗号化キーを使用して署名された既存のイメージを指定する必要があります。
- このアプリケーションのファンクションが呼び出されると、OCIファンクションはまずOracle Cloud Infrastructure Registryのイメージを検証します。OCI Functionsは、Oracle Cloud Infrastructure Registryからイメージのみをプルし、暗号化キーの検証が成功した場合にファンクションを呼び出します。
Fn Project CLIを使用した署名検証ポリシーを使用したアプリケーションへのデプロイメント用のファンクション・イメージの署名
Fn ProjectのCLIコマンドのfn deploy
コマンドを使用すると、ファンクションのfunc.yamlファイルの署名検証ポリシーからマスター暗号化キーを指定することで、署名検証ポリシーを持つアプリケーションにファンクションをデプロイできます。その後、ファンクション・イメージはデプロイメント中に署名されます。
Fn ProjectのCLIを使用して、署名検証ポリシーが有効になっているアプリケーションで署名付きファンクション・イメージに基づいてファンクションをデプロイするには:
-
ファンクションの作成およびデプロイのステップに従って、
fn init
コマンドを使用してファンクションを作成しますが、fn -v deploy
コマンドをすぐに使用しないでください。かわりに、次の手順に従って、最初にファンクションのfunc.yamlファイルにイメージ署名の詳細を追加し、次にfn -v deploy
コマンドを使用します。 fn init
コマンドを使用してファンクションを初期化したら、そのファンクションのfunc.yamlファイルを含む新しく作成されたディレクトリにディレクトリを変更します。- ファンクションの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
- ファンクションの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を使用して、署名検証ポリシーが有効になっているアプリケーションで署名付きファンクション・イメージに基づくファンクションをデプロイするには:
-
ファンクションの作成およびデプロイのステップに従ってファンクションを作成しますが、
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
コマンドを使用して、署名付きイメージに基づく既存のファンクションを使用します)。
fn -v build
コマンドを使用して、ファンクションとその依存関係をDockerイメージとして構築します。例:fn -v build
-
前のコマンドの出力に示されたイメージ名をノートにとります。
たとえば、イメージ名は
phx.ocir.io/ansh81vru1zp/helloworld/helloworld-func:0.0.1
です。 fn -v push
コマンドを使用して、イメージをコンテナ・レジストリにプッシュします。例:fn -v push
- コンソール(イメージおよびイメージの詳細の表示を参照)を使用するか、CLI (
oci artifacts container image list --compartment-id <compartment-ocid> --repository-name <repository-name>
コマンドを使用)を使用して、イメージのOCIDを取得します。 - Vaultサービスでマスター・キーとキー・バージョンを使用してコンテナ・レジストリにプッシュしたイメージに署名し、次のように入力してイメージ署名を作成します:
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"
ファンクション・イメージは、アプリケーションの署名検証ポリシーで指定されたものと同じマスター暗号化キーで署名されるようになりました。
-
署名付きイメージに基づいて新しい関数を作成する場合は、次のように入力します。
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
署名検証ポリシーを持つ新しいファンクションがアプリケーションに正常に作成されます。この関数は、署名付きイメージおよび指定した名前に基づいています。
-
関数が署名付きイメージに基づいているように既存の関数を更新する場合は、次のように入力して既存の関数を更新します。
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