IAP (Identity-Aware Proxy)를 사용하는 안전한 서버리스 애플리케이션

1. 개요

이 실습에서는 직원이 Cymbal Eats 앱에서 주문을 보고, 업데이트하고, 삭제할 수 있는 직원 포털을 배포합니다. 가상 사설망 (VPN)을 사용하지 않고 포털 액세스를 보호하기 위해 IAP (Identity-Aware Proxy)를 사용합니다. IAP는 제로 트러스트 액세스 모델 구현을 간소화하며, 앱 액세스를 관리할 수 있는 단일 제어 지점을 제공하므로 온프레미스와 클라우드 환경 모두에서 원격 작업자가 VPN보다 시간이 덜 걸립니다.

94b06525c85408ad.png

IAP(Identity-Aware Proxy)란?

IAP (Identity-Aware Proxy)는 애플리케이션에 전송되는 요청을 가로채고, Google Identity Service를 사용하여 요청하는 사용자를 인증하고, 애플리케이션에 액세스하도록 승인된 사용자로부터 요청이 들어오는 경우에만 허용하는 Google Cloud 서비스입니다. 또한 인증된 사용자에 대한 정보를 포함하도록 요청 headers를 수정할 수 있습니다.

학습할 내용

  • 서버리스 네트워크 엔드포인트 그룹 (NEG)을 구성하는 방법
  • 부하 분산기를 구성하는 방법
  • IAP를 사용 설정하여 액세스를 제한하는 방법
  • IAP를 사용하여 액세스를 제한하는 방법

2. 설정 및 요구사항

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔이 고유한 문자열을 자동으로 생성합니다. 보통은 그게 뭔지 상관하지 않습니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 무작위로 다른 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스를 삭제하거나 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

환경 설정

  1. 프로젝트 및 리소스 관련 환경 변수 만들기
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
  1. IAP 및 Cloud Resource Manager 서비스 API 사용 설정
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. 샘플 앱 저장소를 클론하고 디렉터리로 이동합니다.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
  1. 설정 스크립트를 사용하여 직원 포털을 배포합니다. 스크립트가 완료될 때까지 기다렸다가 다음 단계로 이동하세요.
./setup.sh

출력 예

...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. 서비스 URL 링크를 클릭합니다.

86416f68c0b8152a.png

3. 서버리스 네트워크 엔드포인트 그룹 (NEG) 구성

직원 UI Cloud Run 서비스를 위한 서버리스 네트워크 엔드포인트 그룹( 서버리스 NEG)을 만듭니다. 서버리스 NEG를 사용하면 외부 HTTP(S) 부하 분산과 함께 Google Cloud 서버리스 앱을 사용할 수 있습니다.

2abe669e53c27186.png

  1. 직원 UI 서비스의 네트워크 엔드포인트 그룹을 만듭니다.
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
    --project $PROJECT_ID \
    --region=$REGION \
    --network-endpoint-type=serverless  \
    --cloud-run-service=employee-ui-service

출력 예시

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg].
Created network endpoint group [employee-ui-iap-neg].

백엔드 서비스 만들기 및 서버리스 NEG 추가

백엔드 서비스는 Cloud Load Balancing이 트래픽을 분산하는 방법을 정의합니다. 백엔드 서비스 구성에는 백엔드에 연결하는 데 사용되는 프로토콜, 다양한 배포 및 세션 설정, 상태 확인, 제한 시간 등의 다양한 값 집합이 포함됩니다. 이 설정을 통해 부하 분산기의 동작을 세밀하게 제어할 수 있습니다.

  1. 백엔드 서비스 만들기
gcloud compute backend-services create employee-ui-iap-backend \
        --global 

출력 예시

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
NAME: employee-ui-iap-backend
BACKENDS:
PROTOCOL: HTTP
  1. 서버리스 NEG를 백엔드 서비스에 백엔드로 추가
gcloud compute backend-services add-backend employee-ui-iap-backend \
    --global \
    --network-endpoint-group=employee-ui-iap-neg \
    --network-endpoint-group-region=$REGION

출력 예시

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. 수신되는 요청을 백엔드 서비스로 라우팅하는 URL 맵 만들기
gcloud compute url-maps create employee-ui-iap-url-map \
    --default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map].
NAME: employee-ui-iap-url-map
DEFAULT_SERVICE: backendServices/employee-ui-iap-backend

4. 부하 분산기 구성요소 구성

다음 다이어그램은 부하 분산기가 서버리스 NEG 백엔드를 사용하여 서버리스 Cloud Run 서비스로 요청을 전달하는 방법을 보여줍니다.

335f4674737a6514.png

고정 IP 주소 예약

  1. 고정 IPv4 주소 예약 및 도메인 저장
gcloud compute addresses create employee-ui-iap-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

출력 예시

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
  1. nip.io 도메인 저장
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io

Google 관리 SSL 인증서 리소스 만들기

  1. Google 관리 SSL 인증서 리소스 만들기
gcloud compute ssl-certificates create employee-ui-iap-cert \
    --description=employee-ui-iap-cert \
    --domains=$DOMAIN \
    --global

출력 예시

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert].
NAME: employee-ui-iap-cert
TYPE: MANAGED
CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00
EXPIRE_TIME:
MANAGED_STATUS: PROVISIONING

34.102.234.98.nip.io: PROVISIONING

대상 HTTPS 프록시 만들기

  1. 대상 HTTPS 프록시를 만들어 URL 맵에 요청을 라우팅합니다.
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
    --ssl-certificates employee-ui-iap-cert \
    --url-map employee-ui-iap-url-map

