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.
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
-
Aggiungere una variabile di ambiente per impostare l'area di destinazione per Terraform:
echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
-
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
-
Aggiungere una variabile di ambiente per impedire a Terraform di accedere al servizio di checkpoint HashiCorp:
echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
- 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:
- Copiare il file
main.tf
in un computer Oracle Linux. - Raccogliere le informazioni necessarie per popolare le variabili del file di configurazione Terraform.
-
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.
-
Inizializza Terraform nella directory che contiene il file di configurazione Terraform:
terraform init
-
Applicare la configurazione Terraform:
terraform plan
terraform apply
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
-
Utilizzare yum per installare Terraform e il provider Terraform OCI compatibile con FIPS sull'istanza:
yum install -y terraform terraform-provider-oci-fips
-
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
-
Aggiungere una variabile di ambiente per impostare l'area di destinazione per Terraform:
echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
-
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
-
Aggiungere una variabile di ambiente per impedire a Terraform di accedere al servizio di checkpoint HashiCorp:
echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
-
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"
#}
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