Activación de compatibilidad de FIPS

Mantenga la conformidad con FIPS al utilizar el proveedor de Terraform de Oracle Cloud Infrastructure.

Puede utilizar Terraform y una versión especial compatible con FIPS del proveedor de Terraform de Oracle Cloud Infrastructure (OCI) siempre que se cumplan algunos requisitos específicos y mejores prácticas. En este tema se proporciona orientación sobre estos requisitos y prácticas.

Cifrado de FIPS

Para garantizar los más altos estándares de seguridad, el tráfico de Terraform a los puntos finales de OCI debe transitar por una conexión TLS establecida con un cliente HTTP utilizando un cifrado certificado por el FIPS.

El proveedor de Terraform de OCI estándar se implementa en Go. Las implementaciones de cifrado nativo de Go, si bien son plenamente capaces de establecer conexiones TLS seguras con puntos finales de OCI, no cuentan con el certificado del FIPS.

Para que el tráfico de Terraform transite a los puntos finales de OCI a través de conexiones compatibles con FIPS, debe utilizar una versión especial del proveedor de Terraform que utilice la criptografía certificada por FIPS. Esta versión del proveedor de Terraform de OCI utiliza la certificación de FIPS 140-2 Oracle Cloud Infrastructure para BoringCrypto en lugar de la implantación de criptografía nativa de Go. Obtenga más información sobre Oracle Cloud Infrastructure para BoringCrypto aquí.

Instalación del proveedor de Terraform compatible con FIPS

El proveedor de Terraform de OCI compatible con FIPS solo está disponible para Oracle Linux. Puede instalar el proveedor a través de yum.

Consejo

Antes de instalar el proveedor de Terraform de OCI, descargue e instale Terraform de HashiCorp o instale Terraform utilizando yum.

Si ya se han instalado paquetes del proveedor de Terraform de OCI en la máquina con Oracle Linux, elimínelos primero:

yum remove terraform-provider-oci

Instale el proveedor de Terraform de OCI compatible con FIPS ejecutando el siguiente comando de yum desde una máquina con Oracle Linux:

yum install terraform-provider-oci-fips

Configuración del proveedor de Terraform

  1. Agregue una variable de entorno para definir la región de destino para Terraform:

    echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
  2. Agregue una variable de entorno para desactivar el cifrado del tráfico entre procesos entre Terraform y el proveedor de Terraform de OCI:

    echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
  3. Agregue una variable de entorno para evitar que Terraform pueda acceder al servicio Checkpoint de HashiCorp:

    echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
  4. Configure el método de autenticación para el proveedor de Terraform. Consulte Autenticación para obtener más información.

Operación de Terraform en una sola región

Para garantizar que el tráfico entre Terraform y los servicios de OCI no transite por la infraestructura de Internet pública, le recomendamos que ejecute Terraform y el proveedor de Terraform de OCI desde una instancia de Compute alojada en la misma región que los recursos que crean y gestionan.

Creación de una instancia de Compute

Después de instalar Terraform y el proveedor de Terraform de OCI en una máquina con Oracle Linux, puede utilizar Terraform y el siguiente archivo de configuración de Terraform de ejemplo para:

  • Cree una instancia informática designada que pueda utilizar para aprovisionar la infraestructura adicional dentro de la misma región.
  • Instalar Terraform y el proveedor de Terraform de OCI compatible con FIPS más reciente en la nueva instancia.
  • Restringir la comunicación con la instancia a los puntos finales de OCI y HTTPS mediante un gateway de servicio.
  • Activar la autenticación de principal de instancia.

Consulte Creación de configuraciones para obtener más información.

Para crear la instancia de Compute:

  1. Copie el archivo main.tf en la máquina con Oracle Linux.
  2. Recopile la información necesaria para rellenar las variables del archivo de configuración de Terraform.
  3. Consulte las imágenes de plataforma para localizar el valor de OCID de la imagen de Oracle Linux para su región. Modifique el valor oel-image en el archivo de configuración de Terraform.
  4. Inicialice Terraform en el directorio que contiene el archivo de configuración de Terraform:

    terraform init
  5. Aplique la configuración de Terraform:

    terraform plan
    terraform apply
Importante

La variable de salida instance-ip proporciona la dirección IP que necesitará utilizar para conectarse a la nueva instancia informática.

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

Conexión a la instancia

Utilice el siguiente comando SSH para acceder a la instancia:

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

<private_key_path> es la ruta de acceso completa y el nombre del archivo que contiene la clave privada asociada a la instancia a la que desea acceder.

<username> es el nombre de usuario por defecto de la instancia. Para las imágenes de Oracle Linux, el nombre de usuario por defecto es opc.

<instance_ip_address> es la dirección IP de la instancia que fue la salida de los comandos de Terraform.

Instalación y configuración de Terraform en la instancia

  1. Utilice yum para instalar Terraform y el proveedor de Terraform de OCI compatible con FIPS en la instancia:

    yum install -y terraform terraform-provider-oci-fips
  2. Agregue una variable de entorno para activar la autenticación de principal de instancia en el perfil bash:

    echo "export TF_VAR_auth='InstancePrincipal'" >> ${HOME}/.bash_profile
  3. Agregue una variable de entorno para definir la región de destino para Terraform:

    echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
  4. Agregue una variable de entorno para desactivar el cifrado del tráfico entre procesos entre Terraform y el proveedor de Terraform de OCI:

    echo "export TF_DISABLE_PLUGIN_TLS=1" >> ${HOME}/.bash_profile
  5. Agregue una variable de entorno para evitar que Terraform pueda acceder al servicio Checkpoint de HashiCorp:

    echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
  6. Salga de la instancia:

    exit

Implementación de reglas de seguridad

Antes de utilizar la nueva instancia para ejecutar Terraform, debe actualizar las reglas de seguridad para evitar el tráfico de salida a cualquier punto final de terceros distinto de los servicios de OCI. Para ello, elimine la siguiente regla de salida del recurso security-list1 del archivo de configuración de Terraform y ejecute terraform apply desde la máquina con 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"
#}
Consejo

También puede utilizar la consola de OCI para actualizar las reglas de seguridad en la nueva instancia.

Ejecución de Terraform desde la instancia

Después de crear la instancia, instalar y configurar Terraform en la instancia y actualizar las reglas de seguridad, puede utilizar Terraform para aprovisionar infraestructura de OCI adicional en la misma región. Copie los archivos de configuración de Terraform adicionales en la instancia, conéctese a la instancia y ejecute los comandos de Terraform como con cualquier otro proveedor de Terraform:

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