FIPS互換性の有効化

いくつかの特定の要件およびベスト・プラクティスが採用されていれば、TerraformおよびOracle Cloud Infrastructure (OCI) Terraformプロバイダの特別なFIPS互換バージョンを使用できます。このトピックでは、これらの要件およびプラクティスに関するガイダンスを提供します。

FIPS暗号化

最高のセキュリティ標準を確保するには、TerraformからOCIエンドポイントへのトラフィックが、FIPS認定済暗号化を使用してHTTPクライアントで確立されたTLS接続を介して転送されるようにする必要があります。

標準のOCI Terraformプロバイダは、Goで実装されています。Goのネイティブ暗号化実装は、OCIエンドポイントとのセキュアなTLS接続を完全に確立できますが、FIPS認定されていません。

FIPS準拠の接続を介してOCIエンドポイントに送信するTerraformトラフィックには、FIPS認証済暗号化を使用する特別なバージョンのTerraformプロバイダを使用する必要があります。このバージョンのOCI Terraformプロバイダは、Goのネイティブ暗号化実装ではなく、FIPS 140-2認定Oracle Cloud Infrastructure Cryptographic Library for Kubernetesを使用します。Oracle Cloud Infrastructure Cryptographic Library for Kubernetesの詳細は、こちらを参照してください。

FIPS準拠のTerraformプロバイダのインストール

FIPS準拠のOCI Terraformプロバイダは、Oracle Linuxでのみ使用できます。yumを使用してプロバイダをインストールできます。

ヒント

OCI Terraformプロバイダをインストールする前に、HashiCorpからTerraformをダウンロードしてインストールするか、yumを使用してTerraformをインストールします。

既存のOCI Terraformプロバイダ・パッケージがOracle Linuxマシンにすでにインストールされている場合は、最初にそれらを削除します:

yum remove terraform-provider-oci

Oracle Linuxマシンから次のyumコマンドを実行して、FIPS互換のOCI Terraformプロバイダをインストールします:

yum install terraform-provider-oci-fips

Terraformプロバイダの構成

  1. 環境変数を追加して、Terraformのターゲット・リージョンを設定します:

    echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
  2. 環境変数を追加して、TerraformとOCI Terraformプロバイダ間のプロセス間トラフィック暗号化を無効にします:

    echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
  3. 環境変数を追加して、TerraformがHashiCorpチェックポイント・サービスにアクセスしないようにします:

    echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
  4. Terraformプロバイダの認証方法を構成します。詳細は、「認証」を参照してください。

単一リージョンでのTerraformの操作

TerraformとOCIサービス間のトラフィックがパブリック・インターネット・インフラストラクチャを経由して転送されないように、TerraformとOCI Terraformプロバイダは、作成および管理するリソースと同じリージョンでホストされているコンピュート・インスタンスから実行することをお薦めします。

コンピュート・インスタンスの作成

TerraformとOCI TerraformプロバイダをOracle Linuxマシンにインストールしたら、Terraformと次のサンプルTerraform構成ファイルを使用できます:

  • 指定されたコンピュート・インスタンスを作成し、同じリージョン内に追加のインフラストラクチャをプロビジョニングするために使用できます。
  • Terraformおよび最新のFIPS準拠のOCI Terraformプロバイダを新しいインスタンスにインストールします。
  • サービス・ゲートウェイを使用して、インスタンスとの通信をOCIエンドポイントおよびHTTPSに制限します。
  • インスタンス・プリンシパル認証を有効にします。

詳細は、構成の作成を参照してください。

コンピュート・インスタンスを作成するには:

  1. main.tfファイルをOracle Linuxマシンにコピーします。
  2. Terraform構成ファイルの変数に移入するために必要な情報を収集します。
  3. プラットフォーム・イメージ」を参照して、リージョンのOracle LinuxイメージOCID値を見つけます。Terraform構成ファイルのoel-image値を変更します。
  4. Terraform構成ファイルが含まれるディレクトリでTerraformを初期化します:

    terraform init
  5. Terraform構成を適用します:

    terraform plan
    terraform apply
重要

