GCP - Cloud IAP 통한 접속

Cloud IAP

https://cloud.google.com/iap

  • 클라우드 기반 및 온프레미스 애플리케이션과 Google Cloud에서 실행되는 VM에 대한 액세스 제어

  • 사용자 ID를 확인하고 컨텍스트를 사용하여 사용자 액세스 권한 부여 여부를 판단

  • VPN을 사용하지 않고도 신뢰할 수 없는 네트워크에서 업무 처리

  • 제로 트러스트 액세스 모델 구현

 

https://cloud.google.com/iap/docs/concepts-overview

IAP를 사용하면 HTTPS로 액세스한 애플리케이션에 대한 중앙 승인 레이어를 설정할 수 있으므로 네트워크 수준 방화벽을 사용하지 않고 애플리케이션 수준 액세스 제어 모델을 사용할 수 있습니다.

 

 

Cloud IAP 에 대해서 별도의 설정을 하지 않아도 방화벽 설정을 하면 gcloud compute ssh 명령은 작동을 함.

그런데 Cloud IAP에서 각 VM 이나 로드밸런스 등 개별 리소스에 대한 세분화된 접근 제한을 하려고 하면 Cloud IAP 설정이 필요함.

https://medium.com/@jwlee98/gcp-dns-%EB%B6%80%ED%84%B0-%ED%95%98%EB%82%98%EC%94%A9-%ED%95%B4%EB%B3%B4%EB%8A%94-google-cloud-%EB%A1%9C-%EC%84%9C%EB%B9%84%EC%8A%A4-%ED%95%B4%EB%B3%B4%EA%B8%B0-5%ED%83%84-iap-for-tcp-forwarding-%EA%B3%BC-label-7bc5b88d32c5

Cloud IAP 설정

Cloud IAP(Identity-Aware Proxy) API 활성화. IAP 설정을 하려면 API 활성화 필요. (이 API를 활성화 하지 않아도 gcloud compute ssh 에서 IAP 터널링으로 접속은 됨)

gcloud services enable iap.googleapis.com

Cloud IAP(Identity-Aware Proxy) 설정

OAuth 동의화면 설정, OAuth credentials 추가. IAP Access 설정

https://cloud.google.com/iap/docs/enabling-compute-howto

 

필요한 리소스 선택해서 IAP 활성화함. 보안 -IAP(Identity-Aware Proxy) 선택 - SSH 및 TCP 리소스 - 주구성원 추가에서 필요한 사람이나 그룹을 선택하고 IAP-secured Tunnel User  역할을 부여하면 됨.

https://console.cloud.google.com/security/iap?orgonly=true&project=sample-gw-dev-00000&supportedpurview=organizationId

 

IAP 대역(35.235.240.0/20)에서 tcp 모든 포트를 열어주도록 설정. 이경우에는 tcp 모든 포트를 열어주는 것이고 사용하는 서비스에 따라 필요한 포트를 제한할 수 있음.

https://cloud.google.com/iap/docs/using-tcp-forwarding

gcloud compute firewall-rules create allow-ingress-from-iap \ --project sample-gw-shared-vpc \ --network sample-gw-shared-vpc-1 \ --direction=INGRESS \ --action=allow \ --rules=tcp \ --source-ranges=35.235.240.0/20

 

IAP TCP 전달을 사용할 권한 부여

프로젝트에 소유자 액세스 권한이 있는 사용자는 항상 TCP 전달에 IAP를 사용할 수 있는 권한이 있습니다.

roles/editor(편집자) 권한에는 IAP에 대한 권한이 일부 포함되어 있으나 Access에 대한 권한은 포함되어 있지 않습니다. IAP Access에 대한 권한은 직접 별도의 역할을 부여하거나 소유자 역할을 부여해야합니다.

 

ssh 연결 터널링 : 아래와 같이 실행을 하면 자동으로 ssh key 를 생성하고 ssh로 접속을 함. External IP 가 없으면 기본으로 IAP tunneling 을 사용한다는 메시지가 나옴.