출력 예시

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy].
NAME: employee-ui-iap-http-proxy
SSL_CERTIFICATES: employee-ui-iap-cert
URL_MAP: employee-ui-iap-url-map
CERTIFICATE_MAP:

전달 규칙 구성

  1. 수신 요청을 프록시로 라우팅하는 전달 규칙 만들기
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
    --load-balancing-scheme=EXTERNAL \
    --network-tier=PREMIUM \
    --address=employee-ui-iap-ip \
    --global \
    --ports=443 \
    --target-https-proxy employee-ui-iap-http-proxy

출력 예

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].

Cloud Run 서비스로 인그레스 제한

HTTP(S) 부하 분산을 통해 들어오는 내부 요청 및 요청만 허용하도록 인그레스 트래픽을 제한합니다.

26cb0b2a9162e7ab.png

  1. HTTP(S) 부하 분산기를 통한 내부 요청 및 요청에서 인그레스 트래픽만 허용하도록 서비스 업데이트
gcloud run services update employee-ui-service \
    --ingress internal-and-cloud-load-balancing \
    --region $REGION

출력 예

OK Deploying... Done.                            
  OK Creating Revision...
  OK Routing traffic...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. 서비스 URL 링크를 클릭합니다.

8505fde7e0784bf1.png

이제 Cloud Run 서비스 URL에 대한 액세스가 금지된 것으로 표시됩니다.

5. 부하 분산기에서 Cloud IAP (Identity-Aware Proxy) 사용 설정

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

d9740402a74370a8.png

브랜드는 사용자를 위한 브랜드 정보가 포함된 OAuth 동의 화면입니다. 브랜드는 내부 또는 공개 사용자로 제한될 수 있습니다. 내부 브랜드를 사용하면 프로젝트와 동일한 Google Workspace 조직의 구성원이 OAuth 흐름에 액세스할 수 있습니다. 공개 브랜드를 사용하면 인터넷에 액세스할 수 있는 모든 사용자가 OAuth 흐름에 액세스할 수 있습니다.

  1. 브랜드 만들기
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud alpha iap oauth-brands create \
    --application_title="Cymbal Eats" \
    --support_email=$USER_EMAIL

출력 예시

Created [462858740426].
applicationTitle: Cymbal Eats
name: projects/462858740426/brands/462858740426
orgInternalOnly: true

IAP OAuth 클라이언트 만들기

  1. 이전 단계의 브랜드 이름을 사용하여 고객 만들기
gcloud alpha iap oauth-clients create \
    projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
    --display_name=cymbal-eats-employee-ui

출력 예시

Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com].
displayName: cymbal-eats-employee-ui
name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com
secret: [secret-removed]
  1. 클라이언트 이름, ID, 보안 비밀 저장
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
    projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
    --filter="displayName:cymbal-eats-employee-ui")

export CLIENT_ID=${CLIENT_NAME##*/}

export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
  1. Cloud 콘솔의 드롭다운 프로젝트 선택 메뉴에서 프로젝트를 선택합니다.
  2. Cloud 콘솔에서 OAuth 동의 화면으로 이동합니다.

bcb460f3ab5241f4.png

  1. 사용자 유형에서 '외부로 만들기'를 클릭합니다.
  2. 게시 상태로 '테스트' 선택

27fd7de6e7b7ef21.png

  1. '확인'을 클릭합니다.

6. IAP로 액세스 제한

IAP를 사용하여 백엔드 서비스에 대한 액세스를 제한한 다음 애플리케이션에 액세스할 수 없는지 확인합니다.

  1. 백엔드 서비스에서 IAP 사용 설정
gcloud iap web enable --resource-type=backend-services \
    --oauth2-client-id=$CLIENT_ID \
    --oauth2-client-secret=$CLIENT_SECRET \
    --service=employee-ui-iap-backend

IAP 구성 확인

  1. SSL 인증서가 활성 상태인지 확인
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. 서비스 URL 가져오기
echo https://$DOMAIN

출력 예

https://34.102.234.98.nip.io
  1. 서비스 URL을 클릭하여 직원 포털을 엽니다.

352b600209c3fb33.png

  1. 실습 사용자 인증 정보를 사용해 로그인합니다.

f7e0318388aa0739.png

  1. 브라우저 닫기

직원 포털에 대한 사용자 액세스 권한 부여

  1. 이전 단계에서 만든 사용자를 위해 'roles/iap.httpsResourceAccessor' 역할에 IAM 정책 바인딩을 추가합니다.
gcloud iap web add-iam-policy-binding \
    --resource-type=backend-services \
    --service=employee-ui-iap-backend \
    --member=user:$USER_EMAIL \
    --role='roles/iap.httpsResourceAccessor'

출력 예

Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].

서비스 액세스 테스트

직원 포털에 대한 액세스 권한이 부여되었는지 확인

  1. 서비스 URL 가져오기
echo https://$DOMAIN

출력 예

https://34.102.234.98.nip.io
  1. 서비스 URL을 클릭하여 직원 포털을 엽니다.

86416f68c0b8152a.png

이제 직원 포털에 액세스할 수 있습니다.

(선택사항) 모든 종속 항목을 배포합니다. 마이크로서비스를 배포하는 데 최대 20분이 걸릴 수 있습니다.

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

./setup.sh
./get-site-urls.sh

7. 축하합니다.

축하합니다. Codelab을 완료했습니다.

다음 단계:

다른 Cymbal Eats Codelab 살펴보기:

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.