instance-ip出力変数は、新しいコンピュート・インスタンスにサインインするために使用する必要があるIPアドレスを提供します。

main.tf
variable "tenancy_ocid" {
}
 
variable "user_ocid" {
}
 
variable "fingerprint" {
}
 
variable "private_key_path" {
}
 
variable "region" {
}
 
variable "compartment_ocid" {
}
 
variable "ssh_public_key" {
}
 
variable "ssh_private_key" {
}
 
locals {
  prefix    = "terraform"
  oel-image = "<Oracle_Linux_image_OCID>"
  vm-shape  = "VM.Standard2.1"
 
  user-data = <<EOF
#!/bin/bash -x
echo "export TF_VAR_auth='InstancePrincipal'" >> ~/.bash_profile
echo "export TF_VAR_region='${var.region}'" >> ~/.bash_profile
yum install -y terraform terraform-provider-oci-fips
EOF
 
}
 
provider "oci" {
  tenancy_ocid     = var.tenancy_ocid
  user_ocid        = var.user_ocid
  fingerprint      = var.fingerprint
  private_key_path = var.private_key_path
  region           = var.region
}
 
resource "oci_core_vcn" "vcn1" {
  compartment_id = var.compartment_ocid
  display_name   = "${local.prefix}Vcn"
  cidr_block     = "10.0.0.0/16"
}
 
resource "oci_core_subnet" "subnet1" {
  compartment_id    = var.compartment_ocid
  vcn_id            = oci_core_vcn.vcn1.id
  cidr_block        = "10.0.0.0/24"
  display_name      = "${local.prefix}Subnet"
  security_list_ids = [oci_core_vcn.vcn1.default_security_list_id]
  route_table_id    = oci_core_vcn.vcn1.default_route_table_id
  dhcp_options_id   = oci_core_vcn.vcn1.default_dhcp_options_id
}
 
resource "oci_core_internet_gateway" "internet-gateway1" {
  compartment_id = var.compartment_ocid
  vcn_id         = oci_core_vcn.vcn1.id
  display_name   = "${local.prefix}InternetGateway"
}
 
resource "oci_core_default_route_table" "route-table1" {
  manage_default_resource_id = oci_core_vcn.vcn1.default_route_table_id
  display_name               = "${local.prefix}RouteTable"
 
  route_rules {
    destination       = "0.0.0.0/0"
    destination_type  = "CIDR_BLOCK"
    network_entity_id = oci_core_internet_gateway.internet-gateway1.id
  }
}
 
data "oci_core_services" "service-gateway-services" {
  filter {
    name   = "name"
    values = ["All .* Services In Oracle Services Network"]
    regex  = true
  }
}
 
resource "oci_core_service_gateway" "service-gateway1" {
  compartment_id = var.compartment_ocid
  vcn_id         = oci_core_vcn.vcn1.id
  display_name   = "${local.prefix}ServiceGateway"
 
  services {
    service_id = data.oci_core_services.service-gateway-services.services[0]["id"]
  }
}
 
resource "oci_core_default_security_list" "security-list1" {
  manage_default_resource_id = oci_core_vcn.vcn1.default_security_list_id
  display_name               = "${local.prefix}SecurityList"
 
  // inbound ssh traffic
  ingress_security_rules {
    protocol  = "6" // tcp
    source    = "0.0.0.0/0"
    stateless = false
 
    tcp_options {
      min = 22
      max = 22
    }
  }
 
  // outbound traffic to OCI services
  egress_security_rules {
    destination      = data.oci_core_services.service-gateway-services.services[0]["cidr_block"]
    destination_type = "SERVICE_CIDR_BLOCK"
    protocol         = "6"
 
    tcp_options {
      max = "443"
      min = "443"
    }
  }
 
  // outbound tcp traffic on all ports
  egress_security_rules {
    destination = "0.0.0.0/0"
    protocol    = "6"
  }
}
 
data "oci_identity_compartment" "compartment1" {
  id = var.compartment_ocid
}
 
