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.
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 jqprocessador 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(aquivpn-root-CA) é como você se refere a essa CA raiz nas etapas posteriores. - Ajuste campos como
common_name,max_ttle 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_CRNcom 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ãoAll client profilespara fazer download dos arquivos.ovpn do perfil do cliente em formato ZIP. - Extraia o arquivo ZIP e importe
client.ovpnpara 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/32e 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/32em TCP 443 (ou na origem escolhida). - Verifique se os estados do ciclo de vida do servidor VPN e do VPE são
stable/ok.
- Confirme se o cliente tem uma rota para
- 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_HOSTtrava e atinge o tempo limite.curlfalha imediatamente com erros comoNetwork is downouCannot allocate memoryao tentar acessar$VPE_IP.
Etapas para diagnosticar e corrigir:
- 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-vpne aguarde até que ele seja exibido como conectado.
- Verifique a rota para o IP do VPE
route -n get "$VPE_IP"
Esperado para uma configuração saudável:
interfaceé um dispositivoutun(por exemplo,utun5).gatewayé o endereço do par do túnel (por exemplo,10.241.x.you172.30.x.y).- Se
interfacefor algo comoen0/en4em vez deutunX, 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/hostspor 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)