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.


Le schéma illustre la connexion depuis l'extérieur du réseauIBM Cloud
versSecrets Manager
à l'aide d'un VPN" caption-side="bottom"}
{: #shortdesc}
client-à-siteVPN{: 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
  • jq processeur 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 (ici vpn-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 bouton All client profiles pour télécharger les fichiers.ovpn du profil client au format ZIP.
  • Extrayez le fichier ZIP et importez client.ovpn dans 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/32 et 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/32 sur 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.
  • À 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_HOST se bloque et s'arrête.
  • curl échoue immédiatement avec des erreurs telles que Network is down ou Cannot allocate memory en essayant d'atteindre $VPE_IP.

Étapes du diagnostic et de la réparation :

  1. 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-vpn et attendez qu'il s'affiche comme étant connecté.
  2. Vérifier la route vers l'IP VPE
route -n get "$VPE_IP"

Attendu pour une installation saine :

  • interface est un dispositif utun (par exemple utun5).
  • gateway est l'adresse de l'homologue du tunnel (par exemple 10.241.x.y ou 172.30.x.y).
  • Si interface est quelque chose comme en0/en4 au lieu de utunX, 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/hosts par 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)