FIPS-Kompatibilität aktivieren

Pflegen Sie die FIPS-Compliance bei der Verwendung des Oracle Cloud Infrastructure-Terraform-Providers.

Sie können Terraform und eine spezielle FIPS-kompatible Version des Oracle Cloud Infrastructure-(OCI-)Terraform-Providers verwenden, solange einige spezifische Anforderungen erfüllt und Best Practices eingehalten werden. Dieses Thema enthält Anleitungen zu diesen Anforderungen und Praktiken.

FIPS-Verschlüsselung

Um höchste Sicherheitsstandards zu gewährleisten, sollte der Traffic von Terraform zu OCI-Endpunkten über eine TLS-Verbindung mit einem HTTP-Client mit FIPS-zertifizierter Verschlüsselung übertragen werden.

Der Standard-OCI-Terraform-Provider ist in Go implementiert. Die nativen Kryptografieimplementierungen von Go sind zwar vollständig in der Lage, sichere TLS-Verbindungen mit OCI-Endpunkten herzustellen, wurden jedoch nicht FIPS-zertifiziert.

Damit Terraform-Traffic zu OCI-Endpunkten über FIPS-konforme Verbindungen übertragen wird, müssen Sie eine spezielle Version des Terraform-Providers verwenden, die FIPS-zertifizierte Kryptografie verwendet. Diese Version des OCI-Terraform-Providers verwendet anstelle der nativen Kryptografieimplementierung von Go die für FIPS 140-2 zertifizierte Oracle Cloud Infrastructure für BoringCrypto. Weitere Informationen zur Oracle Cloud Infrastructure finden Sie BoringCrypto hier.

FIPS-konformen Terraform-Provider installieren

Der FIPS-konforme OCI-Terraform-Provider ist nur für Oracle Linux verfügbar. Sie können den Provider mit yum installieren.

Wenn bereits vorhandene OCI-Terraform-Providerpackages auf dem Oracle Linux-Rechner installiert sind, entfernen Sie diese zuerst:

yum remove terraform-provider-oci

Installieren Sie den FIPS-konformen OCI-Terraform-Provider, indem Sie den folgenden Yum-Befehl von einem Oracle Linux-Rechner aus ausführen:

yum install terraform-provider-oci-fips

Terraform-Provider konfigurieren

  1. Fügen Sie eine Umgebungsvariable hinzu, um die Zielregion für Terraform festzulegen:

    echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
  2. Fügen Sie eine Umgebungsvariable hinzu, um die prozessübergreifende Trafficverschlüsselung zwischen Terraform und dem OCI-Terraform-Provider zu deaktivieren:

    echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
  3. Fügen Sie eine Umgebungsvariable hinzu, um den Zugriff von Terraform auf den HashiCorp-Checkpoint-Service zu verhindern:

    echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
  4. Konfigurieren Sie die Authentifizierungsmethode für den Terraform-Provider. Weitere Informationen finden Sie unter Authentifizierung.

Terraform in einer einzelnen Region betreiben

Um sicherzustellen, dass der Traffic zwischen Terraform und OCI-Services nicht über öffentliche Internetinfrastrukturen übertragen wird, empfehlen wir, Terraform und den OCI-Terraform-Provider von einer Compute-Instanz auszuführen, die in derselben Region gehostet wird wie die erstellten und verwalteten Ressourcen.

Compute-Instanz erstellen

Nachdem Terraform und der OCI-Terraform-Provider auf einem Oracle Linux-Rechner installiert wurden, können Sie Terraform und die folgende Beispiel-Terraform-Konfigurationsdatei verwenden, um folgende Aufgaben auszuführen:

  • Erstellen Sie eine spezielle Compute-Instanz, mit der Sie zusätzliche Infrastruktur innerhalb derselben Region bereitstellen können.
  • Terraform und den aktuellen FIPS-konformen OCI-Terraform-Provider auf der neuen Instanz installieren
  • Die Kommunikation mit der Instanz auf OCI-Endpunkte und HTTPS mit einem Servicegateway einschränken
  • Instanz-Principal-Authentifizierung aktivieren

