GKE용 Cloud IAP 사용 설정

이 페이지에서는 Cloud IAP(Identity-Aware Proxy)로 Google Kubernetes Engine 인스턴스를 보호하는 방법을 설명합니다. Cloud IAP를 사용 설정하기 위해 다음 작업을 완료합니다.

  • 앱의 OAuth 동의 화면 구성
  • Cloud IAP 액세스 설정
  • OAuth 사용자 인증 정보 만들기
  • BackendConfig 구성

개요

Cloud IAP는 GKE용 Ingress를 통해 통합됩니다. 이렇게 해서 VPN을 사용하는 대신 직원의 애플리케이션 수준 액세스를 제어할 수 있습니다.

GKE 클러스터에서 들어오는 트래픽은 Cloud Load Balancing의 구성요소인 HTTP(S) 부하 분산에 의해 처리됩니다. HTTP(S) 부하 분산기는 일반적으로 Kubernetes Ingress 컨트롤러로 구성됩니다. Ingress 컨트롤러는 하나 이상의 서비스 객체와 연결된 Kubernetes Ingress 객체에서 구성 정보를 가져옵니다. 각 서비스 객체는 들어오는 요청을 특정 포드 및 포트로 보내기 위해 사용되는 라우팅 정보를 포함합니다.

Kubernetes 버전 1.10.5-gke.3부터는 서비스를 BackendConfig 객체와 연결하여 부하 분산기에 대한 구성을 추가할 수 있습니다. BackendConfig는 kubernetes/ingress-gce 저장소에 정의된 CRD(커스텀 리소스 정의)입니다.

Kubernetes Ingress 컨트롤러는 BackendConfig에서 구성 정보를 읽고 그에 따라 부하 분산기를 설정합니다. BackendConfig는 Cloud Load Balancing과 관련된 구성 정보를 갖고 있으며, 이를 통해 개발자가 각 HTTP(S) 부하 분산 백엔드 서비스에 대해 별도의 구성을 정의할 수 있습니다.

시작하기 전에

GKE에 대해 Cloud IAP를 사용 설정하려면 다음이 필요합니다.

  • 청구가 사용 설정된 Google Cloud Platform Console 프로젝트
  • HTTPS 부하 분산기로 제공된 하나 이상의 GKE 인스턴스 그룹. 부하 분산기는 GKE 클러스터에서 Ingress 객체를 만들 때 자동으로 생성됩니다.
  • 부하 분산기 주소에 등록된 도메인 이름
  • 모든 요청에 ID가 포함되었는지 확인하기 위한 애플리케이션 코드

Cloud IAP 사용 설정

OAuth 동의 화면 구성

프로젝트의 OAuth 동의 화면을 구성하지 않았으면, 이를 수행해야 합니다. OAuth 동의 화면에는 이메일 주소와 제품 이름이 필요합니다.
  1. OAuth 동의 화면으로 이동합니다.
    동의 화면 구성
  2. 이메일 주소 아래에서 공개 연락처로 표시하려는 이메일 주소를 선택합니다. 이 주소는 개발자의 이메일 주소 또는 개발자가 소유하는 Google 그룹이어야 합니다.
  3. 표시하려는 제품 이름을 입력합니다.
  4. 원하는 선택적인 세부정보를 추가합니다.
  5. 저장을 클릭합니다.

제품 이름 또는 이메일 주소와 같은 OAuth 동의 화면의 정보를 나중에 변경하려면, 위 단계를 반복하여 동의 화면을 구성합니다.

Cloud IAP 액세스 설정

  1. Identity-Aware Proxy 페이지로 이동합니다.
    Identity-Aware Proxy 페이지로 이동
  2. Cloud IAP로 보호하려는 프로젝트를 선택합니다.
  3. 구성원을 추가하려는 리소스 옆에 있는 체크박스를 선택합니다.
  4. 오른쪽 패널에서 구성원 추가를 클릭합니다.
  5. 표시된 구성원 추가 대화상자에서 프로젝트에 대해 IAP 보안 웹 앱 사용자 역할을 포함해야 하는 그룹 또는 개별 사용자의 이메일 주소를 입력합니다.

    다음 계정 종류가 구성원이 될 수 있습니다.

    • Google 계정: user@gmail.com
    • Google 그룹스: admins@googlegroups.com
    • 서비스 계정: server@example.gserviceaccount.com
    • G Suite 도메인: example.com

    액세스 권한이 있는 Google 계정을 추가해야 합니다.

  6. 역할 드롭다운 목록에서 Cloud IAP > IAP 보안 웹 앱 사용자를 선택합니다.
  7. 저장을 클릭합니다.

OAuth 사용자 인증 정보 만들기

  1. 사용자 인증 정보 페이지로 이동합니다.
    사용자 인증 정보 페이지로 이동
  2. 사용자 인증 정보 만들기 드롭다운 목록에서 OAuth 클라이언트 ID를 선택합니다.
  3. 애플리케이션 유형 아래에서 웹 애플리케이션을 선택합니다.
  4. 이름승인된 리디렉션 URLyour_domain/_gcp_gatekeeper/authenticate 형식으로 추가합니다. 여기서 your_domain은 Cloud IAP가 사용 설정된 백엔드 서비스에 액세스하려는 도메인입니다.
  5. 승인된 리디렉션 URL 추가를 마쳤으면 만들기를 클릭한 후, 표시된 OAuth 클라이언트 창에서 확인을 클릭합니다.
  6. OAuth 2.0 클라이언트 ID 아래의 개발자가 만든 사용자 인증 정보 옆에 있는 오른쪽 JSON 다운로드를 클릭합니다. 이러한 사용자 인증 정보는 이후 단계에서 사용됩니다.

