Verwendung von Client-to-Site VPN für eine private Verbindung zu Secrets Manager
Sie können eine private IBM Cloud® Secrets Manager über einen IBM Cloud-nativen Pfad von einer Client-Arbeitsstation (z. B. einem Mac mit OpenVPN Connect oder einem anderen OpenVPN-compatible-Client) sicher erreichen, indem Sie ein Client-to-Site ( C2S ) VPN-Gateway in VPC und einen Virtual Private Endpoint (VPE) verwenden.
Wenn das VPN eine Verbindung herstellt, erlaubt es dem Quellgerät, Datenverkehr für die VPE-IP durch seinen Tunnel zu senden. Auf der Seite des VPN-Servers sorgt eine übersetzte Route (SNAT) dafür, dass der Verkehr zur VPE-IP so aussieht, als stamme er von der eigenen privaten IP des VPN-Servers innerhalb der VPC. Diese Konfiguration ist erforderlich, da der VPE nur Datenverkehr aus dem VPC-Adressraum annimmt.
Die VPE-Sicherheitsgruppe erlaubt HTTPS ( TCP 443) nur von der privaten IP des VPN-Servers zur VPE-IP. Das bedeutet, dass nur Clients, die über diesen VPN-Server kommen, Secrets Manager erreichen können. Keine anderen Ressourcen in der VPC oder im Internet können mit dem VPE kommunizieren.
In diesem Beispiel verwendet die Auflösung des Domänennamens /etc/hosts. Für eine produktionsreife Konfiguration ersetzen Sie dies durch IBM Cloud DNS Services.
Vorbereitende Schritte
Bevor Sie die VPN-Verbindung einrichten, müssen Sie sicherstellen, dass die folgenden Voraussetzungen erfüllt sind.
Erforderliche Instanzen und Dienste
- Eine Secrets Manager-Instanz für die Verwaltung der Client-to-Site-VPN-Zertifikate
- Eine private Instanz Secrets Manager, auf die Sie über das VPN zugreifen möchten
- Eine bestehende IBM Cloud VPC und ein Subnetz in Ihrer Gateway-Region (GW_REGION)
Erforderliche Software und Tools
- macOS mit OpenVPN Connect (oder einem anderen OpenVPN-compatible Client) installiert
- IBM Cloud CLI und VPC-Plugin:
ibmcloud plugin install vpc-infrastructure jqkommandozeilen-JSON-Prozessor
Trennen Sie alle anderen VPN-Clients, bevor Sie diese Konfiguration testen, um Routing-Konflikte zu vermeiden.
Umgebungsvariablen
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
Melden Sie sich an Ihrem IBM Cloud-Konto an.
ibmcloud login -r "$GW_REGION" --sso
ibmcloud target -g "$RG_NAME"
Erstellen Sie die VPE-Sicherheitsgruppe
Erstellen Sie eine eigene Sicherheitsgruppe für das VPE und erfassen Sie deren 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")
Erstellen Sie den virtuellen privaten Endpunkt (VPE)
Erstellen Sie eine VPE in Ihrer VPC (GW_REGION), die auf die Instanz Secrets Manager (SM_REGION) ausgerichtet ist, und weisen Sie eine reservierte IP aus Ihrem Subnetz zu.
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 Private Zertifikatsmaschine
Verwenden Sie die Private Certificate Engine, um CAs zu erstellen und Zertifikate auszustellen. Konfigurieren Sie die Secrets Manager CLI:
export SECRETS_MANAGER_URL="$SM_PKI_ENDPOINT"
Erstellen einer Stammzertifizierungsstelle (CLI)
Beispiel (Minimalbefehl) zum Erstellen einer Root-CA-Konfiguration:
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
- Die
name(hiervpn-root-CA) dient dazu, in späteren Schritten auf diese Root-CA zu verweisen. - Passen Sie Felder wie
common_name,max_ttlund Schlüsseleinstellungen an Ihre Anforderungen an.
Erstellen Sie eine von der Root-CA signierte Zwischen-CA
Beispielbefehl zum Erstellen einer Zwischen-CA-Konfiguration, die von der zuvor erstellten Stamm-CA signiert wird:
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
Unterschreiben Sie die vorläufige CA:
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"
Erstellen einer Zertifikatsvorlage
Eine Vorlage steuert, welche Arten von privaten Zertifikaten ausgestellt werden können.
Beispielbefehl zum Erstellen einer Vorlage, die an die Zwischen-CA gebunden ist:
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"
Ausstellen des VPN-Server-Zertifikats
Verwenden Sie die Engine für private Zertifikate, um ein Serverzertifikat aus der Vorlage auszustellen:
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" \
- Erfassen Sie die resultierende geheime CRN und setzen Sie
VPN_CERT_CRNauf diesen Wert.
Client-Zertifikate ausstellen
Verwenden Sie die Engine für private Zertifikate, um ein Client-Zertifikat aus der Vorlage auszustellen:
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"
Erfassen Sie die CRNs der Server- und Client-Zertifikate:
export VPN_SERVER_CERT_CRN="<CRN of VPN server certificate secret>"
export VPN_CLIENT_CERT_CRN="<CRN of VPN client certificate secret>"
Sicherheitsgruppe für den VPN-Server
Erlauben Sie OpenVPN von Ihrer öffentlichen IP und alle ausgehenden Verbindungen.
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
Erstellen Sie den Client-to-Site-VPN-Server
Zertifikatsbasierte Client-Authentifizierung gegenüber Ihrer CA; der Server legt das ausgestellte Serverzertifikat vor.
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"
Eine Host-Route an das VPE übertragen
# 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"
Namensauflösung (nur Beispiel)
Ordnen Sie den Hostnamen Secrets Manager der VPE-IP auf Ihrem lokalen Rechner zu.
echo "$VPE_IP $SM_HOST" | sudo tee -a /etc/hosts
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
Bereiten Sie den OpenVPN Connect-Client vor
Laden Sie das Serverprofil herunter:
- Wählen Sie in der IBM Cloud Konsole im linken Navigationsmenü Infrastruktur > Netzwerk > VPNs.
- Wählen Sie auf der Seite VPNs für VPC den Bereich Client-to-Site-Server und wählen Sie
test-vpn. - Wählen Sie auf der Seite
test-vpndie Registerkarte Clients und klicken Sie auf die SchaltflächeAll client profiles, um die Clientprofil-.ovpn-Dateien im ZIP-Format herunterzuladen. - Entpacken Sie die ZIP-Datei und importieren Sie
client.ovpnin OpenVPN Connect und stellen Sie eine Verbindung her.
Wenn Sie VPN-Routen ändern, trennen Sie die Verbindung zum VPN-Client und verbinden Sie ihn erneut, um die aktualisierte Routenkonfiguration zu erhalten.
Validieren von macOS
curl -v https://$SM_HOST- Wenn es eine Zeitüberschreitung gibt:
- Vergewissern Sie sich, dass der Client eine Route zu
$VPE_IP/32hat und das VPN verbunden ist. - Bestätigen Sie, dass die Routing-Aktion "translate" lautet und die VPE-Sicherheitsgruppe
$VPN_PRIV_IP/32 -> $VPE_IP/32auf TCP 443 (oder der von Ihnen gewählten Quelle) zulässt. - Überprüfen Sie den Status des VPN-Servers und des VPE-Lebenszyklus:
stable/ok.
- Vergewissern Sie sich, dass der Client eine Route zu
- Öffnen Sie mit Ihrem Browser die nur für Privatpersonen zugängliche Benutzeroberfläche Secrets Manager.
Fehlersuche auf macOS (Routing und VPN)
Häufige Symptome bei Mac:
curl -v https://$SM_HOSTbleibt hängen und bricht ab.curlschlägt sofort mit Fehlern wieNetwork is downoderCannot allocate memoryfehl, wenn versucht wird,$VPE_IPzu erreichen.
Schritte zur Diagnose und Behebung:
- Stellen Sie sicher, dass nur das IBM C2S VPN aktiv ist
- Trennen Sie alle anderen VPN-Clients auf dem Mac (unternehmenseigene, persönliche, usw.).
- Verbinden Sie das Profil OpenVPN für
test-vpnund warten Sie, bis es als verbunden angezeigt wird.
- Überprüfen Sie die Route zur VPE-IP
route -n get "$VPE_IP"
Erwartet für eine gesunde Einstellung:
interfaceist einutunGerät (zum Beispielutun5).gatewayist die Adresse des Tunnel-Peers (z. B.10.241.x.yoder172.30.x.y).- Wenn
interfaceetwas wieen0/en4anstelle vonutunXist, umgeht der Verkehr das VPN.
Wenn die Route falsch ist, überschreiben Sie sie, um den VPN-Tunnel mit der Verbindung IBM VPN zu verwenden und andere VPNs zu deaktivieren:
# 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"
Wenn Sie interface: utun5 (oder ähnlich) sehen, versuchen Sie es erneut:
curl -v --max-time 10 "https://$SM_HOST"
Wenn curl immer noch nicht funktioniert:
-
Vergewissern Sie sich, dass sich der VPN-Server und das VPE im Zustand
stablebefinden:ibmcloud is vpn-server "$VPN_ID" --output json | jq -r '.lifecycle_state' ibmcloud is endpoint-gateway "$VPE_NAME" --output json | jq -r '.lifecycle_state' -
Bestätigen Sie, dass die VPE-Sicherheitsgruppe immer noch die eingehende Regel TCP 443 von
$VPN_PRIV_IP/32hat:ibmcloud is security-group-rules "$VPE_SG_ID"
Nächste Schritte
Um diese Konfiguration für den Produktionseinsatz zu verbessern, sollten Sie die folgenden Verbesserungen in Betracht ziehen:
- Ersetzen Sie
/etc/hostsdurch IBM Cloud DNS Services private Zonen für eine korrekte DNS-Auflösung - Implementieren Sie hohe Verfügbarkeit durch Hinzufügen eines zweiten Subnetzes und einer zweiten Zone
- Konfigurieren Sie die Handhabung der Zertifikatsperrliste (CRL) für Client-Zertifikate
- Verschärfung der Regeln für Sicherheitsgruppen nach dem Prinzip der geringsten Privilegien
- Aktivieren Sie die Multi-Faktor-Authentifizierung (MFA) für zusätzliche Sicherheit
- Richtlinien für den Widerruf von Client-Zertifikaten einrichten
Sicherheitsaspekte
Beachten Sie bei der Implementierung dieser VPN-Lösung die folgenden bewährten Sicherheitsverfahren:
- Zertifikatsverwaltung: Regelmäßige Rotation der VPN-Zertifikate und Implementierung automatisierter Erneuerungsprozesse
- Zugangskontrolle: Beschränken Sie den VPN-Zugang auf die IP-Adressen und Benutzer, die ihn benötigen
- Überwachung: Aktivieren Sie die Protokollierung und Überwachung von VPN-Verbindungen und Zugriffsversuchen
- Netzwerksegmentierung: Verwenden Sie Sicherheitsgruppen, um eine strenge Netzwerksegmentierung durchzusetzen
- Verschlüsselung: Stellen Sie sicher, dass für den gesamten Datenverkehr starke Verschlüsselungsprotokolle verwendet werden ( TLS 1.2 oder höher)