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.
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
-
Agregue una variable de entorno para definir la región de destino para Terraform:
echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
-
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
-
Agregue una variable de entorno para evitar que Terraform pueda acceder al servicio Checkpoint de HashiCorp:
echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
- 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:
- Copie el archivo
main.tf
en la máquina con Oracle Linux. - Recopile la información necesaria para rellenar las variables del archivo de configuración de Terraform.
- 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. -
Inicialice Terraform en el directorio que contiene el archivo de configuración de Terraform:
terraform init
-
Aplique la configuración de Terraform:
terraform plan
terraform apply
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
-
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
-
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
-
Agregue una variable de entorno para definir la región de destino para Terraform:
echo "export TF_VAR_region='<your_region>'" >> ${HOME}/.bash_profile
-
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
-
Agregue una variable de entorno para evitar que Terraform pueda acceder al servicio Checkpoint de HashiCorp:
echo "export CHECKPOINT_DISABLE=1" >> ${HOME}/.bash_profile
-
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"
#}
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