Uso de una VPN de cliente a sitio para conectarse de forma privada a Secrets Manager
Se puede acceder de forma segura a un sitio privado IBM Cloud® Secrets Manager a través de una ruta nativa IBM Cloud desde una estación de trabajo cliente (por ejemplo, un Mac que utilice OpenVPN Connect u otro cliente OpenVPN-compatible ), utilizando Client-to-Site ( C2S ) VPN Gateway en VPC y un Virtual Private Endpoint (VPE).
Cuando la VPN establece una conexión, permite al dispositivo de origen enviar tráfico para la IP VPE a través de su túnel. En el lado del servidor VPN, una ruta translate (SNAT ) hace que el tráfico a la IP VPE aparezca como si se originara desde la propia IP privada del servidor VPN dentro de la VPC. Esta configuración es necesaria porque el VPE sólo acepta tráfico desde dentro del espacio de direcciones de la VPC.
El grupo de seguridad VPE permite HTTPS ( TCP 443) sólo desde la IP privada del servidor VPN a la IP VPE. Esto significa que sólo los clientes que vengan a través de este servidor VPN pueden llegar a Secrets Manager. Ningún otro recurso de la VPC o de Internet puede comunicarse con el VPE.
En este ejemplo, la resolución de nombres de dominio utiliza /etc/hosts. Para una configuración de producción, sustitúyalo por IBM Cloud DNS Services.
Antes de empezar
Antes de configurar la conexión VPN, asegúrese de que dispone de los siguientes requisitos previos.
Instancias y servicios necesarios
- Una instancia de Secrets Manager para gestionar los certificados VPN de cliente a sitio y/o el secreto
username_password - Una instancia privada de Secrets Manager a la que desea acceder a través de la VPN
- Una VPC y una subred de IBM Cloud existentes en su región de pasarela (GW_REGION)
Software y herramientas necesarios
- macOS con OpenVPN Connect (u otro cliente de OpenVPN-compatible ) instalado
- IBM Cloud CLI y plugin VPC:
ibmcloud plugin install vpc-infrastructure jqprocesador JSON comando
Desconecte todos los demás clientes VPN antes de probar esta configuración para evitar conflictos de enrutamiento.
Variables de entorno
export SM_REGION="us-south" # Secrets Manager region
export GW_REGION="us-south" # Region where your VPC, VPE, and VPN live
export RG_NAME="Default" # Resource Group
export SM_CRN="<secrets-manager-instance-crn>" # Secrets Manager instance CRN
export SM_HOST="<secrets-manager-instance-host>" # Secrets Manager instance host <instance_id.private.region.secrets-manager.appdomain.cloud>
export SM_PKI_ENDPOINT="<secrets-manager-pki-instance-url>" # Secrets Manager PKI instance endpoint URL <https://instance_id.region.secrets-manager.appdomain.cloud>
export VPC_ID="<existing-vpc-id>" # Existing VPC ID in GW_REGION
export SUBNET_ID="<existing-subnet-id>" # Existing subnet ID in GW_REGION
export VPE_NAME="test-vpe-gw" # Name for the VPE gateway
export SG_VPE_NAME="test-vpe-sg" # Security Group to attach to the VPE
export VPN_NAME="test-vpn" # Name for the Client-to-Site VPN
export SG_VPN_NAME="test-vpn-sg" # Security Group to attach to the VPN
export CLIENT_POOL="10.241.0.0/22" # VPN client IP pool
Inicie una sesión en su cuenta de IBM Cloud
ibmcloud login -r "$GW_REGION" --sso
ibmcloud target -g "$RG_NAME"
Crear el grupo de seguridad VPE
Cree un Grupo de Seguridad dedicado para el VPE y capture su ID.
ibmcloud is security-group-create "$SG_VPE_NAME" "$VPC_ID"
export VPE_SG_ID=$(ibmcloud is security-groups --output json | jq -r ".[] | select(.name==\"$SG_VPE_NAME\") | .id")
Crear el punto final virtual (VPE)
Cree un VPE en su VPC (GW_REGION) dirigido a la instancia Secrets Manager (SM_REGION) y asigne una IP reservada de su subred.
ibmcloud is endpoint-gateway-create \
--name "$VPE_NAME" \
--vpc "$VPC_ID" \
--target "$SM_CRN" \
--target-type provider_cloud_service \
--new-reserved-ip "{\"subnet\":{\"id\":\"$SUBNET_ID\"}}" \
--sg "$VPE_SG_ID" \
--resource-group-name "$RG_NAME"
# Wait for the VPE to reach stable state
ibmcloud is endpoint-gateway "$VPE_NAME" --output json | jq -r '.lifecycle_state'
# Capture the VPE IP (used later for routing and hosts entry)
export VPE_IP=$(ibmcloud is endpoint-gateway "$VPE_NAME" --output json | jq -r '.ips[0].address')
### Verify the VPE
# Show security groups attached to the VPE (names and IDs)
ibmcloud is endpoint-gateway "$VPE_NAME" --output json | jq -r '.security_groups[]? | "\(.name) \(.id)"'
# Show the reserved IP address allocated to the VPE
ibmcloud is endpoint-gateway "$VPE_NAME" --output json | jq -r '.ips[0].address'
Secrets Manager Motor de certificados privados
Utilice el motor de certificados privados para crear CA y emitir certificados. Configure la CLI Secrets Manager:
export SECRETS_MANAGER_URL="$SM_PKI_ENDPOINT"
Crear una autoridad de certificación raíz (CLI)
Ejemplo (mínimo) de comando para crear una configuración de CA raíz:
ibmcloud secrets-manager configuration-create \
--config-type "private_cert_configuration_root_ca" \
--name "vpn-root-CA" \
--certificate-common-name "vpn.root.ca" \
--private-cert-max-ttl "3652d" \
--private-cert-format "pem" \
--private-cert-private-key-type "rsa" \
--private-cert-private-key-bits 2048 \
--private-cert-distribution-points-encoded true \
--private-cert-issuing-certificate-urls-encoded true
- El
name(aquívpn-root-CA) es la forma de referirse a esta CA raíz en pasos posteriores. - Ajuste campos como
common_name,max_ttl, y la configuración de las teclas a sus necesidades.
Crear una CA intermedia firmada por la raíz
Comando ejemplo para crear una configuración de CA intermedia que esté firmada por la CA raíz creada anteriormente:
ibmcloud secrets-manager configuration-create \
--config-type "private_cert_configuration_intermediate_ca" \
--name "vpn-intermediate-CA" \
--certificate-common-name "vpn.int.com" \
--private-cert-signing-method "internal" \
--private-cert-issuer "vpn-root-CA" \
--private-cert-max-ttl "2556d" \
--private-cert-format "pem" \
--private-cert-private-key-type "rsa" \
--private-cert-private-key-bits 4096 \
--private-cert-distribution-points-encoded true \
--private-cert-issuing-certificate-urls-encoded true
Firmar la AC intermedia:
ibmcloud secrets-manager configuration-action-create \
--name "vpn-root-CA" \
--config-action-action-type "private_cert_configuration_action_sign_intermediate" \
--config-action-intermediate-certificate-authority "vpn-intermediate-CA"
Crear una plantilla de certificado
Una plantilla controla qué tipos de certificados privados pueden emitirse.
Ejemplo de comando para crear una plantilla vinculada a la CA intermedia:
ibmcloud secrets-manager configuration-create \
--config-type "private_cert_configuration_template" \
--name "vpn-certificate-template" \
--private-cert-ca-name "vpn-intermediate-CA" \
--private-cert-allowed-domains "vpn.ibm.com" \
--private-cert-allowed-domains-template false \
--private-cert-allow_subdomains true \
--private-cert-server-flag true \
--private-cert-client-flag true \
--private-cert-key-type "rsa" \
--private-cert-key-bits 2048 \
--private-cert-max-ttl "365d"
Emitir el certificado del servidor VPN
Utilice el motor de certificados privados para emitir un certificado de servidor a partir de la plantilla:
ibmcloud secrets-manager secret-create \
--secret-name "vpn-server-cert" \
--secret-type "private_cert" \
--secret-description "VPN server certificate" \
--secret-ttl "365d" \
--private-cert-certificate-template "vpn-certificate-template" \
--certificate-common-name "server.vpn.ibm.com" \
- Captura el CRN secreto resultante y establece
VPN_CERT_CRNen ese valor.
Emitir certificados de cliente
Utilice el motor de certificados privados para emitir un certificado de cliente a partir de la plantilla:
ibmcloud secrets-manager secret-create \
--secret-name "vpn-client-cert" \
--secret-type "private_cert" \
--secret-description "VPN client certificate" \
--secret-ttl "365d" \
--private-cert-certificate-template "vpn-certificate-template" \
--certificate-common-name "client.vpn.ibm.com"
Captura los CRN de los certificados de servidor y cliente:
export VPN_SERVER_CERT_CRN="<CRN of VPN server certificate secret>"
export VPN_CLIENT_CERT_CRN="<CRN of VPN client certificate secret>"
Grupo de seguridad para el servidor VPN
Permita OpenVPN desde su IP pública y todas las salientes.
ibmcloud is security-group-create "$SG_VPN_NAME" "$VPC_ID"
export SG_ID=$(ibmcloud is security-groups --output json | jq -r ".[] | select(.name==\"$SG_VPN_NAME\") | .id")
# Find your public IPv4 and allow UDP 1194
curl -4 ifconfig.me
ibmcloud is security-group-rule-add "$SG_ID" inbound udp --port-min 1194 --port-max 1194 --remote x.x.x.x/32
# Allow all outbound
ibmcloud is security-group-rule-add "$SG_ID" outbound all --remote 0.0.0.0/0
Crear el servidor VPN de cliente a sitio
Autenticación de clientes basada en certificados contra su CA; el servidor presenta el certificado de servidor emitido.
ibmcloud is vpn-server-create \
--name "$VPN_NAME" \
--vpc "$VPC_ID" \
--subnet "$SUBNET_ID" \
--client-ip-pool "$CLIENT_POOL" \
--protocol udp \
--port 1194 \
--enable-split-tunnel true \
--client-auth-methods certificate \
--client-ca "$VPN_CLIENT_CERT_CRN" \
--cert "$VPN_SERVER_CERT_CRN" \
--sg "$SG_ID" \
--resource-group-name "$RG_NAME"
# Wait for the VPN server to reach stable status
ibmcloud is vpn-server "$VPN_NAME"
# Capture IDs and server private IP
export VPN_ID=$(ibmcloud is vpn-servers --output json | jq -r ".[] | select(.name==\"$VPN_NAME\") | .id")
export VPN_PRIV_IP=$(ibmcloud is vpn-server "$VPN_ID" --output json | jq -r '.private_ips[0].address')
### Allow TCP 443 from the translated source (VPN server private IP) to the VPE.
ibmcloud is security-group-rule-add "$VPE_SG_ID" inbound tcp --port-min 443 --port-max 443 --remote "$VPN_PRIV_IP/32"
Insertar una ruta de host en el VPE
# Create a translated (SNAT) host route to the VPE IP
ibmcloud is vpn-server-route-create "$VPN_ID" --name vpe-host --action translate --destination "$VPE_IP/32"
# Verify for stable status
ibmcloud is vpn-server-routes "$VPN_ID"
Resolución de nombres (sólo ejemplo)
Asigna el nombre de host Secrets Manager a la IP del VPE en tu máquina local.
echo "$VPE_IP $SM_HOST" | sudo tee -a /etc/hosts
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Prepare el cliente OpenVPN Connect
Descarga el perfil del servidor:
- En el menú de navegación izquierdo de la consola IBM Cloud, seleccione Infraestructura > Red > VPNs.
- En la página VPNs for VPC, seleccione el panel Client-to-Site servers y seleccione
test-vpn. - En la página
test-vpn, seleccione la pestaña Clientes y haga clic en el botónAll client profilespara descargar los archivos.ovpn de perfil de cliente en formato ZIP. - Extrae el archivo ZIP e importa
client.ovpna OpenVPN Connect y conéctate.
Cuando modifique las rutas VPN, desconecte y vuelva a conectar el cliente VPN para recibir la configuración de ruta actualizada.
Validar desde macOS
curl -v https://$SM_HOST- Si se agota el tiempo de espera:
- Confirme que el cliente tiene una ruta a
$VPE_IP/32y que la VPN está conectada. - Confirme que la acción de ruta es traducir y que el grupo de seguridad VPE permite
$VPN_PRIV_IP/32 -> $VPE_IP/32en TCP 443 (o la fuente que elija). - Compruebe que los estados del servidor VPN y del ciclo de vida del VPE son
stable/ok.
- Confirme que el cliente tiene una ruta a
- Utilice su navegador para abrir la interfaz de usuario privada Secrets Manager.
Resolución de problemas en macOS (enrutamiento y VPN)
Síntomas comunes en Mac:
curl -v https://$SM_HOSTse bloquea y se agota el tiempo de espera.curlfalla inmediatamente con errores comoNetwork is downoCannot allocate memoryal intentar llegar a$VPE_IP.
Pasos para diagnosticar y solucionar:
- Asegúrese de que sólo está activa la VPN IBM C2S
- Desconecte cualquier otro cliente VPN del Mac (corporativo, personal, etc.).
- Conecte el perfil OpenVPN para
test-vpny espere hasta que aparezca como conectado.
- Compruebe la ruta a la IP del VPE
route -n get "$VPE_IP"
Lo esperado para una configuración saludable:
interfacees un dispositivoutun(por ejemploutun5).gatewayes la dirección del par del túnel (por ejemplo10.241.x.yo172.30.x.y).- Si
interfacees algo comoen0/en4en lugar deutunX, el tráfico está eludiendo la VPN.
Si la ruta es incorrecta, anúlela para utilizar el túnel VPN con la dirección IBM VPN conectada y otras VPN desactivadas:
# Remove any existing host route for the VPE IP
sudo route delete "$VPE_IP" 2>/dev/null || true
# Add a host route via the VPN tunnel interface (replace utun5 with your actual utun)
sudo route add -host "$VPE_IP" -interface utun5
# Verify
route -n get "$VPE_IP"
Si ves interface: utun5 (o similar), vuelve a intentarlo:
curl -v --max-time 10 "https://$SM_HOST"
Si curl sigue sin funcionar:
-
Compruebe que el servidor VPN y el VPE se encuentran en el estado
stable:ibmcloud is vpn-server "$VPN_ID" --output json | jq -r '.lifecycle_state' ibmcloud is endpoint-gateway "$VPE_NAME" --output json | jq -r '.lifecycle_state' -
Confirme que el grupo de seguridad VPE sigue teniendo la regla TCP 443 entrante de
$VPN_PRIV_IP/32:ibmcloud is security-group-rules "$VPE_SG_ID"
Próximos pasos
Para mejorar esta configuración para su uso en producción, considere las siguientes mejoras:
- Sustituya
/etc/hostspor IBM Cloud DNS Services zonas privadas para una correcta resolución DNS - Implemente la alta disponibilidad añadiendo una segunda subred y zona
- Configurar la gestión de listas de revocación de certificados (CRL) para certificados de cliente
- Reforzar las reglas del Grupo de Seguridad para seguir el principio del menor privilegio
- Activar la autenticación multifactor (MFA) para mayor seguridad
- Establecer políticas de revocación de certificados de cliente
Consideraciones acerca de la seguridad
Al implementar esta solución VPN, tenga en cuenta las siguientes buenas prácticas de seguridad:
- Gestión de certificados: Rote periódicamente los certificados VPN e implante procesos de renovación automatizados
- Control de acceso: Limite el acceso a la VPN únicamente a las direcciones IP y los usuarios que lo requieran
- Monitorización: Activar el registro y la supervisión de las conexiones VPN y los intentos de acceso
- Segmentación de la red: Utiliza grupos de seguridad para imponer una segmentación estricta de la red
- Cifrado: Asegúrese de que todo el tráfico utiliza protocolos de cifrado fuertes ( TLS 1.2 o superior)