Weitere Informationen finden Sie unter Konfigurationen verfassen.

So erstellen Sie die Compute-Instanz:

  1. Kopieren Sie die Datei main.tf in Ihren Oracle Linux-Rechner.
  2. Sammeln Sie die Informationen, die zum Auffüllen der Variablen der Terraform-Konfigurationsdatei erforderlich sind.
  3. Informationen zum OCID-Wert des Oracle Linux-Images für Ihre Region finden Sie unter Plattformimages. Ändern Sie den oel-image-Wert in der Terraform-Konfigurationsdatei.
  4. Initialisieren Sie Terraform im Verzeichnis, das die Terraform-Konfigurationsdatei enthält:

    terraform init
  5. Wenden Sie die Terraform-Konfiguration an:

    terraform plan
    terraform apply
Wichtig

Die Ausgabevariable instance-ip enthält die IP-Adresse, mit der Sie sich bei der neuen Compute-Instanz anmelden.

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]
}

Bei der Instanz anmelden

Verwenden Sie den folgenden SSH-Befehl, um auf die Instanz zuzugreifen:

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

<private_key_path> ist der vollständige Pfad und Name der Datei, die den Private Key enthält, der mit der gewünschten Instanz verknüpft ist.

<username> ist der Standardbenutzername für die Instanz. Bei Oracle Linux-Images lautet der Standardbenutzername opc.

<instance_ip_address> ist die Instanz-IP-Adresse, die von den Terraform-Befehlen ausgegeben wurde.

Terraform auf der Instanz installieren und konfigurieren

  1. Verwenden Sie yum, um Terraform und den FIPS-kompatiblen OCI-Terraform-Provider auf der Instanz zu installieren:

    yum install -y terraform terraform-provider-oci-fips
  2. Fügen Sie eine Umgebungsvariable hinzu, um die Instanz-Principal-Authentifizierung für das Bash-Profil zu aktivieren:

    echo "export TF_VAR_auth='InstancePrincipal'" >> ${HOME}/.bash_profile
  3. Fügen Sie eine Umgebungsvariable hinzu, um die Zielregion für Terraform festzulegen:

    echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
  4. Fügen Sie eine Umgebungsvariable hinzu, um die prozessübergreifende Trafficverschlüsselung zwischen Terraform und dem OCI-Terraform-Provider zu deaktivieren:

    echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
  5. Fügen Sie eine Umgebungsvariable hinzu, um den Zugriff von Terraform auf den HashiCorp-Checkpoint-Service zu verhindern:

    echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
  6. Beenden Sie die Instanz:

    exit

Sicherheitsregeln implementieren

Bevor Sie Terraform mit der neuen Instanz ausführen, müssen Sie die Sicherheitsregeln aktualisieren, um den Egress-Traffic zu Drittanbieterendpunkten, die keine OCI-Services darstellen, zu verhindern. Dazu können Sie die folgende Egress-Regel aus der Ressource security-list1 der Terraform-Konfigurationsdatei entfernen und terraform apply auf dem Oracle Linux-Rechner ausführen:

// 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"
#}
Tipp

Mit der OCI-Konsole können Sie für die neue Instanz auch die Sicherheitsregeln aktualisieren.

Terraform aus der Instanz ausführen

Nachdem Sie die Instanz erstellt, Terraform auf der Instanz installiert und konfiguriert und die Sicherheitsregeln aktualisiert haben, können Sie mit Terraform zusätzliche OCI-Infrastruktur innerhalb derselben Region bereitstellen. Kopieren Sie weitere Terraform-Konfigurationsdateien in die Instanz, melden Sie sich bei der Instanz an, und führen Sie die Terraform-Befehle wie bei jedem anderen Terraform-Provider aus:

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