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
클라이언트 워크스테이션(예: OpenVPN Connect를 사용하는 Mac 또는 다른 OpenVPN-compatible 클라이언트)에서 VPC의 클라이언트-사이트 간( C2S ) VPN 게이트웨이 및 가상 사설 엔드포인트(VPE)를 사용하여 IBM Cloud-기본 경로를 통해 비공개 전용 IBM Cloud® Secrets Manager 에 안전하게 연결할 수 있습니다.
VPN이 연결을 설정하면 소스 장치가 터널을 통해 VPE IP에 대한 트래픽을 전송할 수 있습니다. VPN 서버 측에서는 번역(SNAT) 경로를 통해 VPE IP로 향하는 트래픽이 VPC 내부의 VPN 서버 자체 사설 IP에서 시작된 것처럼 보이게 합니다. 이 구성은 VPE가 VPC 주소 공간 내부의 트래픽만 허용하기 때문에 필요합니다.
VPE 보안 그룹은 VPN 서버의 개인 IP에서 VPE IP로만 HTTPS ( TCP 443)을 허용합니다. 즉, 이 VPN 서버를 통해 들어오는 클라이언트만 Secrets Manager 에 연결할 수 있습니다. VPC 또는 인터넷에 있는 다른 리소스는 VPE와 통신할 수 없습니다.
이 예제에서 도메인 이름 확인은 /etc/hosts 을 사용합니다. 프로덕션 등급 구성의 경우 IBM Cloud DNS Services 으로 대체합니다.
시작하기 전에
VPN 연결을 설정하기 전에 다음 전제 조건이 충족되는지 확인하세요.
필수 인스턴스 및 서비스
- 클라이언트-사이트(Client-to-Site) 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 서버 만들기
CA에 대한 인증서 기반 클라이언트 인증; 서버는 발급된 서버 인증서를 제시합니다.
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 콘솔 왼쪽 탐색 메뉴에서 인프라 > 네트워크 > VPN을 선택합니다.
- VPC용 VPN 페이지에서 클라이언트-사이트 서버 창을 선택하고
test-vpn을 선택합니다. test-vpn페이지에서 클라이언트 탭을 선택하고All client profiles버튼을 클릭하여 클라이언트 프로필.ovpn 파일을 ZIP 형식으로 다운로드합니다.- ZIP 파일을 압축을 풀고
client.ovpn을 OpenVPN 으로 가져와 연결합니다.
VPN 경로를 수정할 때 업데이트된 경로 구성을 받으려면 VPN 클라이언트의 연결을 끊었다가 다시 연결하세요.
다음에서 유효성 검사 macOS
curl -v https://$SM_HOST- 시간이 초과된 경우:
- 클라이언트에
$VPE_IP/32경로가 있고 VPN이 연결되었는지 확인합니다. - 경로 동작이 번역이고 VPE 보안 그룹이 TCP 443(또는 선택한 소스)에서
$VPN_PRIV_IP/32 -> $VPE_IP/32을 허용하는지 확인합니다. - VPN 서버 및 VPE 수명 주기 상태 확인은
stable/ok.
- 클라이언트에
- 브라우저를 사용하여 Secrets Manager 비공개 전용 UI를 엽니다.
macOS (라우팅 및 VPN)에서 문제 해결하기
Mac의 일반적인 증상:
curl -v https://$SM_HOST매달려서 시간을 보냅니다.curl$VPE_IP에 연결하려고 할 때Network is down또는Cannot 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 보안 그룹에
$VPN_PRIV_IP/32에서 인바운드 TCP 443 규칙이 여전히 있는지 확인합니다:ibmcloud is security-group-rules "$VPE_SG_ID"
다음 단계
프로덕션용으로 이 구성을 개선하려면 다음과 같은 개선 사항을 고려하세요:
- 적절한 DNS 확인을 위해
/etc/hosts을 IBM Cloud DNS Services 개인 영역으로 바꾸세요 - 두 번째 서브넷과 영역을 추가하여 고가용성 구현하기
- 클라이언트 인증서에 대한 CRL(인증서 해지 목록) 처리 구성하기
- 최소 권한 원칙을 따르도록 보안 그룹 규칙을 강화하세요
- 추가 보안을 위해 MFA(다단계 인증) 사용
- 클라이언트 인증서 해지 정책 설정
보안 고려사항
이 VPN 솔루션을 구현할 때 다음 보안 모범 사례를 염두에 두세요:
- 인증서 관리: VPN 인증서를 정기적으로 교체하고 자동화된 갱신 프로세스를 구현합니다
- 액세스 제어: VPN 액세스를 필요한 IP 주소와 사용자로만 제한하세요
- 모니터링: VPN 연결 및 액세스 시도에 대한 로깅 및 모니터링 활성화
- 네트워크 세분화: 보안 그룹을 사용하여 엄격한 네트워크 세분화 적용
- 암호화: 모든 트래픽이 강력한 암호화 프로토콜( TLS 1.2 이상)을 사용하도록 합니다