gcloud compute ssh gw-was-dev-1 WARNING: The private SSH key file for gcloud does not exist. WARNING: The public SSH key file for gcloud does not exist. WARNING: You do not have an SSH key for gcloud. WARNING: SSH keygen will be executed to generate a key. Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/taejoon/.ssh/google_compute_engine. Your public key has been saved in /home/taejoon/.ssh/google_compute_engine.pub. The key fingerprint is: SHA256:AWIXNnLU/81lMjxxxxxxxxxxxxxxxxfsAigPiA1wTEVOw taejoon@taejoon-PC The key's randomart image is: +---[RSA 2048]----+ | +++=.Oo . | | ..o* o. . o | |o. + .. . o | |= o E .. o * o| | + . .S . B O | | . . . + . . = o| | . o o o . ..| | . o o o. | | . o.. .o| +----[SHA256]-----+ External IP address was not found; defaulting to using IAP tunneling. Updating project ssh metadata...⠼Updated [https://www.googleapis.com/compute/v1/projects/sample-gw-dev-00000]. Updating project ssh metadata...done. Waiting for SSH key to propagate. Warning: Permanently added 'compute.5029954779023919884' (ECDSA) to the list of known hosts. Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.11.0-1018-gcp x86_64)

인스턴스에 외부 IP 주소가 없는 경우 연결은 자동으로 IAP TCP 터널링을 사용합니다. 인스턴스에 외부 IP 주소가 있는 경우 연결은 IAP TCP 터널링 대신 외부 IP 주소를 사용합니다.

gcloud compute ssh가 항상 IAP TCP 터널링을 사용하도록 --tunnel-through-iap 플래그를 사용할 수 있습니다.

IAP 사용시 해당 VM에 외부 IP가 존재하면 TCP 터널링 대신 외부 IP 주소를 사용합니다. 그 말은 외부 IP를 사용하므로 방화벽을 설정해주어야만 해당 VM에 접속이 가능해진다는 뜻입니다. 이럴 경우 이 서버에 접속을 하고자 하는 모든 사람들에게 방화벽을 허용해주어야하는 불편함이 있기 때문에 --tunnel-through-iap 플래그를 사용해 강제로 TCP 터널링을 사용하게 하면 외부 IP가 존재하더라도 위치에 상관없이 접속가능합니다.

 

gcloud compute ssh가 IAP TCP 터널링을 사용하지 않고 VM의 내부 IP에 직접 연결하도록 --internal-ip 플래그를 사용합니다. 이렇게 하면 대상 VM과 동일한 VPC 네트워크에 연결된 클라이언트에 유용합니다.

IAP 터널링을 통한 SCP 파일업로드 시 기존 외부 IP 접속을 통한 SCP 파일업로드 대비 성능이 하락하는 것을 확인할 수 있습니다. 이는 IAP TCP 터널링이 대용량 파일업로드를 위해 만들어진 것이 아니기 때문에 GCP 측에서 성능을 제한한 것이므로 Cloud Storage를 사용해 파일을 업로드하는 것을 권장합니다.

Cloud Storage 파일업로드

  • 버킷에 원하는 파일을 업로드

  • 업로드할 VM에 접속 후 버킷에서 파일 다운로드

Cloud IAP 감사로그 설정

https://cloud.google.com/iap/docs/audit-log-howto

 IAP(Identity-Aware Proxy) 보안 리소스에 대해 클라우드 감사 로그를 사용 설정하는 방법을 설명합니다. Cloud 감사 로그를 사용 설정하면 요청을 보고 사용자가 충족하거나 충족하지 못한 모든 액세스 수준을 볼 수 있습니다.

  1. 다음 gcloud 명령줄 명령어를 실행하여 프로젝트에 대한 ID 및 액세스 관리(IAM) 정책 설정을 다운로드합니다.

  2. 다음과 같이 auditConfigs 섹션을 추가하여 다운로드한 policy.yaml 파일을 수정합니다. etag 값은 변경하지 마세요.

  3. 다음 gcloud 명령줄 명령어를 실행하여 수정된 .yaml 파일로 IAM 정책 설정을 업데이트합니다.

프로젝트 리소스에 액세스하기 위한 모든 요청은 감사 로그를 생성합니다.

 

로그보기

로그탐색기에서 관련된 로그 볼 수 있음. 관련 내용은 위의 https://cloud.google.com/iap/docs/audit-log-howto 문서 참고.

 

Cloud IAP 감사 로그 쿼리 예제

쿼리를 아래와 같이 지정하면 됨.

resource.type="gce_instance"

logName="projects/sample-gw-dev-00000/logs/cloudaudit.googleapis.com%2Fdata_access"

Cloud IAP - Cloud SQL Proxy 통해서 MS-SQL 접속하기

https://medium.com/google-cloud-apac/gcp-cloud-iap-%EB%A5%BC-%ED%86%B5%ED%95%98%EC%97%AC-public-ip-%EC%98%A4%ED%94%88-%EC%97%86%EC%9D%B4-mysql-on-gce-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0-2be50e280eae

위 문서는 Mysql을 VM에 설치한 경우의 내용임. Cloud IAP를 통해서 Cloud SQL - MS-SQL에 접속하는 내용은 아님. 이 부분은 지원이 안되는 것으로 보임.

 

