Abilitazione della compatibilità FIPS

Mantieni la compliance FIPS mentre utilizzi il provider Terraform di Oracle Cloud Infrastructure.

Questa pagina descrive i requisiti e le best practice per l'uso di Terraform con una versione compatibile con FIPS del provider Terraform OCI.

Cifratura di FIPS

Per garantire i più elevati standard di sicurezza, sposta il traffico da Terraform agli endpoint OCI tramite una connessione TLS stabilita con un client HTTP utilizzando la cifratura certificata FIPS.

Il provider Terraform OCI standard viene implementato in Go. Le implementazioni di crittografia native di Go, pur essendo completamente in grado di stabilire connessioni TLS sicure con gli endpoint OCI, non sono state certificate FIPS.

Per consentire al traffico Terraform di passare agli endpoint OCI tramite connessioni conformi a FIPS, è necessario utilizzare una versione speciale del provider Terraform che utilizza la crittografia certificata FIPS. Questa versione del provider Terraform OCI utilizza la certificata FIPS 140-2 Oracle Cloud Infrastructure for BoringCrypto invece dell'implementazione della crittografia nativa di Go. Scopri di più su Oracle Cloud Infrastructure per BoringCrypto qui.

Installazione del provider Terraform conforme a FIPS

Il provider Terraform OCI conforme a FIPS è disponibile solo per Oracle Linux. È possibile installare il provider utilizzando yum.

Suggerimento

Prima di installare il provider Terraform OCI, scaricare e installare Terraform da HashiCorp.

Se nel computer Oracle Linux sono già installati pacchetti di provider Terraform OCI esistenti, rimuoverli prima:

yum remove terraform-provider-oci

Installare il provider Terraform OCI compatibile con FIPS eseguendo il seguente comando yum da un computer Oracle Linux:

yum install terraform-provider-oci-fips

Configurazione del provider Terraform

  1. Aggiungere una variabile di ambiente per impostare l'area di destinazione per Terraform:

    echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
  2. Aggiungere una variabile di ambiente per disabilitare la cifratura del traffico tra processi tra Terraform e il provider Terraform OCI:

    echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
  3. Aggiungere una variabile di ambiente per impedire a Terraform di accedere al servizio di checkpoint HashiCorp:

    echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
  4. Configurare il metodo di autenticazione per il provider Terraform. Per ulteriori informazioni, vedere Autenticazione.

Funzionamento di Terraform in una singola area

Per garantire che il traffico tra i servizi Terraform e OCI non passi sull'infrastruttura Internet pubblica, ti consigliamo di eseguire Terraform e il provider Terraform OCI da un'istanza di computazione ospitata nella stessa area delle risorse che creano e gestiscono.

Creazione di un'istanza di computazione

Dopo aver installato Terraform e il provider Terraform OCI in un computer Oracle Linux, è possibile utilizzare Terraform e il file di configurazione Terraform di esempio riportato di seguito per:

  • Crea un'istanza di computazione designata che puoi utilizzare per eseguire il provisioning di più infrastrutture all'interno della stessa area.
  • Installare Terraform e il provider Terraform OCI conforme agli standard FIPS più recente nella nuova istanza.
  • Limita la comunicazione con l'istanza agli endpoint OCI e HTTPS utilizzando un gateway di servizi.
  • Abilitare l'autenticazione del principal dell'istanza.

Per ulteriori informazioni, vedere Creazione delle configurazioni.

Per creare l'istanza di calcolo:

  1. Copiare il file main.tf in un computer Oracle Linux.
  2. Raccogliere le informazioni necessarie per popolare le variabili del file di configurazione Terraform.
  3. Modificare il valore oel-image nel file di configurazione Terraform nel valore OCID dell'immagine Oracle Linux per la propria area.

    Per trovare il valore OCID dell'immagine Oracle Linux per un'area, vedere Immagini della piattaforma.

  4. Inizializza Terraform nella directory che contiene il file di configurazione Terraform:

    terraform init
  5. Applicare la configurazione Terraform:

    terraform plan
    terraform apply
Importante

La variabile di output instance-ip fornisce l'indirizzo IP da utilizzare per collegarsi alla nuova istanza di computazione.

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

Collegamento all'istanza

Utilizzare il seguente comando SSH per accedere all'istanza:

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

<private_key_path> è il percorso completo e il nome del file che contiene la chiave privata associata all'istanza a cui si desidera accedere.

<username> è il nome utente predefinito per l'istanza. Per le immagini Oracle Linux, il nome utente predefinito è opc.

<instance_ip_address> è l'indirizzo IP dell'istanza che rappresentava l'output dei comandi Terraform.

Installazione e configurazione di Terraform nell'istanza

  1. Utilizzare yum per installare Terraform e il provider Terraform OCI compatibile con FIPS sull'istanza:

    yum install -y terraform terraform-provider-oci-fips
  2. Aggiungere una variabile di ambiente per abilitare l'autenticazione del principal dell'istanza al profilo bash:

    echo "export TF_VAR_auth='InstancePrincipal'" >> ${HOME}/.bash_profile
  3. Aggiungere una variabile di ambiente per impostare l'area di destinazione per Terraform:

    echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
  4. Aggiungere una variabile di ambiente per disabilitare la cifratura del traffico tra processi tra Terraform e il provider Terraform OCI:

    echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
  5. Aggiungere una variabile di ambiente per impedire a Terraform di accedere al servizio di checkpoint HashiCorp:

    echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
  6. Chiudi l'istanza:

    exit

Implementazione delle regole di sicurezza

Prima di utilizzare la nuova istanza per eseguire Terraform, aggiornare le regole di sicurezza per evitare il traffico in uscita verso endpoint di terze parti diversi dai servizi OCI. È possibile eseguire questo aggiornamento rimuovendo la regola di uscita seguente dalla risorsa security-list1 del file di configurazione Terraform ed eseguendo terraform apply dal computer Oracle Linux:

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

Puoi anche utilizzare OCI Console per aggiornare le regole di sicurezza nella nuova istanza.

Esecuzione di Terraform dall'istanza

Dopo aver creato l'istanza, installato e configurato Terraform nell'istanza e aggiornato le regole di sicurezza, puoi utilizzare Terraform per eseguire il provisioning di un'altra infrastruttura OCI all'interno della stessa area. Copiare qualsiasi altro file di configurazione Terraform in un'istanza, collegarsi all'istanza ed eseguire i comandi Terraform come con qualsiasi altro provider Terraform:

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