FIPS互換性の有効化
Oracle Cloud Infrastructure Terraformプロバイダを使用しながら、FIPSコンプライアンスを維持します。
いくつかの特定の要件およびベスト・プラクティスが採用されていれば、TerraformおよびOracle Cloud Infrastructure (OCI) Terraformプロバイダの特別なFIPS互換バージョンを使用できます。このトピックでは、これらの要件およびプラクティスに関するガイダンスを提供します。
FIPS暗号化
最高のセキュリティ標準を確保するには、TerraformからOCIエンドポイントへのトラフィックが、FIPS認定済暗号化を使用してHTTPクライアントで確立されたTLS接続を介して転送されるようにする必要があります。
標準のOCI Terraformプロバイダは、Goで実装されています。Goのネイティブ暗号化実装は、OCIエンドポイントとのセキュアなTLS接続を完全に確立できますが、FIPS認定されていません。
FIPS準拠の接続を介してTerraformトラフィックをOCIエンドポイントに転送するには、FIPS認定済の暗号化を使用する特別なバージョンのTerraformプロバイダを使用する必要があります。このバージョンのOCI Terraformプロバイダは、Goのネイティブ暗号化実装ではなく、FIPS 140-2認定のOracle Cloud Infrastructure for BoringCryptoを使用します。Oracle Cloud Infrastructure for BoringCryptoの詳細は、こちらを参照してください。
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プロバイダの構成
-
環境変数を追加して、Terraformのターゲット・リージョンを設定します:
echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
-
環境変数を追加して、TerraformとOCI Terraformプロバイダ間のプロセス間トラフィック暗号化を無効にします:
echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
-
環境変数を追加して、TerraformがHashiCorpチェックポイント・サービスにアクセスしないようにします:
echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
- Terraformプロバイダの認証方法を構成します。詳細は、「認証」を参照してください。
単一リージョンでのTerraformの操作
TerraformとOCIサービス間のトラフィックがパブリック・インターネット・インフラストラクチャを経由して転送されないように、TerraformとOCI Terraformプロバイダは、作成および管理するリソースと同じリージョンでホストされているコンピュート・インスタンスから実行することをお薦めします。
コンピュート・インスタンスの作成
TerraformとOCI TerraformプロバイダをOracle Linuxマシンにインストールしたら、Terraformと次のサンプルTerraform構成ファイルを使用できます:
- 同じリージョン内に追加のインフラストラクチャをプロビジョニングする際に使用できる指定のコンピュート・インスタンスを作成します。
- Terraformおよび最新のFIPS準拠のOCI Terraformプロバイダを新しいインスタンスにインストールします。
- サービス・ゲートウェイを使用して、インスタンスとの通信をOCIエンドポイントおよびHTTPSに制限します。
- インスタンス・プリンシパル認証を有効にします。
詳細は、構成の作成を参照してください。
コンピュート・インスタンスを作成するには:
main.tf
ファイルをOracle Linuxマシンにコピーします。- Terraform構成ファイルの変数に移入するために必要な情報を収集します。
- 「プラットフォーム・イメージ」を参照して、ご使用のリージョンのOracle LinuxイメージのOCID値を特定します。Terraform構成ファイルの
oel-image
値を変更します。 -
Terraform構成ファイルが含まれるディレクトリでTerraformを初期化します:
terraform init
-
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 = "<shape_name>"
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のインストールおよび構成
-
yumを使用して、TerraformおよびFIPS互換のOCI Terraformプロバイダをインスタンスにインストールします:
yum install -y terraform terraform-provider-oci-fips
-
環境変数を追加して、bashプロファイルに対してインスタンス・プリンシパル認証を有効にします:
echo "export TF_VAR_auth='InstancePrincipal'" >> ${HOME}/.bash_profile
-
環境変数を追加して、Terraformのターゲット・リージョンを設定します:
echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
-
環境変数を追加して、TerraformとOCI Terraformプロバイダ間のプロセス間トラフィック暗号化を無効にします:
echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
-
環境変数を追加して、TerraformがHashiCorpチェックポイント・サービスにアクセスしないようにします:
echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
-
インスタンスを終了します:
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"
#}
インスタンスからのTerraformの実行
インスタンスを作成し、そのインスタンスでTerraformをインストールおよび構成してセキュリティ・ルールを更新したら、Terraformを使用して同じリージョン内に追加のOCIインフラストラクチャをプロビジョニングできます。追加のTerraform構成ファイルをインスタンスにコピーし、そのインスタンスにサインインして、他のTerraformプロバイダと同様にTerraformコマンドを実行します:
ssh -i <private_key_path> opc@<instance_ip_address>
terraform init
terraform apply