Cloud SQL을 비공개 IP로 지정한 경우 연결에 제약사항이 생김

약간 헷갈리는데 아래 문서를 보면

https://cloud.google.com/sql/docs/sqlserver/configure-private-ip?hl=ko#vpn

내부 소스에서 연결은 같은 VPC 네트워크를 말하며 “Compute Engine 리소스에서 실행되는 Cloud SQL 인증 프록시와 같이 Cloud SQL 인스턴스와 동일한 Google Cloud 프로젝트의 소스에서 연결하려면 리소스가 Cloud SQL 인스턴스와 동일한 VPC 네트워크에 있어야 합니다.”

외부 소스에서 연결이라고 한 항목은 같은 VPC가 아닌 경우를 말함. 외부 네트워크가 Cloud SQL 인스턴스가 연결된 VPC 네트워크에 연결되어 있으면(VPN이나 Interconnect로 연결된 경우) Cloud SQL에 연결을 할 수 있다는 말임.

 

IDC와 Interconnect 등으로 연결되어 있으면 Cloud SQL 연결이 가능할 것임.

 

아래는 Cloud SQL이 비공개 IP로 구성되어 있는 경우 외부의 PC에서 IAP로 Cloud SQL Proxy 를 거쳐서 Cloud SQL 에 접속하는 경우임.

Cloud SQL Proxy 를 띄울 때 0.0.0.0:1433 으로 변경을 해주어야 나중에 다른 PC에서 터널링으로 접근을 할 수 있음.

테스팅은 했지만 실제 이런 경우가 필요할지는 아직 모르겠음. 이러한 경우 Cloud SQL Proxy에 접근가능한 IP를 제어해 주어야 할 것임.

 

Cloud SQL은 비공개 IP로만 구성을 함.

Public IP on DBA 랩탑 ---> IAP --> Private IP on GCE(SQL Proxy, 베스천. Cloud SQL 과 같은 VPC ) ---> Private IP on Cloud SQL

 

로컬 PC (퍼블릭망) → GCP 상의 Cloud SQL Proxy 1433 port (Cloud SQL과 동일한 VPC) → Cloud SQL 1433 port

로컬 PC는 IAP 터널링으로 GCP 상의 Cloud SQL Proxy 에 접근(IAM key이용 또는 gcloud auth login 등 인증해서) → Cloud SQL Proxy 통해서 Cloud SQL 접근 확인. 이런 방식으로 하면 공개 IP연결을 할 필요없이 외부에서도 Cloud SQL에 접근 가능함.

 

1433 MS-SQL port로 IAP 연결 테스팅하기

임시로 1433 port 열어주기

GCP 상의 Cloud SQL Proxy 에서 0.0.0.0:1433 으로 변경을 해주어야 나중에 다른 PC에서 터널링으로 접근을 할 수 있음.

로컬 PC : 사전에 Cloud SDK 사용할 수 있는 설정은 되어 있어야 함. 아래 예에서는 Cloud SQL Proxy를 gw-was-dev-1 에 설치한 경우임.

PC 터미널을 두개 연다. 한쪽에서는 터널링을 만들어줌.

다른 터미널에서는 sqlcmd 이용하여 터널링을 통해서 Cloud SQL에 접근.

Linux, Mac에서 IAP를 사용해 Windows Server RDP 접속

Mac의 경우 App Store에서 Microsoft Remote Desktop(RDP client)을 설치해서 WIndows VM에 접속할 수 있다.

Linux의 경우 Ubuntu 등에 기본 들어 있는 remmina 같은 RDP 를 지원하는 프로그램을 이용하면 된다. 서버 정보에는 gcloud compute start-ipa-tunnel 에서 설정한 localhost:<LOCAL_PORT> 를 지정하면 된다.

https://remmina.org/

 

gcloud compute start-ipa-tunnel을 사용해 암호화된 포트 생성

LOCAL_PORT의 경우 사용하고 있지 않은 port번호를 입력하거나 0을 입력하면 자동으로 미사용중인 포트를 선택하게 된다. 위 명령어를 입력하게 되면 아래와 터널을 열었다는 표시가 출력된다.

그럼 이제 위에서 설치한 Remote Desktop 프로그램을 사용해 localhost:<LOCAL_PORT>에 연결한다.

계정과 비밀번호를 입력하고 출력되는데 계정정보는 아래 과정을 통해 확인할 수 있다. (또는 콘솔에서도 확인 가능하다.)

여기에서 출력된 계정정보를 통해 연결하면 된다.