resource "oci_identity_dynamic_group" "dynamic-group1" {
  compartment_id = var.tenancy_ocid
  name           = "${local.prefix}DynamicGroup"
  description    = "Dynamic Group for executing Terraform with Instance Principal authentication"
  matching_rule  = "ANY {instance.compartment.id = '${var.compartment_ocid}'}"
}
 
resource "oci_identity_policy" "instance-principal-policy1" {
  compartment_id = var.compartment_ocid
  name           = "${local.prefix}Policy"
  description    = "Policy to allow Instance Principal Terraform execution"
  statements     = ["ALLOW dynamic-group ${oci_identity_dynamic_group.dynamic-group1.name} to manage all-resources IN compartment ${data.oci_identity_compartment.compartment1.name}"]
}
 
data "oci_identity_availability_domain" "ad" {
  compartment_id = var.tenancy_ocid
  ad_number      = 1
}
 
resource "oci_core_instance" "instance1" {
  availability_domain = data.oci_identity_availability_domain.ad.name
  compartment_id      = var.compartment_ocid
  display_name        = "${local.prefix}Instance"
  shape               = local.vm-shape
 
  source_details {
    source_type = "image"
    source_id   = local.oel-image
  }
 
  metadata = {
    ssh_authorized_keys = var.ssh_public_key
    user_data           = base64encode(local.user-data)
    tenancy_ocid        = var.tenancy_ocid
  }
 
  create_vnic_details {
    subnet_id        = oci_core_subnet.subnet1.id
    assign_public_ip = true
  }
}
 
output "instance-ip" {
  value = [oci_core_instance.instance1.public_ip]
}

インスタンスへのサインイン

次のSSHコマンドを使用してインスタンスにアクセスします:

$ ssh –i <private_key_path> <username>@<instance_ip_address>

<private_key_path>は、アクセスするインスタンスに関連付けられた秘密キーを含むファイルのフルパスおよび名前です。

<username>は、インスタンスのデフォルト・ユーザー名です。Oracle Linuxイメージの場合、デフォルト・ユーザー名はopcです。

<instance_ip_address>は、Terraformコマンドの出力であったインスタンスIPアドレスです。

インスタンスでのTerraformのインストールおよび構成

  1. yumを使用して、TerraformおよびFIPS互換のOCI Terraformプロバイダをインスタンスにインストールします:

    yum install -y terraform terraform-provider-oci-fips
  2. 環境変数を追加して、bashプロファイルに対してインスタンス・プリンシパル認証を有効にします:

    echo "export TF_VAR_auth='InstancePrincipal'" >> ${HOME}/.bash_profile
  3. 環境変数を追加して、Terraformのターゲット・リージョンを設定します:

    echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
  4. 環境変数を追加して、TerraformとOCI Terraformプロバイダ間のプロセス間トラフィック暗号化を無効にします:

    echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
  5. 環境変数を追加して、TerraformがHashiCorpチェックポイント・サービスにアクセスしないようにします:

    echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
  6. インスタンスを終了します:

    exit

セキュリティ・ルールの実装

新しいインスタンスを使用してTerraformを実行する前に、セキュリティ・ルールを更新して、OCIサービス以外のサードパーティ・エンドポイントに対するエグレス・トラフィックを防止する必要があります。これを行うには、Terraform構成ファイルのsecurity-list1リソースから次のエグレス・ルールを削除し、Oracle Linuxマシンからterraform applyを実行します:

// outbound tcp traffic on all ports
// remove this rule or comment it out to prevent egress traffic to third-party endpoints
#egress_security_rules {
#  destination = "0.0.0.0/0"
#  protocol    = "6"
#}
ヒント

OCIコンソールを使用して、新しいインスタンスのセキュリティ・ルールを更新することもできます。

インスタンスからのTerraformの実行

インスタンスを作成し、そのインスタンスでTerraformをインストールおよび構成してセキュリティ・ルールを更新したら、Terraformを使用して同じリージョン内に追加のOCIインフラストラクチャをプロビジョニングできます。追加のTerraform構成ファイルをインスタンスにコピーし、そのインスタンスにサインインして、他のTerraformプロバイダと同様にTerraformコマンドを実行します:

ssh -i <private_key_path> opc@<instance_ip_address>
terraform init
terraform apply