Utilisation d'un VPN client-site pour se connecter de manière sécurisée à Secrets Manager
Vous pouvez accéder en toute sécurité à un site privé IBM Cloud® Secrets Manager via un chemin natif IBM Cloud à partir d'un poste de travail client (par exemple, un Mac utilisant OpenVPN Connect ou un autre client OpenVPN-compatible ), en utilisant la passerelle VPN Client-to-Site ( C2S ) dans le VPC et un point de terminaison privé virtuel (VPE).
Lorsque le VPN établit une connexion, il permet à l'appareil source d'envoyer le trafic pour l'IP VPE à travers son tunnel. Du côté du serveur VPN, une route de traduction (SNAT) fait apparaître le trafic vers l'IP VPE comme s'il provenait de l'IP privée du serveur VPN à l'intérieur du VPC. Cette configuration est nécessaire car le VPE n'accepte que le trafic provenant de l'intérieur de l'espace d'adressage du VPC.
Le groupe de sécurité VPE autorise HTTPS (TCP 443) uniquement de l'IP privée du serveur VPN à l'IP du VPE. Cela signifie que seuls les clients passant par ce serveur VPN peuvent atteindre Secrets Manager. Aucune autre ressource dans le VPC ou sur Internet ne peut communiquer avec l'EPV.
Dans cet exemple, la résolution du nom de domaine utilise /etc/hosts. Pour une configuration de niveau production, remplacez ceci par IBM Cloud DNS Services.
{: caption=" client-à-site
Avant de commencer
Avant d'établir la connexion VPN, assurez-vous que les conditions suivantes sont remplies.
Instances et services requis
- Une instance d' Secrets Manager pour la gestion des certificats VPN Client-to-Site et/ou du secret
username_password - Une instance Secrets Manager privée à laquelle vous voulez accéder via le VPN
- Un VPC et un sous-réseau IBM Cloud existants dans votre région de passerelle (GW_REGION)
Logiciels et outils nécessaires
- macOS avec OpenVPN Connect (ou un autre client OpenVPN-compatible ) installé
- IBM Cloud CLI et plugin VPC :
ibmcloud plugin install vpc-infrastructure jqprocesseur JSON en ligne de commande
Déconnectez tous les autres clients VPN avant de tester cette configuration afin d'éviter les conflits de routage.
Variables d'environnement
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
Connexion à votre compte IBM Cloud
ibmcloud login -r "$GW_REGION" --sso
ibmcloud target -g "$RG_NAME"
Créer le groupe de sécurité VPE
Créez un groupe de sécurité dédié à l'EPV et saisissez son identifiant.
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")
Créer le point d'accès privé virtuel (VPE)
Créez un VPE dans votre VPC (GW_REGION) ciblant l'instance Secrets Manager (SM_REGION) et allouez une IP réservée à partir de votre sous-réseau.
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 Moteur de certificats privés
Utilisez le moteur de certificats privés pour créer des autorités de certification et émettre des certificats. Configurez le CLI de Secrets Manager:
export SECRETS_MANAGER_URL="$SM_PKI_ENDPOINT"
Créer une autorité de certification racine (CLI)
Exemple (minimal) de commande pour créer une configuration de l'autorité de certification racine :
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
- Le
name(icivpn-root-CA) est la référence à cette autorité de certification racine dans les étapes suivantes. - Ajustez les champs tels que
common_name,max_ttl, et les paramètres clés en fonction de vos besoins.
Créer une autorité de certification intermédiaire signée par la racine
Exemple de commande pour créer une configuration d'autorité de certification intermédiaire signée par l'autorité de certification racine créée précédemment :
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
Signer l'AC intermédiaire :
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"
Créer un modèle de certificat
Un modèle contrôle les types de certificats privés qui peuvent être émis.
Exemple de commande pour créer un modèle lié à l'autorité de certification intermédiaire :
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"
Délivrer le certificat du serveur VPN
Utilisez le moteur de certificats privés pour émettre un certificat de serveur à partir du modèle :
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" \
- Saisir le CRN secret résultant et fixer
VPN_CERT_CRNà cette valeur.
Délivrer des certificats clients
Utilisez le moteur de certificats privés pour émettre un certificat client à partir du modèle :
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"
Capturez les CRN des certificats du serveur et du client :
export VPN_SERVER_CERT_CRN="<CRN of VPN server certificate secret>"
export VPN_CLIENT_CERT_CRN="<CRN of VPN client certificate secret>"
Groupe de sécurité pour le serveur VPN
Autoriser OpenVPN à partir de votre IP publique et toutes les sorties.
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
Créer le serveur VPN Client-to-Site
Authentification du client par certificat auprès de l'autorité de certification; le serveur présente le certificat de serveur émis.
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"
Envoyer une route d'hôte à la 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"
Résolution du nom (exemple seulement)
Faites correspondre le nom d'hôte Secrets Manager à l'IP du VPE sur votre machine locale.
echo "$VPE_IP $SM_HOST" | sudo tee -a /etc/hosts
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Préparer le client OpenVPN Connect
Télécharger le profil du serveur :
- Dans le menu de navigation gauche de la console IBM Cloud, sélectionnez Infrastructure > Réseau > VPN.
- Sur la page VPNs for VPC, sélectionnez le volet Client-to-Site servers et sélectionnez
test-vpn. - Sur la page
test-vpn, sélectionnez l'onglet Clients et cliquez sur le boutonAll client profilespour télécharger les fichiers.ovpn du profil client au format ZIP. - Extrayez le fichier ZIP et importez
client.ovpndans OpenVPN Connect et connectez-vous.
Lorsque vous modifiez les routes VPN, déconnectez et reconnectez le client VPN pour recevoir la configuration de route mise à jour.
Valider à partir de macOS
curl -v https://$SM_HOST- Si le délai est dépassé :
- Confirmez que le client a une route vers
$VPE_IP/32et que le VPN est connecté. - Confirmez que l'action de route est translate et que le groupe de sécurité VPE autorise
$VPN_PRIV_IP/32 -> $VPE_IP/32sur TCP 443 (ou la source de votre choix). - Vérifier que les états de cycle de vie du serveur VPN et du VPE sont
stable/ok.
- Confirmez que le client a une route vers
- À l'aide de votre navigateur, ouvrez l'interface utilisateur privée Secrets Manager.
Dépannage sur macOS (routage et VPN)
Symptômes courants chez Mac :
curl -v https://$SM_HOSTse bloque et s'arrête.curléchoue immédiatement avec des erreurs telles queNetwork is downouCannot allocate memoryen essayant d'atteindre$VPE_IP.
Étapes du diagnostic et de la réparation :
- S'assurer que seul le VPN IBM C2S est actif
- Déconnectez tous les autres clients VPN sur le Mac (entreprise, personnel, etc.).
- Connectez le profil OpenVPN pour
test-vpnet attendez qu'il s'affiche comme étant connecté.
- Vérifier la route vers l'IP VPE
route -n get "$VPE_IP"
Attendu pour une installation saine :
interfaceest un dispositifutun(par exempleutun5).gatewayest l'adresse de l'homologue du tunnel (par exemple10.241.x.you172.30.x.y).- Si
interfaceest quelque chose commeen0/en4au lieu deutunX, le trafic contourne le VPN.
Si l'itinéraire est erroné, il faut le remplacer pour utiliser le tunnel VPN avec le site IBM VPN connecté et les autres VPN désactivés :
# 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 vous voyez interface: utun5 (ou quelque chose de similaire), réessayez :
curl -v --max-time 10 "https://$SM_HOST"
Si curl ne fonctionne toujours pas :
-
Vérifiez que le serveur VPN et le VPE sont dans l'état
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' -
Confirmez que le groupe de sécurité VPE dispose toujours de la règle TCP 443 entrante de
$VPN_PRIV_IP/32:ibmcloud is security-group-rules "$VPE_SG_ID"
Etapes suivantes
Pour améliorer cette configuration en vue d'une utilisation en production, envisagez les améliorations suivantes :
- Remplacer
/etc/hostspar IBM Cloud DNS Services zones privées pour une résolution DNS correcte - Mettre en œuvre la haute disponibilité en ajoutant un deuxième sous-réseau et une deuxième zone
- Configurer la gestion de la liste de révocation des certificats (CRL) pour les certificats des clients
- Renforcer les règles du groupe de sécurité pour suivre le principe du moindre privilège
- Activer l'authentification multi-facteurs (MFA) pour plus de sécurité
- Établir des politiques de révocation des certificats des clients
Remarques relatives à la sécurité
Lors de la mise en œuvre de cette solution VPN, gardez à l'esprit les meilleures pratiques de sécurité suivantes :
- Gestion des certificats: Rotation régulière des certificats VPN et mise en œuvre de processus de renouvellement automatisés
- Contrôle d'accès: Limiter l'accès au VPN aux adresses IP et aux utilisateurs qui en ont besoin
- Surveillance: Activer la journalisation et la surveillance des connexions VPN et des tentatives d'accès
- Segmentation du réseau: Utiliser les groupes de sécurité pour imposer une segmentation stricte du réseau
- Cryptage: Veiller à ce que l'ensemble du trafic utilise des protocoles de cryptage puissants ( TLS 1.2 ou plus)