승인된 도메인 추가

이후에 더 많은 도메인에서 앱에 액세스하려면 아래 절차를 따르세요.

  1. Identity-Aware Proxy 페이지로 이동합니다.
    Identity-Aware Proxy 페이지로 이동
  2. 도메인을 추가하려는 리소스 옆에 있는 더보기를 클릭한 후 OAuth 클라이언트 수정을 클릭합니다.
  3. 표시된 사용자 인증 정보 창의 승인된 리디렉션 URI 아래에서 도메인을 your_domain/_gcp_gatekeeper/authenticate 형식으로 추가합니다.
  4. 도메인 추가를 완료했으면 저장을 클릭합니다. 이제 Cloud IAP가 사용 설정된 도메인에서 앱에 액세스할 수 있습니다.

BackendConfig 구성

Cloud IAP용으로 BackendConfig를 구성하려면 Kubernetes 보안 비밀을 만든 후 iap 블록을 BackendConfig에 추가합니다.

Kubernetes 보안 비밀 만들기

BackendConfig는 Kubernetes 보안 비밀을 사용하여 이전에 개발자가 만든 OAuth 클라이언트를 래핑합니다. Kubernetes 보안 비밀은 다른 Kubernetes 객체와 같이, kubectl CLI(명령줄 인터페이스)를 사용하여 관리됩니다. 보안 비밀을 만들려면 다음 명령어를 실행합니다. 여기서 client_id_keyclient_secret_key는 위에서 OAuth 사용자 인증 정보를 만들 때 다운로드한 JSON 파일의 키입니다.

kubectl create secret generic my-secret --from-literal=client_id=client_id_key \
    --from-literal=client_secret=client_secret_key

위 명령어는 보안 비밀이 성공적으로 생성되었는지 확인하기 위한 출력을 표시합니다.

secret "my-secret" created

BackendConfig에 iap 블록 추가

Cloud IAP용으로 BackendConfig를 구성하려면 enabledsecretName 값을 지정합니다. BackendConfig에서 Cloud IAP와 Cloud CDN(콘텐츠 전송 네트워크)을 모두 사용 설정할 수는 없습니다. BackendConfig에 Cloud IAP 블록이 없는 경우, 백엔드 서비스의 기존 Cloud IAP 설정이 상속됩니다. Cloud IAP를 사용 설정하려면 iap 블록을 BackendConfig에 추가합니다. 여기서 my_secret는 위에서 만든 Kubernetes 보안 비밀입니다.

apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: config-default
  namespace: my-namespace
spec:
  iap:
    enabled: true
    oauthclientCredentials:
      secretName: my_secret

또한 Cloud IAP 사용 설정을 트리거하려면 서비스 포트를 BackendConfig와 연결해야 합니다. 이를 위한 한 가지 방법은 서비스의 모든 포트를 BackendConfig에 대해 기본값으로 지정하는 것입니다. 이를 위해서는 서비스 리소스에 다음 주석을 추가하면 됩니다.

metadata:
  annotations:
    beta.cloud.google.com/backend-config: '{"default": "config-default"}'

구성을 테스트하기 위해 kubectl get event를 실행합니다. 메시지에 no BackendConfig for service port exists가 표시되면, 서비스 포트를 위한 BackendConfig가 서비스 주석에 지정되었지만 BackendConfig 리소스를 찾을 수 없음을 나타냅니다. 이 문제는 개발자가 BackendConfig 리소스를 만들지 않았거나, 잘못된 네임스페이스로 만들었거나, 서비스 주석에서 참조 철자를 잘못 쓴 경우에 발생할 수 있습니다.

참조한 secretName이 존재하지 않거나 올바르게 구성되지 않은 경우 다음 오류 메시지 중 하나가 표시됩니다.

  • BackendConfig default/config-default is not valid: error retrieving secret "foo": secrets "foo" not found. 이 오류를 해결하려면 위에 설명된 대로 Kubernetes 보안 비밀이 올바르게 생성되었는지 확인합니다.
  • BackendConfig default/config-default is not valid: secret "foo" missing client_secret data. 이 오류를 해결하려면 OAuth 사용자 인증 정보 만들기가 올바르게 수행되었고 위에서 다운로드한 JSON의 올바른 client_idclient_secret 키를 참조했는지 확인합니다.

enabled 플래그가 true로 설정되었고 secretName이 올바르게 설정되었으면, 선택한 리소스에 대해 Cloud IAP가 구성됩니다.

Cloud IAP 사용 중지

Cloud IAP를 사용 중지하려면 BackendConfig에서 enabledfalse로 설정해야 합니다. BackendConfig에서 Cloud IAP 블록을 삭제해도 설정은 유지됩니다. 예를 들어 Cloud IAP가 secretName: my_secret로 사용 설정된 상태에서 개발자가 이 블록을 삭제하면, my_secret에 저장된 OAuth 사용자 인증 정보를 사용해서 Cloud IAP가 계속 사용 설정됩니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Identity-Aware Proxy 문서