Utilizzo della VPN da client a sito per connettersi privatamente a Secrets Manager
È possibile raggiungere in modo sicuro un sito IBM Cloud® Secrets Manager privato attraverso un percorso IBM Cloud nativo da una workstation client (ad esempio, un Mac che utilizza OpenVPN Connect o un altro client OpenVPN-compatible ), utilizzando Client-to-Site ( C2S ) VPN Gateway in VPC e un Virtual Private Endpoint (VPE).
Quando la VPN stabilisce una connessione, consente al dispositivo di origine di inviare il traffico per l'IP VPE attraverso il tunnel. Sul lato del server VPN, un percorso di traduzione (SNAT) fa sì che il traffico verso l'IP VPE appaia come se provenisse dall'IP privato del server VPN all'interno della VPC. Questa configurazione è necessaria perché il VPE accetta traffico solo dall'interno dello spazio degli indirizzi della VPC.
Il gruppo di sicurezza VPE consente l'accesso a HTTPS ( TCP 443) solo dall'IP privato del server VPN all'IP VPE. Ciò significa che solo i client che passano attraverso questo server VPN possono raggiungere Secrets Manager. Nessun'altra risorsa nella VPC o in Internet può comunicare con il VPE.
In questo esempio, la risoluzione del nome di dominio utilizza /etc/hosts. Per la configurazione di livello di produzione, sostituirlo con IBM Cloud DNS Services.
Prima di iniziare
Prima di impostare la connessione VPN, assicuratevi di disporre dei seguenti prerequisiti.
Istanze e servizi richiesti
- Un'istanza di " Secrets Manager " per la gestione dei certificati VPN Client-to-Site e/o del segreto "
username_password" - Un'istanza di Secrets Manager solo privata a cui si vuole accedere attraverso la VPN
- Un VPC e una sottorete esistenti di IBM Cloud nella regione del gateway (GW_REGION)
Software e strumenti necessari
- macOS con OpenVPN Connect (o un altro client OpenVPN-compatible ) installato
- IBM Cloud CLI e plugin VPC:
ibmcloud plugin install vpc-infrastructure jqprocessore JSON a riga di comando
Disconnettere tutti gli altri client VPN prima di testare questa configurazione per evitare conflitti di routing.
Variabili di 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
Accedi al tuo account IBM Cloud
ibmcloud login -r "$GW_REGION" --sso
ibmcloud target -g "$RG_NAME"
Crea il gruppo di sicurezza VPE
Creare un gruppo di sicurezza dedicato alla VPE e acquisirne l'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")
Creare l'endpoint privato virtuale (VPE)
Creare un VPE nella propria VPC (GW_REGION) mirato all'istanza Secrets Manager (SM_REGION) e allocare un IP riservato dalla propria sottorete.
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 Motore di certificazione privato
Utilizzare il motore di certificazione privata per creare CA ed emettere certificati. Configurare la CLI di Secrets Manager:
export SECRETS_MANAGER_URL="$SM_PKI_ENDPOINT"
Creare un'autorità di certificazione radice (CLI)
Esempio di comando (minimo) per creare una configurazione di CA radice:
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
- L'indirizzo
name(quivpn-root-CA) è il modo in cui si fa riferimento a questa CA principale nelle fasi successive. - Regolate i campi come
common_name,max_ttle le impostazioni dei tasti in base alle vostre esigenze.
Creare una CA intermedia firmata dalla radice
Comando di esempio per creare una configurazione CA intermedia firmata dalla CA principale creata in precedenza:
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
Firmare la CA 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"
Crea un modello di certificato
Un modello controlla quali tipi di certificati privati possono essere emessi.
Comando di esempio per creare un modello legato alla 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"
Rilasciare il certificato del server VPN
Utilizzare il motore dei certificati privati per emettere un certificato del server dal modello:
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" \
- Acquisire il CRN segreto risultante e impostare
VPN_CERT_CRNsu tale valore.
Emissione di certificati client
Utilizzare il motore dei certificati privati per emettere un certificato client dal modello:
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"
Acquisire i certificati CRN del server e del client:
export VPN_SERVER_CERT_CRN="<CRN of VPN server certificate secret>"
export VPN_CLIENT_CERT_CRN="<CRN of VPN client certificate secret>"
Gruppo di sicurezza per il server VPN
Consentite OpenVPN dal vostro IP pubblico e tutte le uscite.
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
Creare il server VPN Client-to-Site
Autenticazione del client basata sul certificato nei confronti della CA; il server presenta il certificato del server emesso.
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"
Spingere un percorso host sul 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"
Risoluzione del nome (solo a titolo di esempio)
Mappare il nome host di Secrets Manager sull'IP del VPE sul computer locale.
echo "$VPE_IP $SM_HOST" | sudo tee -a /etc/hosts
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Preparare il client OpenVPN Connect
Scaricare il profilo del server:
- Nel menu di navigazione sinistro della console IBM Cloud, selezionare Infrastruttura > Rete > VPN.
- Nella pagina VPN per VPC, selezionare il riquadro Server da client a sito e scegliere
test-vpn. - Nella pagina
test-vpn, selezionare la scheda Clienti e fare clic sul pulsanteAll client profilesper scaricare i file.ovpn del profilo del cliente in formato ZIP. - Estrarre il file ZIP e importare
client.ovpnin OpenVPN Connect e connettersi.
Quando si modificano i percorsi VPN, scollegare e ricollegare il client VPN per ricevere la configurazione aggiornata del percorso.
Convalidare da macOS
curl -v https://$SM_HOST- Se il tempo si esaurisce:
- Verificare che il client abbia un percorso verso
$VPE_IP/32e che la VPN sia connessa. - Confermare che l'azione di route è translate e che il gruppo di sicurezza VPE consente
$VPN_PRIV_IP/32 -> $VPE_IP/32su TCP 443 (o sulla sorgente scelta). - Verificare che gli stati del server VPN e del ciclo di vita VPE siano
stable/ok.
- Verificare che il client abbia un percorso verso
- Con il browser, aprire l'interfaccia utente privata Secrets Manager.
Risoluzione dei problemi su macOS (routing e VPN)
Sintomi comuni in Mac:
curl -v https://$SM_HOSTsi blocca e si interrompe.curlfallisce immediatamente con errori comeNetwork is downoCannot allocate memoryquando cerca di raggiungere$VPE_IP.
Passi per la diagnosi e la correzione:
- Assicurarsi che sia attiva solo la VPN IBM C2S
- Disconnettere qualsiasi altro client VPN sul Mac (aziendale, personale, ecc.).
- Collegare il profilo OpenVPN per
test-vpne attendere che venga visualizzato come connesso.
- Controllare il percorso verso l'IP del VPE
route -n get "$VPE_IP"
Previsto per una configurazione sana:
interfaceè un dispositivoutun(ad esempioutun5).gatewayè l'indirizzo del peer tunnel (ad esempio10.241.x.yo172.30.x.y).- Se
interfaceè qualcosa comeen0/en4invece diutunX, il traffico sta bypassando la VPN.
Se il percorso è errato, sostituirlo per utilizzare il tunnel VPN con IBM VPN collegato e le altre VPN disattivate:
# 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 viene visualizzato interface: utun5 (o simili), riprovare:
curl -v --max-time 10 "https://$SM_HOST"
Se curl continua ad avere tempi morti:
-
Verificare che il server VPN e il VPE siano nello stato
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' -
Confermare che il gruppo di sicurezza VPE ha ancora la regola in entrata TCP 443 da
$VPN_PRIV_IP/32:ibmcloud is security-group-rules "$VPE_SG_ID"
Passi successivi
Per migliorare questa configurazione per l'uso in produzione, considerate i seguenti miglioramenti:
- Sostituire
/etc/hostscon IBM Cloud DNS Services zone private per una corretta risoluzione DNS - Implementare l'alta disponibilità aggiungendo una seconda subnet e una seconda zona
- Configurare la gestione della lista di revoca dei certificati (CRL) per i certificati client
- Rafforzare le regole del gruppo di sicurezza per seguire il principio del minimo privilegio
- Abilitare l'autenticazione a più fattori (MFA) per una maggiore sicurezza
- Stabilire politiche di revoca dei certificati client
Considerazioni sulla sicurezza
Nell'implementazione di questa soluzione VPN, tenete a mente le seguenti best practice di sicurezza:
- Gestione dei certificati: Ruotare regolarmente i certificati VPN e implementare processi di rinnovo automatizzati
- Controllo degli accessi: Limitare l'accesso alla VPN solo agli indirizzi IP e agli utenti che lo richiedono
- Monitoraggio: Abilita la registrazione e il monitoraggio delle connessioni VPN e dei tentativi di accesso
- Segmentazione della rete: Utilizzare i gruppi di sicurezza per imporre una rigida segmentazione della rete
- Crittografia: Assicurarsi che tutto il traffico utilizzi protocolli di crittografia forti ( TLS 1.2 o superiore)