Usando a VPN Cliente-para-Site para se conectar de forma privada a Secrets Manager

Você pode acessar com segurança um site IBM Cloud® Secrets Manager privado por um caminho nativo IBM Cloud a partir de uma estação de trabalho cliente (por exemplo, um Mac usando o OpenVPN Connect ou outro cliente OpenVPN-compatible ), usando o Gateway VPN Client-to-Site ( C2S ) na VPC e um Virtual Private Endpoint (VPE).

Quando a VPN estabelece uma conexão, ela permite que o dispositivo de origem envie tráfego para o IP do VPE por meio de seu túnel. No lado do servidor VPN, uma rota de tradução (SNAT) faz com que o tráfego para o IP do VPE pareça se originar do próprio IP privado do servidor VPN dentro da VPC. Essa configuração é necessária porque o VPE aceita tráfego somente de dentro do espaço de endereço da VPC.

O grupo de segurança do VPE permite HTTPS ( TCP 443) somente do IP privado do servidor VPN para o IP do VPE. Isso significa que somente os clientes que passam por esse servidor VPN podem acessar Secrets Manager. Nenhum outro recurso na VPC ou na Internet pode se comunicar com o VPE.

Neste exemplo, a resolução do nome de domínio usa /etc/hosts. Para a configuração em nível de produção, substitua-o por IBM Cloud DNS Services.

O diagrama mostra a conexão de fora da rede IBM Cloud até Secrets Manager usando a VPN Cliente-para-Site
VPN Cliente-para-Site

Antes de Iniciar

Antes de configurar a conexão VPN, certifique-se de que os seguintes pré-requisitos estejam em vigor.

Instâncias e serviços necessários

  • Uma instância do Secrets Manager para gerenciar os certificados de VPN Cliente-para-Site e/ou o segredo “ username_password
  • Uma instância Secrets Manager somente privada que você deseja acessar por meio da VPN
  • Um VPC e uma sub-rede existentes em IBM Cloud em sua região de gateway (GW_REGION)

Software e ferramentas necessários

  • macOS com o OpenVPN Connect (ou outro cliente OpenVPN-compatible ) instalado
  • IBM Cloud CLI e plug-in VPC: ibmcloud plugin install vpc-infrastructure
  • jq processador JSON de linha de comando

Desconecte todos os outros clientes VPN antes de testar essa configuração para evitar conflitos de roteamento.

Variáveis de ambiente

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

Efetue login em sua conta do IBM Cloud

ibmcloud login -r "$GW_REGION" --sso
ibmcloud target -g "$RG_NAME"

Criar o grupo de segurança do VPE

Crie um grupo de segurança dedicado para o VPE e capture sua 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")

Criar o ponto de extremidade privado virtual (VPE)

Crie um VPE em sua VPC (GW_REGION) direcionado para a instância Secrets Manager (SM_REGION) e aloque um IP reservado de sua sub-rede.

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 Mecanismo de Certificados Privados

Use o mecanismo de certificado privado para criar CAs e emitir certificados. Configure a CLI do Secrets Manager:

export SECRETS_MANAGER_URL="$SM_PKI_ENDPOINT"

Criar uma autoridade certificadora raiz (CLI)

Exemplo de comando (mínimo) para criar uma configuração de CA raiz:

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
  • O endereço name (aqui vpn-root-CA) é como você se refere a essa CA raiz nas etapas posteriores.
  • Ajuste campos como common_name, max_ttl e configurações de teclas de acordo com suas necessidades.

Criar uma CA intermediária assinada pela raiz

Comando de exemplo para criar uma configuração de CA intermediária que é assinada pela CA raiz criada 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

Assinar o CA intermediário:

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"

Crie um modelo de certificado

Um modelo controla os tipos de certificados privados que podem ser emitidos.

Exemplo de comando para criar um modelo vinculado à CA intermediária:

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 o certificado do servidor VPN

Use o mecanismo de certificados privados para emitir um certificado de servidor a partir do modelo:

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" \
  • Capture o CRN secreto resultante e defina VPN_CERT_CRN com esse valor.

Emitir certificados de cliente

Use o mecanismo de certificados privados para emitir um certificado de cliente a partir do modelo:

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"

Capture os CRNs de certificado do servidor e do 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 segurança para o servidor VPN

Permitir OpenVPN de seu IP público e todas as saídas.

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

Criar o servidor VPN Client-to-Site

