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.

Das Diagramm zeigt die Verbindung von außerhalb des Netzes IBM Cloud zu Secrets Manager über Client-to-Site VPN
Client-to-Site VPN

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
  • jq kommandozeilen-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 (hier vpn-root-CA) dient dazu, in späteren Schritten auf diese Root-CA zu verweisen.
  • Passen Sie Felder wie common_name, max_ttl und 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_CRN auf 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-vpn die Registerkarte Clients und klicken Sie auf die Schaltfläche All client profiles, um die Clientprofil-.ovpn-Dateien im ZIP-Format herunterzuladen.
  • Entpacken Sie die ZIP-Datei und importieren Sie client.ovpn in 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/32 hat und das VPN verbunden ist.
    • Bestätigen Sie, dass die Routing-Aktion "translate" lautet und die VPE-Sicherheitsgruppe $VPN_PRIV_IP/32 -> $VPE_IP/32 auf 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.
  • Ö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_HOST bleibt hängen und bricht ab.
  • curl schlägt sofort mit Fehlern wie Network is down oder Cannot allocate memory fehl, wenn versucht wird, $VPE_IP zu erreichen.

Schritte zur Diagnose und Behebung:

  1. 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-vpn und warten Sie, bis es als verbunden angezeigt wird.
  2. Überprüfen Sie die Route zur VPE-IP
route -n get "$VPE_IP"

Erwartet für eine gesunde Einstellung:

  • interface ist ein utun Gerät (zum Beispiel utun5).
  • gateway ist die Adresse des Tunnel-Peers (z. B. 10.241.x.y oder 172.30.x.y).
  • Wenn interface etwas wie en0/en4 anstelle von utunX ist, 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 stable befinden:

    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/32 hat:

    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/hosts durch 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)