이 페이지에서는 인그레스 및 이그레스 규칙을 사용하여 VPC 네트워크의 내부 IP 주소에서 서비스 경계로의 트래픽을 허용하는 방법을 설명합니다.
개요
VPC 서비스 제어를 사용하여 VPC 네트워크의 특정 IP 주소 범위에서 보호된 프로젝트 및 VPC 네트워크에 액세스할 수 있는 조건을 지정할 수 있습니다. 이 기능을 사용하면 다음 작업을 수행할 수 있습니다.
기본 액세스 수준 조건을 지원하여 VPC 네트워크의 내부 IP 주소 범위를 허용합니다.
서비스 경계를 드나드는 인그레스 또는 이그레스 API 호출에 이러한 액세스 수준 조건을 사용할 수 있습니다.
이 기능은 다음과 같은 이점을 제공합니다.
VPC 네트워크의 내부 IP 주소에서 액세스할 수 있도록 VPC 서비스 제어 구성에서 조건을 지정할 수 있습니다.
API 호출이 여러 서비스 경계를 통과해야 하는 워크플로는 전체 VPC 네트워크 또는 프로젝트를 허용하는 대신 일부 서브넷만 허용하도록 액세스를 제한할 수 있습니다.
온프레미스의 다른 리소스가 특정 Google Cloud 리소스에만 액세스하도록 구성할 수 있습니다. 액세스 수준의 일부로 이러한 온프레미스 리소스 및 시작 영역 VPC 네트워크와 연결된 서브넷의 IP 주소 범위를 사용해야 합니다.
그림 1은 승인된 내부 IP 주소에서 특정 보호된 서비스에 대한 액세스를 허용하는 설정 예시를 보여줍니다.
내부 IP 주소 사용 제한사항
VPC 서비스 제어에서 내부 IP 주소를 사용할 때 다음 제한사항이 적용됩니다.
커스텀 액세스 수준이 아닌 기본 액세스 수준에서만 내부 IP 주소를 사용 설정할 수 있습니다.
예기치 않은 동작이 발생할 수 있으므로 내부 IP 주소 기반 조건을 사용하여 액세스 수준을 무효화하지 않는 것이 좋습니다.
VPC 네트워크를 서비스 경계에 추가하는 경우의 제한사항도 적용됩니다.
VPC 서비스 제어는 정책 거부 감사 로그를 로깅할 때 감사 로그에서 VPC 네트워크 이름을
__UNKNOWN__
으로 수정합니다.SUBNET_MODE
가custom
으로 설정되었지만 서브넷이 없는 VPC 네트워크는 지원되지 않습니다. 내부 IP 주소를 사용 설정하려면 VPC 네트워크에 서브넷이 최소 하나 이상 포함되어 있어야 합니다.액세스 정책 내 모든 액세스 수준에서 VPC 네트워크 500개만 지정할 수 있습니다.
액세스 수준이나 서비스 경계에서 참조하는 VPC 네트워크를 삭제한 다음 같은 이름으로 다른 VPC 네트워크를 다시 만들면 VPC 서비스 제어가 다시 만든 VPC 네트워크에서 내부 IP 주소를 자동으로 사용 설정하지 않습니다. 이러한 제한을 해결하려면 다른 이름으로 VPC 네트워크를 만들고 경계에 추가합니다.
내부 IP 주소를 사용하여 Google 관리형 서비스에서의 액세스를 허용할 수 없습니다. 예를 들면 Cloud SQL입니다.
이그레스 규칙에 내부 IP 주소 기반 조건이 있는 액세스 수준을 사용하는 경우 기기 유형, 사용자 ID와 같은 다른 조건을 액세스 수준에 추가하지 않는 것이 좋습니다.
내부 IP 주소가 지리적 리전을 참조하는 액세스 수준과 일치하지 않습니다.
액세스 수준에서 내부 IP 주소 사용
기본 액세스 수준 조건의
vpcNetworkSources
필드에 VPC 네트워크 이름과 IP 주소 범위를 지정합니다.VPC 네트워크 이름. VPC 네트워크 이름은 다음 형식으로 정의해야 합니다.
//compute.googleapis.com/projects/PROJECT_ID/global/networks/NETWORK_NAME
예를 들면
//compute.googleapis.com/projects/my-project/global/networks/my-vpc
입니다.IP 주소 범위.
VpcNetworkSource
의VpcSubNetwork
필드에 지정된 IP 주소 범위는 CIDR 블록 IP 서브네트워크 사양을 따라야 합니다. 서브넷에 유효한 IPv4 범위인 모든 IP 주소 범위를 사용할 수 있습니다.
IngressSource
또는EgressSource
에서 허용 조건과 함께 이 액세스 수준을 사용합니다.
다음 섹션에서는 예시 시나리오를 사용하여 이러한 단계를 수행하여 내부 IP 주소를 사용 설정하는 방법을 설명합니다.
내부 IP 주소를 사용한 서브넷 액세스 설정의 예시
다음 예시에는 프로젝트가 두 개 있습니다.
네트워크 호스트 프로젝트:
Project1
은 VPC 네트워크default
를 호스팅합니다.Project1
,VM1
,VM2
의 두 VM은 이 네트워크를 네트워크 인터페이스로 사용하여 트래픽을 전송합니다.Cloud Storage 프로젝트:
Project2
에는 Cloud Storage 버킷이 포함됩니다.
VPC 서비스 제어를 사용하여 Project1
의 VM1
만 내부 IP 주소를 사용하여 Project2
의 Cloud Storage 버킷에 액세스하도록 허용할 수 있습니다.
이 설정을 수행하려면 다음 단계를 수행해야 합니다.
Project1
의 서비스 경계sp1
을 만들고Project2
의 또 다른 서비스 경계sp2
를 만듭니다.그런 다음 서비스 경계에 인그레스 및 이그레스 규칙을 추가하여
VM1
의 Cloud Storage 버킷에 대한 서브넷 액세스만 허용할 수 있습니다.
다음 다이어그램에서는 이 예시에 설명된 설정을 보여줍니다.
조직 수준에서 액세스 정책 구성
조직 수준에 액세스 정책이 있는지 확인합니다. 이 수준의 액세스 정책이 없으면 다음 gcloud CLI 명령어를 실행합니다.
gcloud access-context-manager policies create \ --organization=ORGANIZATION_ID --title=POLICY_TITLE
다음을 바꿉니다.
ORGANIZATION_ID: 조직의 숫자 ID입니다.
POLICY_TITLE: 인간이 읽을 수 있는 액세스 정책 제목입니다.
자세한 내용은 조직 수준 액세스 정책 만들기를 참조하세요.
이 정책을 기본 액세스 정책으로 설정하려면 다음 gcloud CLI 명령어를 실행합니다.
gcloud config set access_context_manager/policy POLICY_NAME
POLICY_NAME을 액세스 정책의 숫자 이름으로 바꿉니다.
자세한 내용은
gcloud
명령줄 도구의 기본 액세스 정책 설정을 참조하세요.
네트워크 호스트 프로젝트 및 Cloud Storage 프로젝트를 보호하는 경계 만들기
Project1
의 경계sp1
을 만들려면 다음 gcloud CLI 명령어를 실행합니다.gcloud access-context-manager perimeters create sp1 --title="sp1" --resources=PROJECT_NUMBER \ --restricted-services=storage.googleapis.com --policy=POLICY_NAME
다음을 바꿉니다.
PROJECT_NUMBER: 네트워크 호스트 프로젝트의 프로젝트 번호입니다. 예를 들면
projects/111
입니다.POLICY_NAME: 액세스 정책의 숫자 이름입니다. 예를 들면
1234567890
입니다.
Cloud Storage 서비스를 제한하는
Project2
의 경계sp2
를 만들려면 다음 gcloud CLI 명령어를 실행합니다.gcloud access-context-manager perimeters create sp2 --title="sp2" --resources=PROJECT_NUMBER \ --restricted-services=storage.googleapis.com --policy=POLICY_NAME
다음을 바꿉니다.
PROJECT_NUMBER: Cloud Storage 프로젝트의 프로젝트 번호입니다. 예를 들면
projects/222
입니다.POLICY_NAME: 액세스 정책의 숫자 이름입니다. 예를 들면
1234567890
입니다.
서비스 경계를 만드는 방법에 대한 자세한 내용은 서비스 경계 만들기를 참조하세요.
이러한 두 경계를 만든 후에는 더 이상 두 VM에서 Cloud Storage 버킷에 액세스할 수 없습니다.
내부 IP 주소 기반 액세스 조건으로 액세스 수준 만들기
VM1
의 서브넷에서 들어오는 트래픽만 허용하는 액세스 수준을 만듭니다.
액세스 조건을 정의하는 YAML 파일을 만듭니다. 다음 샘플에서는 내부 IP 주소를 사용 설정하는 데 필요한 속성만 보여줍니다.
echo """ - vpcNetworkSources: - vpcSubnetwork: network: VPC_NETWORK_NAME vpcIpSubnetworks: - IP_RANGE """ > level.yaml
다음을 바꿉니다.
VPC_NETWORK_NAME:
VM1
이 있는 VPC 네트워크의 이름입니다. 예를 들면//compute.googleapis.com/projects/Project1/global/networks/default
입니다.IP_RANGE: 서브넷의 IP 주소 범위입니다. 예를 들면
10.10.0.0/24
입니다.
앞에서 설명한 VPC 네트워크 이름과 IP 주소 범위 형식을 사용합니다.
YAML 파일에 대한 자세한 내용은
basic-level-spec
YAML 파일을 참조하세요.YAML 파일을 사용하여 액세스 수준을 만들려면 다음 gcloud CLI 명령어를 실행합니다.
gcloud access-context-manager levels create LEVEL_NAME \ --title="TITLE" --basic-level-spec=FILE_NAME
다음을 바꿉니다.
LEVEL_NAME: 액세스 수준의 고유한 이름입니다. 예를 들면
allowvm1
입니다.TITLE: 액세스 수준의 인간이 읽을 수 있는 짧은 제목입니다. 예를 들면
allowvm1
입니다.FILE_NAME: 액세스 수준의 액세스 조건을 정의하는 YAML 파일입니다. 예를 들면
level.yaml
입니다.
자세한 내용은 기본 액세스 수준 만들기를 참조하세요.
Cloud Storage 버킷에 대한 인바운드 API 트래픽을 허용하도록 인그레스 정책 구성
VM1
에서의 액세스만 허용하려면 Cloud Storage API 트래픽이 경계에 들어가도록 sp2
경계에 인그레스 정책을 구성합니다.
인그레스 정책을 정의하는 YAML 파일을 만듭니다.
echo """ - ingressFrom: identityType: ANY_IDENTITY sources: - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME ingressTo: operations: - methodSelectors: - method: '*' serviceName: storage.googleapis.com resources: - '*' """ > ingress.yaml
다음을 바꿉니다.
POLICY_NAME: 액세스 정책의 숫자 이름입니다. 예를 들면
1234567890
입니다.ACCESS_LEVEL_NAME: 액세스 수준의 이름입니다. 예를 들면
allowvm1
입니다.
YAML 파일에 대한 자세한 내용은 인그레스 규칙 참조를 확인하세요.
서비스 경계에 대한 인그레스 정책을 업데이트하려면 다음 gcloud CLI 명령어를 실행합니다.
gcloud access-context-manager perimeters update PERIMETER --set-ingress-policies=FILE_NAME
다음을 바꿉니다.
PERIMETER: Cloud Storage 프로젝트를 보호하는 서비스 경계의 이름입니다. 예를 들면
sp2
입니다.FILE_NAME: 인그레스 정책을 정의하는 YAML 파일입니다. 예를 들면
ingress.yaml
입니다.
자세한 내용은 서비스 경계의 인그레스 및 이그레스 정책 업데이트를 참조하세요.
Cloud Storage 버킷에 대한 아웃바운드 API 트래픽을 허용하도록 이그레스 정책 구성
또한 Cloud Storage API 트래픽이 경계를 나갈 수 있도록 sp1
경계에 이그레스 정책을 구성합니다.
이그레스 정책을 정의하는 YAML 파일을 만듭니다. YAML 파일에서
sourceRestriction
필드를SOURCE_RESTRICTION_ENABLED
로 설정해야 합니다.echo """ - egressFrom: identityType: ANY_IDENTITY sourceRestriction: SOURCE_RESTRICTION_ENABLED sources: - accessLevel: accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME egressTo: operations: - methodSelectors: - method: '*' serviceName: storage.googleapis.com resources: - '*' """ > egress.yaml
다음을 바꿉니다.
POLICY_NAME: 액세스 정책의 숫자 이름입니다. 예를 들면
1234567890
입니다.ACCESS_LEVEL_NAME: 액세스 수준의 이름입니다. 예를 들면
allowvm1
입니다.
YAML 파일에 대한 자세한 내용은 이그레스 규칙 참조를 확인하세요.
서비스 경계의 이그레스 정책을 업데이트하려면 다음 명령어를 실행합니다.
gcloud access-context-manager perimeters update PERIMETER --set-egress-policies=FILE_NAME
다음을 바꿉니다.
PERIMETER: 네트워크 호스트 프로젝트를 보호하는 서비스 경계의 이름입니다. 예를 들면
sp1
입니다.FILE_NAME: 이그레스 정책을 정의하는 YAML 파일입니다. 예를 들면
egress.yaml
입니다.
자세한 내용은 서비스 경계의 인그레스 및 이그레스 정책 업데이트를 참조하세요.
인그레스 및 이그레스 정책을 구성하면 VM1
에서 Cloud Storage 버킷에 액세스할 수 있지만 VM2
에서는 Cloud Storage 버킷에 액세스할 수 없습니다.
권장사항
내부 IP 주소를 사용 설정할 때 VM의 IP 전달을 중지하는 것이 좋습니다. IP 전달을 사용하면 동일한 VPC 네트워크 내의 VM이 다른 IP 주소를 사용하여 요청을 보낼 수 있으므로 IP 주소 스푸핑 위험이 발생할 수 있습니다.
IP 전달을 사용 설정하려면 다음 구성을 사용하여 IP 주소 스푸핑 위험을 줄이는 것이 좋습니다.
Restrict VM IP Forwarding
조직 정책 제약조건(constraints/compute.vmCanIpForward
)을 사용하여 승인된 VM만 IP 전달을 사용 설정할 수 있도록 합니다.방화벽 규칙의 소스를 사용하여 IP 전달이 사용 설정된 VM과 통신할 수 있는 IP 주소를 제한합니다. 다음 태스크를 완료합니다.
특정 IP 주소 범위에서 IP 전달이 사용 설정된 VM으로의 인바운드 트래픽만 허용하도록 인그레스 방화벽 규칙을 설정합니다.
IP 전달이 사용 설정된 VM에서 특정 IP 주소 범위로의 아웃바운드 트래픽만 허용하도록 이그레스 방화벽 규칙을 설정합니다.