Autenticação de cliente baseada em certificado em relação à sua CA; o servidor apresenta o 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"

Enviar uma rota de host para o 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"

Resolução de nomes (somente exemplo)

Mapeie o nome do host Secrets Manager para o IP do VPE em seu computador local.

echo "$VPE_IP $SM_HOST" | sudo tee -a /etc/hosts
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Prepare o cliente OpenVPN Connect

Faça o download do perfil do servidor:

  • No menu de navegação esquerdo do console IBM Cloud, selecione Infraestrutura > Rede > VPNs.
  • Na página VPNs for VPC, selecione o painel Client-to-Site servers e selecione test-vpn.
  • Na página test-vpn, selecione a guia Clients e clique no botão All client profiles para fazer download dos arquivos.ovpn do perfil do cliente em formato ZIP.
  • Extraia o arquivo ZIP e importe client.ovpn para OpenVPN Connect e conecte-se.

Ao modificar as rotas VPN, desconecte e reconecte o cliente VPN para receber a configuração de rota atualizada.

Validar a partir de macOS

  • curl -v https://$SM_HOST
  • Se o tempo expirar:
    • Confirme se o cliente tem uma rota para $VPE_IP/32 e se a VPN está conectada.
    • Confirme se a ação de rota é traduzir e se o Grupo de Segurança VPE permite $VPN_PRIV_IP/32 -> $VPE_IP/32 em TCP 443 (ou na origem escolhida).
    • Verifique se os estados do ciclo de vida do servidor VPN e do VPE são stable/ok.
  • Usando seu navegador, abra a interface de usuário privada do Secrets Manager.

Solução de problemas em macOS (roteamento e VPN)

Sintomas comuns no Mac:

  • curl -v https://$SM_HOST trava e atinge o tempo limite.
  • curl falha imediatamente com erros como Network is down ou Cannot allocate memory ao tentar acessar $VPE_IP.

Etapas para diagnosticar e corrigir:

  1. Certifique-se de que apenas a VPN IBM C2S esteja ativa
    • Desconecte qualquer outro cliente VPN no Mac (corporativo, pessoal, etc.).
    • Conecte o perfil OpenVPN para test-vpn e aguarde até que ele seja exibido como conectado.
  2. Verifique a rota para o IP do VPE
route -n get "$VPE_IP"

Esperado para uma configuração saudável:

  • interface é um dispositivo utun (por exemplo, utun5).
  • gateway é o endereço do par do túnel (por exemplo, 10.241.x.y ou 172.30.x.y).
  • Se interface for algo como en0/en4 em vez de utunX, o tráfego estará contornando a VPN.

Se a rota estiver errada, substitua-a para usar o túnel VPN com o IBM VPN conectado e outras VPNs desativadas:

# 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"

Se você vir interface: utun5 (ou algo semelhante), tente novamente:

curl -v --max-time 10 "https://$SM_HOST"

Se o site curl ainda apresentar um tempo limite:

  • Verifique novamente se o servidor VPN e o VPE estão no 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 se o VPE Security Group ainda tem a regra de entrada TCP 443 de $VPN_PRIV_IP/32:

    ibmcloud is security-group-rules "$VPE_SG_ID"
    

Próximas etapas

Para aprimorar essa configuração para uso na produção, considere os seguintes aprimoramentos:

  • Substitua /etc/hosts por IBM Cloud DNS Services zonas privadas para uma resolução de DNS adequada
  • Implemente alta disponibilidade adicionando uma segunda sub-rede e zona
  • Configurar o manuseio da Lista de revogação de certificados (CRL) para certificados de clientes
  • Reforçar as regras do Grupo de Segurança para seguir o princípio do menor privilégio
  • Ative a autenticação multifator (MFA) para segurança adicional
  • Estabelecer políticas de revogação de certificados de clientes

Considerações de segurança

Ao implementar essa solução de VPN, tenha em mente as seguintes práticas recomendadas de segurança:

  • Gerenciamento de certificados: Faça a rotação regular dos certificados VPN e implemente processos de renovação automatizados
  • Controle de acesso: Limite o acesso à VPN apenas aos endereços IP e aos usuários que precisam dela
  • Monitoramento: Ative o registro e o monitoramento de conexões VPN e tentativas de acesso
  • Segmentação de rede: Use os grupos de segurança para impor uma segmentação rigorosa da rede
  • Criptografia: Assegure-se de que todo o tráfego use protocolos de criptografia fortes ( TLS 1.2 ou superior)