이 페이지에서는 IAP(Identity-Aware Proxy) TCP 전달을 사용하여 외부 IP 주소가 없거나 인터넷을 통한 직접 액세스를 허용하지 않는 VM 인스턴스에 대한 관리 액세스를 사용 설정하는 방법에 대해 설명합니다.
IAP TCP 전달을 사용하면 SSH, RDP, 기타 트래픽을 VM 인스턴스로 전달할 수 있는 암호화된 터널을 설정할 수 있습니다. IAP TCP 전달은 또한 터널을 설정할 수 있는 사용자와 사용자가 연결할 수 있는 VM 인스턴스를 세부적으로 제어할 수 있게 합니다.
IAP TCP 전달 작동 방법에 대한 자세한 내용은 TCP 전달 개요를 참조하세요.
IAP TCP 전달을 위한 프로젝트 준비
이 섹션에서는 Google Cloud 프로젝트에서 IAP TCP 전달을 사용 설정하는 데 필요한 단계를 안내합니다.
방화벽 규칙 만들기
IAP가 VM 인스턴스에 연결하도록 하려면 다음과 같은 방화벽 규칙을 만드세요.
- IAP를 사용하여 액세스할 수 있는 모든 VM 인스턴스에 적용됩니다.
- IP 범위
35.235.240.0/20
에서의 인그레스 트래픽을 허용합니다. 이 범위에는 IAP가 TCP 전달을 위해 사용하는 모든 IP 주소가 포함됩니다. - IAP TCP 전달을 사용하여 액세스할 수 있는 모든 포트(예: SSH의 경우 포트
22
및 RDP의 경우 포트3389
)에 대한 연결을 허용합니다.
콘솔
네트워크의 모든 VM 인스턴스에 대한 RDP 및 SSH 액세스를 허용하려면 다음 안내를 따르세요.
- 방화벽 규칙 페이지를 엽니다.
나머지 단계는 Google Cloud 콘솔에 표시됩니다.
- Google Cloud 프로젝트를 선택합니다.
확인해 보기 - 방화벽 규칙 페이지에서
방화벽 규칙 만들기 를 클릭합니다. - 다음 설정을 구성합니다.
- 이름:
allow-ingress-from-iap
- 트래픽 방향: 인그레스
- 대상: 네트워크의 모든 인스턴스
- 소스 필터: IP 범위
- 소스 IP 범위:
35.235.240.0/20
- 프로토콜 및 포트: TCP를 선택하고
22,3389
를 입력하여 RDP 및 SSH를 모두 허용하세요.
- 이름:
- 만들기를 클릭합니다.
gcloud
네트워크의 모든 VM 인스턴스에 대한 RDP 액세스를 허용하려면 다음을 실행하세요.
gcloud compute firewall-rules create allow-rdp-ingress-from-iap \ --direction=INGRESS \ --action=allow \ --rules=tcp:3389 \ --source-ranges=35.235.240.0/20
SSH 액세스의 경우 다음을 실행하세요.
gcloud compute firewall-rules create allow-ssh-ingress-from-iap \ --direction=INGRESS \ --action=allow \ --rules=tcp:22 \ --source-ranges=35.235.240.0/20
다른 프로토콜의 경우 다음을 실행하세요.
gcloud compute firewall-rules create allow-ingress-from-iap \ --direction=INGRESS \ --action=allow \ --rules=tcp:PORT \ --source-ranges=35.235.240.0/20
여기서 PORT
는 프로토콜이 사용하는 포트입니다.
IAP TCP 전달을 위한 역할 부여
IAP TCP 전달을 사용할 수 있는 사용자 및 그룹과 연결할 수 있는 VM 인스턴스를 제어하려면 프로젝트에 대해 적절한 Identity and Access Management(IAM) 역할을 부여하세요.
OS 로그인을 사용하는 경우(권장) 사용자 계정에 OS 로그인 역할 구성을 참조하세요.
다음 표에서는 TCP 전달 및 관련 태스크에 대해 신뢰할 수 있는 관리자에게 부여해야 하는 사전 정의된 역할을 보여줍니다.
작업 | 역할 | 추가 정보 |
---|---|---|
TCP 전달 |
IAP 보안 터널 사용자(roles/iap.tunnelResourceAccessor )
|
프로젝트의 모든 VM 인스턴스에 액세스 권한 부여 또는 특정 VM에 액세스 권한 부여를 참조하세요. |
SSH 액세스 권한 |
Compute 인스턴스 관리자(v1)(roles/compute.instanceAdmin.v1 )
|
|
서비스 계정 사용 | 서비스 계정 사용자(roles/iam.serviceAccountUser ) |
serviceAccountUser 역할을 참조하세요. |
이 태스크에 필요한 특정 권한만 포함된 커스텀 역할을 만들려면 권한 세부정보를 참조하세요.
필요한 역할을 부여하는 방법에 따라 프로젝트의 모든 VM 인스턴스 또는 특정 VM에 사용자 또는 그룹 액세스 권한을 부여할 수 있습니다.
태그가 지원되지 않음
IAP TCP 전달에 태그를 사용한 권한 부여는 현재 지원되지 않습니다.
프로젝트의 모든 VM 인스턴스에 액세스 권한 부여
프로젝트 수준에서 필요한 IAM 역할을 부여하여 프로젝트의 모든 VM 인스턴스에 사용자 또는 그룹 액세스 권한을 부여할 수 있습니다.
콘솔
- Google Cloud 콘솔에서 IAM 및 관리자 페이지를 엽니다.
나머지 단계는 Google Cloud 콘솔에 표시됩니다.
- IAM 및 관리자 페이지에서 추가를 클릭하고 다음을 구성합니다.
- 새 주 구성원: 액세스 권한을 부여할 사용자 또는 그룹을 지정합니다.
- 역할 선택 Cloud IAP > IAP 보안 터널 사용자를 선택합니다.
- 필요한 경우 조건 추가를 클릭하고 조건을 구성합니다.
- 제목: 조건 이름을 입력합니다.
- 표현식: IAP 보안 터널 사용자 역할의 권한을 얻기 위해 사용자가 충족해야 하는 조건을 입력합니다.
예를 들어 다음 CEL 표현식은 포트 22에 대한 액세스 권한만 부여합니다.
destination.port == 22
액세스 수준에 따라 액세스 권한을 부여할 수도 있습니다.
destination.port == 22 && "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels
FULL_ACCESS_LEVEL_NAME
은 기존 액세스 수준이며 다음 형식을 사용합니다.accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
- 다른 역할 추가를 클릭하고 다음을 구성합니다.
- 역할 선택에서 Compute Engine > Compute 인스턴스 관리자(v1)를 선택합니다.
- 저장을 클릭합니다.
gcloud
다음 명령어를 실행하여 사용자에게 두 가지 역할을 부여하세요.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:EMAIL \ --role=roles/iap.tunnelResourceAccessor gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:EMAIL \ --role=roles/compute.instanceAdmin.v1
다음을 바꿉니다.
PROJECT_ID
: 프로젝트의 IDEMAIL
: 액세스 권한을 부여하려는 사용자의 이메일 주소(예:user@example.com
)
특정 VM에 대한 액세스 권한 부여
사용자 또는 그룹에 특정 VM에 대한 액세스 권한을 부여하려면 해당 VM에서 roles/iap.tunnelResourceAccessor
역할을 부여합니다. 다른 역할은 프로젝트에 부여되어 있어야 합니다.
콘솔
- IAP 관리 페이지를 열고 SSH 및 TCP 리소스 탭을 선택합니다.
Chrome Enterprise Premium 관리 페이지 열기
나머지 단계는 Google Cloud 콘솔에 표시됩니다.
- IAP 관리 페이지의 SSH 및 TCP 리소스 탭에서 구성할 VM 인스턴스를 선택합니다.
- 정보 패널이 보이지 않으면 정보 패널 표시를 클릭합니다.
주 구성원 추가를 클릭하고 다음을 구성합니다.
- 새 주 구성원: 액세스 권한을 부여할 사용자나 그룹을 지정합니다.
- 역할 선택 Cloud IAP > IAP 보안 터널 사용자를 선택합니다.
필요한 경우 조건 추가를 클릭하고 조건을 구성합니다.
- 제목: 조건 이름을 입력합니다.
- 표현식: IAP 보안 터널 사용자 역할의 권한을 얻기 위해 사용자가 충족해야 하는 조건을 입력합니다.
예를 들어 다음 CEL 표현식은 포트 22에 대한 액세스 권한만 부여합니다.
destination.port == 22
액세스 수준에 따라 액세스 권한을 부여할 수도 있습니다.
destination.port == 22 &&
"FULL_ACCESS_LEVEL_NAME" in request.auth.access_levelsFULL_ACCESS_LEVEL_NAME
은 기존 액세스 수준이며accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
형식을 사용합니다.- 저장을 클릭합니다.
API
애플리케이션의 policy.json
파일을 편집하려면 아래 프로세스를 따르세요.
IAM API를 사용하여 액세스 정책을 관리하는 방법에 대한 자세한 내용은 Chrome Enterprise Premium 보안 리소스에 대한 액세스 관리를 참고하세요.
다음 변수를 내보냅니다.
export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy export JSON_NEW_POLICY=POLICY_FILE.JSON
getIamPolicy
메서드를 사용하여 Compute Engine 인스턴스의 IAM 정책을 가져옵니다. 마지막에 비어 있는 데이터 비트는curl
요청을 GET 대신 POST로 전환합니다.curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \ -d ''
IAM 정책 JSON 파일을 수정하여 주 구성원에게
iap.tunnelResourceAccessor
역할을 부여합니다.필요한 경우 IAM 조건 및 액세스 수준에 따라 특정 기준을 충족하는 주 구성원에게만 역할을 부여합니다.
다음은
iap.tunnelResourceAccessor
역할을 VM 인스턴스 관리자 그룹에 부여하여 Chrome Enterprise Premium 보안 터널 리소스에 대한 액세스 권한을 부여하는 수정된policy.json
파일의 예시입니다.destination.ip
및destination.port
IAM 조건을 사용하여 포트22
에서 비공개 IP 주소가10.0.0.1
인 VM 인스턴스 관리자 그룹의 주 구성원만 리소스에 액세스할 수 있도록 IAM 조건이 추가되었습니다. 또한 ACCESS_LEVEL_NAME 액세스 수준의 요구 사항을 충족해야 합니다.주 구성원에게 소유자 역할이 있는 경우 TCP 전달에 IAP를 사용할 수 있는 권한이 있습니다.
예시 policy.json 파일{ "policy": { "bindings": [ { "role": "roles/iap.tunnelResourceAccessor", "members": ["group:instance-admins@example.com"], "condition": { "expression": "\"accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME\" in request.auth.access_levels && destination.ip == \"10.0.0.1\" && destination.port == 22", "title": "CONDITION_NAME" } } ] } }
정책 이름을 찾으려면
accessPolicies.list
를 호출합니다.GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
setIamPolicy
메서드를 사용하여 새policy.json
파일을 설정합니다.curl -i -H "Content-Type:application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:setIamPolicy \ -d @${JSON_NEW_POLICY}
권한 세부정보
필수 권한은 사용자가 IAP TCP 전달을 사용하는 방법에 따라 다음과 같이 달라집니다.
Scenarios | 권한 필요 | |
---|---|---|
전체 |
|
|
gcloud compute [start-iap-tunnel, ssh, scp] 사용 |
|
|
gcloud compute [ssh, scp] 사용 |
|
|
OS 로그인을 사용하는 VM | 이 안내를 참고하세요. | |
OS 로그인을 사용하지 않음 |
|
|
서비스 계정을 사용하여 SSH를 통해 VM에 연결 |
|
|
브라우저에서 SSH를 통해 연결 | 이 안내를 참고하세요. |
예를 들어 사용자가 OS 로그인을 사용하지 않지만 서비스 계정을 사용하는 VM에 gcloud compute ssh
를 사용하여 연결하려는 경우 사용자에게 다음 권한이 필요합니다.
iap.tunnelInstances.accessViaIAP
compute.instances.get
compute.instances.list
compute.projects.get
compute.instances.setMetadata
compute.projects.setCommonInstanceMetadata
compute.globalOperations.get
iam.serviceAccounts.actAs
SSH 연결 터널링
IAP를 통해 SSH 트래픽을 터널링하여 외부 IP 주소가 없는 Linux 인스턴스에 연결할 수 있습니다.
IAP 터널링을 사용하면 IAP 프록시가 VM의 기본 내부 IPv4 주소인 nic0
에 연결합니다.
콘솔
인스턴스에 연결하려면 Google Cloud 콘솔에서 SSH 버튼을 사용합니다. 인스턴스의 액세스 구성(IAM 권한을 통해 정의)은 IAP를 통한 TCP 터널링을 허용해야 합니다.
gcloud
인스턴스에 연결하려면 gcloud compute ssh
명령어를 사용합니다. 인스턴스의 액세스 구성(IAM 권한을 통해 정의)은 IAP를 통한 TCP 터널링을 허용해야 합니다.
gcloud compute ssh INSTANCE_NAME
INSTANCE_NAME을 SSH를 통해 연결할 인스턴스의 이름으로 바꿉니다.
인스턴스에 외부 IP 주소가 없는 경우 연결은 자동으로 IAP TCP 터널링을 사용합니다. 인스턴스에 외부 IP 주소가 있는 경우 연결은 IAP TCP 터널링 대신 외부 IP 주소를 사용합니다.
gcloud compute ssh
가 항상 IAP TCP 터널링을 사용하도록 --tunnel-through-iap
플래그를 사용할 수 있습니다.
gcloud compute ssh
가 IAP TCP 터널링을 사용하지 않고 VM의 내부 IP에 직접 연결하도록 --internal-ip
플래그를 사용합니다. 이렇게 하면 대상 VM과 동일한 VPC 네트워크에 연결된 클라이언트에 유용합니다.
IAP 데스크톱
IAP 데스크톱을 사용하면 SSH 및 IAP TCP 전달을 통해 VM 인스턴스에 연결할 수 있습니다.
애플리케이션에서 파일 > Google Cloud 프로젝트 추가를 선택합니다.
프로젝트의 ID 또는 이름을 입력하고 확인을 클릭합니다.
프로젝트 탐색기 창에서 연결하려는 VM 인스턴스를 마우스 오른쪽 단추로 클릭하고 연결을 선택합니다.
IAP 데스크톱에 대한 자세한 내용은 GitHub 프로젝트 페이지를 참조하세요.
PuTTY 앱
IAP TCP 전달을 사용하여 VM 인스턴스에 연결하도록 PuTTY Windows 터미널 에뮬레이터 앱을 설정할 수 있습니다. 인스턴스의 액세스 구성(IAM 권한을 통해 정의)은 IAP를 통한 TCP 터널링을 허용해야 합니다.
PuTTY 앱을 구성하기 전에 gcloud compute ssh
명령어를 한 번 사용하여 로컬 컴퓨터에 비공개 SSH 키가 있고 공개 SSH 키가 Compute Engine에 게시되어 있는지 확인합니다.
명령 프롬프트를 열고 다음 명령어를 실행하여 VM 인스턴스에 연결합니다.
gcloud compute ssh INSTANCE_NAME ` --tunnel-through-iap ` --project PROJECT_ID ` --zone ZONE
다음을 바꿉니다.
- INSTANCE_NAME: 연결할 인스턴스의 이름
- PROJECT_ID: VM 인스턴스가 있는 프로젝트의 프로젝트 ID
- ZONE: VM 인스턴스가 있는 영역
필요에 따라
Y
를 눌러 SSH 키를 생성할 것인지 확인합니다.VM에서 다음 명령어를 실행하여 사용자 이름을 확인합니다.
whoami
나중에 이 사용자 이름이 필요합니다.
이제 IAP TCP 전달을 사용하도록 PuTTY 앱을 구성할 수 있습니다.
- PuTTY 앱을 열고 카테고리 연결 > 프록시를 선택합니다.
다음 프록시 설정을 구성합니다.
- Proxy type(프록시 유형)으로 Local(로컬)을 선택합니다.
Telnet command, or local proxy command(Telnet 명령어 또는 로컬 프록시 명령어) 필드에 다음을 입력합니다.
gcloud.cmd compute start-iap-tunnel %host %port --listen-on-stdin --project PROJECT_ID --zone ZONE
다음을 바꿉니다.
- PROJECT_ID: VM 인스턴스가 있는 프로젝트의 프로젝트 ID
- ZONE: VM 인스턴스가 있는 영역
Print proxy diagnostics in the terminal window(터미널 창에서 프록시 진단 인쇄)에 Only until session starts(세션이 시작될 때까지만)를 선택합니다.
Connection(연결) > SSH > Auth(인증) 카테고리를 선택합니다.
Browse(찾아보기)를 클릭하고 다음 파일 이름을 붙여넣은 다음 Open(열기)을 클릭합니다.
%USERPROFILE%\.ssh\google_compute_engine.ppk
Session(세션) 카테고리를 선택합니다.
다음 프록시 설정을 구성합니다.
Host name (or IP address)(호스트 이름 또는 IP 주소) 필드에 다음을 입력합니다.
USERNAME@INSTANCE_NAME
다음을 바꿉니다.
- USERNAME: 이전에 결정한 Linux 사용자 이름
- INSTANCE_NAME: 연결할 VM 인스턴스의 이름
Saved sessions(저장된 세션): 세션의 이름을 입력합니다.
저장을 클릭합니다.
열기를 클릭하여 SSH 세션을 시작합니다.
ssh
gcloud
를 사용하는 ProxyCommand
옵션과 함께 ssh 명령어를 직접 사용하여 터널을 시작할 수 있습니다. 이를 사용해서 전체 ssh
명령어를 생성할 수 있습니다.
gcloud compute ssh INSTANCE_NAME --dry-run
RDP 연결 터널링
IAP를 통해 RDP 트래픽을 터널링하여 외부 IP 주소가 없는 Windows 인스턴스에 연결할 수 있습니다.
IAP 데스크톱
IAP 데스크톱을 사용하여 IAP TCP 전달을 통해 하나 이상의 VM 인스턴스의 원격 데스크톱에 연결할 수 있습니다.
애플리케이션에서 파일 > Google Cloud 프로젝트 추가를 선택합니다.
프로젝트의 ID 또는 이름을 입력하고 확인을 클릭합니다.
프로젝트 탐색기 창에서 연결하려는 VM 인스턴스를 마우스 오른쪽 단추로 클릭하고 연결을 선택합니다.
IAP 데스크톱에 대한 자세한 내용은 GitHub 프로젝트 페이지를 참조하세요.
gcloud
VM 인스턴스의 원격 데스크톱에 연결하려면 먼저 터널을 만듭니다.
gcloud compute start-iap-tunnel
명령어를 사용하여 VM 인스턴스의 RDP 포트에 대한 암호화된 터널을 만듭니다.gcloud compute start-iap-tunnel INSTANCE_NAME 3389 \ --local-host-port=localhost:LOCAL_PORT \ --zone=ZONE
INSTANCE_NAME을 연결하려는 VM 인스턴스의 이름으로 바꿉니다. LOCAL_PORT를 프록시를 결합하려는 localhost 포트로 바꾸거나 0을 사용하여 사용되지 않은 포트를 자동으로 선택합니다. ZONE을 VM 인스턴스가 있는 영역으로 바꿉니다.
gcloud
는 VM 인스턴스로 연결 테스트를 수행한 후 터널을 열고 포트 번호를 표시합니다.Listening on port [LOCAL_PORT].
localhost:LOCAL_PORT로 전송된 모든 트래픽은 VM 인스턴스로 전달됩니다. 포트는 로컬 컴퓨터에서 실행 중인 애플리케이션에서만 액세스할 수 있습니다.
gcloud
를 실행 중인 상태로 두고 Microsoft Windows 원격 데스크톱 연결 앱을 엽니다.컴퓨터 이름으로 터널 엔드포인트를 입력합니다.
localhost:LOCAL_PORT
LOCAL_PORT를 터널이
gcloud
로 열렸을 때 표시된 포트 번호로 바꿉니다.연결을 클릭합니다.
다른 TCP 연결 터널링
gcloud compute start-iap-tunnel
명령어를 사용하여 로컬 포트를 할당하여 다른 TCP 기반 프로토콜에 IAP TCP 전달을 사용할 수 있습니다. 로컬 포트는 HTTPS 스트림에서 로컬 머신으로부터 원격 머신으로의 데이터 트래픽을 터널링합니다. 그런 다음 IAP가 데이터를 수신하고 액세스 제어를 적용하고 래핑 해제된 데이터를 원격 포트로 전달합니다. 반대로 원격 포트의 모든 데이터도 래핑되어 로컬 포트로 전송되고 이후 래핑 해제됩니다.
gcloud
VM 인스턴스의 포트에 암호화된 터널을 만듭니다.
gcloud compute start-iap-tunnel INSTANCE_NAME INSTANCE_PORT \ --local-host-port=localhost:LOCAL_PORT \ --zone=ZONE
INSTANCE_NAME 및 INSTANCE_PORT를 연결할 VM 인스턴스의 이름과 포트로 바꿉니다. LOCAL_PORT를 프록시를 결합하려는 localhost 포트로 바꿉니다. ZONE을 VM 인스턴스가 있는 영역으로 바꿉니다.
gcloud
는 VM 인스턴스로 연결 테스트를 수행한 후 터널을 열고 포트 번호를 표시합니다.
Listening on port [LOCAL_PORT].
localhost:LOCAL_PORT로 전송된 모든 트래픽은 VM 인스턴스로 전달됩니다. 포트는 로컬 컴퓨터에서 실행 중인 애플리케이션에서만 액세스할 수 있습니다.
IAP TCP 업로드 대역폭 증가
IAP TCP 업로드 대역폭을 늘리려면 gcloud CLI가 설치된 동일한 머신에 NumPy를 설치하는 것이 좋습니다.
Linux
Unix 플랫폼에서 pip를 사용하여 NumPy를 설치하려면 새 터미널 인스턴스에서 다음 명령어를 실행합니다.
$(gcloud info --format="value(basic.python_location)") -m pip install numpy
NumPy를 설치한 후에도 오류 메시지가 지속되면 다음 단계를 완료하세요. 다음 명령어를 실행하여 gcloud가 외부 패키지에 액세스하도록 허용합니다.
export CLOUDSDK_PYTHON_SITEPACKAGES=1
Windows
Windows 플랫폼에서 pip를 사용하여 NumPy를 설치하려면 새 PowerShell 인스턴스에서 다음 명령어를 실행합니다.
start (gcloud info --format="value(basic.python_location)") "-m pip install numpy"
NumPy를 설치한 후에도 메시지가 계속 표시된다면 다른 단계가 필요합니다. 다음 명령어를 실행해서 gcloud가 외부 패키지에 액세스하도록 허용합니다.
$env:CLOUDSDK_PYTHON_SITEPACKAGES="1"
알려진 제한사항
대역폭: IAP의 TCP 전달 기능은 대량의 데이터 전송을 위한 것이 아닙니다. IAP는 사용자의 이 서비스 남용 방지를 위해 용량을 제한할 수 있는 권리가 있습니다.
연결 길이: 1시간 동안 활동이 없으면 IAP가 세션 연결을 자동으로 끊습니다. 현재 gcloud compute start-iap-tunnel
에서는 터널 연결이 해제되면 터널을 다시 설정하려고 시도합니다.
다음 단계
- 액세스 수준을 적용하여 더욱 다양한 컨텍스트 규칙 설정하기
- Cloud 감사 로그 사용 설정의 액세스 요청을 참조하기
- IAP 자세히 알아보기