copyright: years: 2020, 2026 lastupdated: "2026-08-01"

keywords: Secrets Manager の分離、 Secrets Manager のサービスエンドポイント、 Secrets Manager のプライベートネットワーク、 Secrets Manager のネットワーク分離、 Secrets Manager の非公開ルート、 Secrets Manager のプライベート接続、VPN

subcollection: secrets-manager


クライアントからサイトへのVPNを使用して、 Secrets Manager

VPC のクライアント・ツー・サイト( C2S )VPN ゲートウェイと仮想プライベート・エンドポイント(VPE)を使用すれば、クライアントのワークステーション(例えば、 OpenVPN Connect を使用する Mac や他の OpenVPN-compatible クライアント)から、 IBM Cloud ネイティブ・パスを介してプライベート専用 IBM Cloud® Secrets Manager に安全にアクセスできます。

VPNが接続を確立すると、VPNは送信元デバイスがトンネルを通してVPE IPのトラフィックを送信することを許可する。 VPNサーバー側では、 トランスレート(SNAT)ルートにより、VPE IPへのトラフィックは、あたかもVPC内のVPNサーバー自身のプライベートIPから発信されているかのように見える。 VPEはVPCアドレス空間内部からのトラフィックのみを受け入れるため、このコンフィギュレーションは必須である。

VPE セキュリティグループでは、 HTTPS (TCP 443) VPNサーバーのプライベートIPからVPEのIPへのみ を許可している。 つまり、このVPNサーバーを経由してくるクライアントだけが Secrets Manager。 VPC内またはインターネット上の他のリソースは、VPEと通信できません。

この例では、ドメイン名解決に /etc/hosts を使用している。 プロダクショングレードのコンフィギュレーションでは、これを IBM Cloud DNS Services に置き換えてください。

この図は、 IBM Cloud ネットワークの外部から、Client-to-Site VPNを使用して Secrets Manager に接続する様子を示しています。
Client-to-Site VPN

開始前に

VPN接続をセットアップする前に、以下の前提条件が整っていることを確認してください。

必要なインスタンスとサービス

  • クライアントからサイトへのVPN証明書および/または username_password のシークレットを管理するための Secrets Manager インスタンス
  • VPN 経由でアクセスしたいプライベート専用の Secrets Manager インスタンス
  • ゲートウェイ・リージョン(GW_REGION)内の既存の IBM Cloud VPCとサブネット

必要なソフトウェアとツール

  • macOS OpenVPN Connect (または他の クライアント) をインストールする。 OpenVPN-compatible
  • IBM Cloud CLIとVPCプラグイン: ibmcloud plugin install vpc-infrastructure
  • jq コマンドラインJSONプロセッサ

ルーティングの競合を避けるため、この設定をテストする前に他のすべてのVPNクライアントを切断してください。

環境変数

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

IBM Cloud アカウントへのログイン

ibmcloud login -r "$GW_REGION" --sso
ibmcloud target -g "$RG_NAME"

VPEセキュリティグループを作成する

VPE専用のセキュリティグループを作成し、その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")

仮想プライベート・エンドポイント(VPE)の作成

Secrets Manager (SM_REGION)インスタンスをターゲットとするVPC(GW_REGION)内にVPEを作成し、サブネットから予約IPを割り当てる。

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 プライベート証明書エンジン

プライベート認証エンジンを使用して CA を作成し、証明書を発行する。 Secrets Manager CLIを設定する:

export SECRETS_MANAGER_URL="$SM_PKI_ENDPOINT"

ルート認証局の作成(CLI)

ルートCAコンフィギュレーションを作成する例(最小限の)コマンド:

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
  • name (ここでは vpn-root-CA )は、後の手順でこのルートCAを参照する方法である。
  • common_namemax_ttl、キー設定などのフィールドを要件に合わせて調整します。

ルートによって署名された中間CAを作成する

先に作成したルートCAによって署名された中間CAコンフィグレーションを作成するコマンドの例:

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

中間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"

証明書テンプレートを作成する

テンプレートは、どのような種類のプライベート証明書を発行できるかを制御する。

中間 CA にバインドされたテンプレートを作成するコマンド例:

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"

VPNサーバー証明書の発行

プライベート証明書エンジンを使用して、テンプレートからサーバー証明書を発行する:

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" \
  • 結果のシークレットCRNをキャプチャし、 VPN_CERT_CRN

クライアント証明書の発行

プライベート証明書エンジンを使用して、テンプレートからクライアント証明書を発行する:

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"

サーバ証明書とクライアント証明書の CRN をキャプチャする:

export VPN_SERVER_CERT_CRN="<CRN of VPN server certificate secret>"
export VPN_CLIENT_CERT_CRN="<CRN of VPN client certificate secret>"

