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.
Bevor Sie den OCI-Terraform-Provider installieren, laden Sie Terraform von HashiCorp herunter, und installieren Sie es, oder installieren Sie Terraform mit yum.
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
-
Fügen Sie eine Umgebungsvariable hinzu, um die Zielregion für Terraform festzulegen:
echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
-
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
-
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
- 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:
- Kopieren Sie die Datei
main.tf
in Ihren Oracle Linux-Rechner. - Sammeln Sie die Informationen, die zum Auffüllen der Variablen der Terraform-Konfigurationsdatei erforderlich sind.
- 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. -
Initialisieren Sie Terraform im Verzeichnis, das die Terraform-Konfigurationsdatei enthält:
terraform init
-
Wenden Sie die Terraform-Konfiguration an:
terraform plan
terraform apply
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
-
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
-
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
-
Fügen Sie eine Umgebungsvariable hinzu, um die Zielregion für Terraform festzulegen:
echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
-
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
-
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
-
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"
#}
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