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 으로 대체합니다.

이 다이어그램은 IBM Cloud 네트워크 외부에서 Secrets Manager 으로 연결하는 과정을 보여줍니다. 이 연결은 클라이언트-사이트 VPN을 통해 이루어집니다.
클라이언트-사이트 VPN

시작하기 전에

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 과 같은 오류와 함께 즉시 실패합니다.

진단 및 수정 단계

  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 보안 그룹에 $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 이상)을 사용하도록 합니다