VPNサーバーのセキュリティグループ

パブリックIPからの OpenVPN、すべてのアウトバウンドを許可する。

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

クライアント・ツー・サイトVPNサーバーの作成

サーバは、発行されたサーバ証明書を提示する。

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"

ホストルートを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"

名前解決(例のみ)

Secrets Manager のホスト名をローカルマシンの VPE IP にマップする。

echo "$VPE_IP $SM_HOST" | sudo tee -a /etc/hosts
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

OpenVPN Connectクライアントの準備

サーバープロファイルをダウンロードします:

  • IBM Cloud コンソールの左ナビゲーション・メニューで、Infrastructure(インフラストラクチャー) > Network(ネットワーク) > VPNs(VPN)を選択します。
  • VPC用VPNページで、クライアント-サイト間サーバペインを選択し、 test-vpn を選択します。
  • test-vpn ページで、クライアントタブを選択し、 All client profiles ボタンをクリックして、クライアントプロファイル.ovpn ファイルを ZIP 形式でダウンロードします。
  • ZIPファイルを解凍し、 client.ovpn を OpenVPN Connect にインポートして接続する。

VPNルートを変更したら、VPNクライアントを切断して再接続し、更新されたルート設定を受信します。

から検証する。 macOS

  • curl -v https://$SM_HOST
  • タイムアウトしたら
    • クライアントが $VPE_IP/32 へのルートを持ち、VPNが接続されていることを確認する。
    • ルートアクションがトランスレート(translate)であり、VPEセキュリティグループが TCP 443(または選択したソース)の $VPN_PRIV_IP/32 -> $VPE_IP/32 を許可していることを確認する。
    • VPN サーバーと VPE のライフサイクル状態が stable/ok であることを確認する。
  • ブラウザを使って、 Secrets Manager プライベート専用UIを開く。

macOS でのトラブルシューティング(ルーティングと VPN)

マックによく見られる症状:

  • curl -v https://$SM_HOST ハングアップしてタイムアウトする。
  • curl $VPE_IP に到達しようとすると、 や のようなエラーですぐに失敗する。 Network is down Cannot allocate memory

診断と修理の手順

  1. IBM C2S VPN のみがアクティブであることを確認する
    • Mac上の他のVPNクライアント(企業、個人など)を切断する。
    • test-vpn の OpenVPN プロファイルを接続し、接続済みと表示されるまで待つ。
  2. VPE IPへのルートを確認する
route -n get "$VPE_IP"

健全なセットアップに期待:

  • interfaceutun デバイスである(例えば utun5 )。
  • gateway はトンネルピアアドレス(例: 10.241.x.y または 172.30.x.y )。
  • interfaceutunX ではなく en0/en4 のような場合、トラフィックはVPNをバイパスする。

ルートが間違っている場合は、 IBM VPN、他のVPNを無効にしてVPNトンネルを使用するように上書きする:

# 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"

interface: utun5 (またはそれに類するもの)が表示されたら、再試行してください:

curl -v --max-time 10 "https://$SM_HOST"

それでも curl がタイムアウトする場合:

  • VPNサーバーとVPEが 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'
    
  • VPE Security Group に $VPN_PRIV_IP/32 からのインバウンド TCP 443 ルールが残っていることを確認する:

    ibmcloud is security-group-rules "$VPE_SG_ID"
    

次のステップ

このコンフィギュレーションを本番用に強化するには、以下の改善を検討する:

  • /etc/hosts を IBM Cloud DNS Services プライベートゾーンに置き換えて、適切なDNS解決を行う
  • 2つ目のサブネットとゾーンを追加して、高可用性を実装します
  • クライアント証明書の証明書失効リスト(CRL)処理の設定
  • 最小特権の原則に従うよう、セキュリティグループのルールを厳格化する
  • 多要素認証(MFA)を有効にしてセキュリティを強化する
  • クライアント証明書の失効ポリシーを確立する

セキュリティーに関する考慮事項

このVPNソリューションを導入する際には、以下のセキュリティのベストプラクティスに留意してください:

  • 証明書の管理 :VPN証明書の定期的なローテーションと自動更新プロセスの導入
  • アクセスコントロール :VPNアクセスを必要なIPアドレスとユーザーのみに制限する
  • モニタリング VPN接続とアクセス試行のロギングとモニタリングを有効にする
  • ネットワークのセグメンテーション :セキュリティグループを使用して、厳格なネットワーク・セグメンテーションを実施する
  • 暗号化 :すべてのトラフィックが強力な暗号化プロトコル( TLS 1.2、またはそれ以上)を使用していることを確認します