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 に置き換えてください。
開始前に
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_name、max_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 downCannot allocate memory
診断と修理の手順
- IBM C2S VPN のみがアクティブであることを確認する
- Mac上の他のVPNクライアント(企業、個人など)を切断する。
test-vpnの OpenVPN プロファイルを接続し、接続済みと表示されるまで待つ。
- VPE IPへのルートを確認する
route -n get "$VPE_IP"
健全なセットアップに期待:
interfaceはutunデバイスである(例えばutun5)。gatewayはトンネルピアアドレス(例:10.241.x.yまたは172.30.x.y)。interfaceがutunXではなく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、またはそれ以上)を使用していることを確認します