[GKE] 서비스 계정으로 Google Cloud 인증

Jade·2021년 2월 17일
0

학습 내용

  • 서비스 계정 생성 방법
  • Pub/Sub에서 서비스 계정에 필요한 역할을 할당하는 방법
    • Pub/Sub 외에도 모든 Google Cloud 서비스에 적용 가능
  • 계정의 키를 Kubernetes Secrets에 저장하는 방법
  • 서비스 계정을 사용하여 애플리케이션 구성 및 배포 방법
    • 예시 애플리케이션은 Pub/Sub Topic을 구독하고 표준 출력으로 게시된 메시지를 보여준다.

서비스 계정으로 인증

GCP에서는 다음과 같은 방법으로 Google Cloud 서비스에 인증할 수 있다.

  1. Workload Identity
  2. 기본 Compute Engine 서비스 계정
  3. Kubernetes Secrets

Workload Identity

Workload Identity란, GKE에서 Google Cloud 서비스에 인증하는 데 권장되는 방식이다. 이 인증 방법이 사용 사례에 적합한 경우 가장 먼저 이 옵션을 선택해야 하나, 이 예시는 적합하지 않은 사용 사례를 다룬다.

기본 Compute Engine 서비스 계정

GKE 클러스터의 각 노드는 Compute Engine 인스턴스이기 때문에 클러스터에서 실행되는 애플리케이션은 기본적으로 Compute Engine 기본 서비스 계정을 사용하여 인증을 시도하며, 연결된 범위가 상속된다.

기본 서비스 계정의 경우 구글 클라우드 서비스를 사용하기 위해 필요한 권한이 없을 수도 있다. 원한다면 권한을 확장할 순 있지만, 이는 보안상 추천되는 방법이 아니다.

Kubernetes Secrets

애플리케이션의 서비스 계정을 만들고 인증 키를 Secrets에 넣을 수 있다. 이 가이드에서 중점을 두는 옵션이다.

서비스 계정을 사용할 때의 이점

  • 애플리케이션이 수행하는 API 요청을 더 효과적으로 식별하고 감사할 수 있다.
  • 서비스 계정을 공유하고 모든 애플리케이션의 API 액세스를 동시에 취소할 필요 없이 특정 애플리케이션의 키를 취소할 수 있다.
  • 서비스 계정의 사용자 인증 정보가 손상되는 보안 이슈가 발생할 경우 노출 범위를 줄일 수 있다.

사전 설정

  • Kubernetes Engine API를 사용 설정
  • 명령줄 도구(gcloud, kubectl) 설치
  • GitHub에서 샘플 코드 클론
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/cloud-pubsub/deployment

gcloud 명령줄 도구의 기본값 설정

gcloud 명령줄 도구에 프로젝트 ID와 Compute Engine 영역 옵션 입력 시간을 절약하기 위해 기본값 설정

gcloud config set project [project-id]
gcloud config set compute/zone [compute-zone]

API 사용 설정

Pub/Sub API 및 Resource Manager API 사용 설정

gcloud services enable cloudresourcemanager.googleapis.com pubsub.googleapis.com

컨테이너 클러스터 만들기

pubsub-test라는 이름을 가진 컨테이너 클러스터를 만들어 Pub/Sub 구독자 애플리케이션 배포

gcloud container clusters create pubsub-test

Pub/Sub Topic 생성

샘플 애플리케이션은 echo라는 Pub/Sub Topic에서 echo-read 라는 subscription을 사용한다.

Topic 생성

gcloud pubsub topics create echo

Subscription 생성

gcloud pubsub subscriptions create echo-read --topic=echo

Pub/Sub 구독자 애플리케이션 배포

다음 명령어를 입력하여 애플리케이션 컨테이너 파일 배포

kubectl apply -f pubsub.yaml

cloud-pubsub/deployment/pubsub.yaml 파일의 내용은 다음과 같다.

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1

app: pubsub 레이블이 붙은 pubsub이라는 이름의 Deployment가 생성된다.

다음 명령어를 입력하여 app: pubsub 레이블이 설정된 pod를 확인한다.

kubectl get pods -l app=pubsub


컨테이너가 시작되지 않고 CrashLoopBackOff 상태에 있는 것이 보인다.
이는 컨테이너가 다시 시작 후 반복적으로 비정상 종료됨을 나타낸다.

컨테이너는 다양한 원인으로 인해 비정상 종료 될 수 있는데, Pod의 로그를 확인하면 근본 원인을 해결할 수 있다.

다음 명령어를 실행하여 로그를 조사한다.

kubectl logs -l app=pubsub


애플리케이션에 Pub/Sub 서비스 쿼리 권한이 없다는 오류 메시지가 표시 된다.

서비스 계정 사용자 인증 정보 생성

GKE에서 실행되는 애플리케이션에 Google Cloud 서비스 액세스 권한을 부여하려면 서비스 계정을 사용해야 한다. 서비스 계정 사용시 애플리케이션과 연결된 IAM 권한 집합을 정의할 수 있다.

서비스 계정 생성

gcloud iam service-accounts create [SERVICE_ACCOUNT_ID] \
    --display-name="[DISPLAY_NAME]"
  • SERVICE_ACCOUNT_ID: 서비스 계정의 ID
  • DISPLAY_NAME: Cloud Console에 표시할 서비스 계정 이름

서비스 계정에 프로젝트 IAM 역할 부여

gcloud projects add-iam-policy-binding [PROJECT_ID] \
    --member="serviceAccount:[SERVICE_ACCOUNT_ID]@[PROJECT_ID].iam.gserviceaccount.com" \
    --role="[ROLE_NAME]"
  • PROJECT_ID: 프로젝트 ID
  • SERVICE_ACCOUNT_ID: 이전 단계에서 생성된 서비스 계정 ID
  • ROLE_NAME: 필요한 역할 이름(roles/pubsub.subscriber)

서비스 계정 키 만들기

다른 플랫폼이나 온프레미스와 같이 Google Cloud 외부에서 서비스 계정을 안전하게 사용하려면 공개, 비공개 키 쌍을 통한 서비스 계정 ID 설정이 필요하다. (서비스 계정은 최대 10개의 키를 가질 수 있다.)

gcloud iam service-accounts keys create ~/key.json \
  --iam-account [sa-name]@[project-id].iam.gserviceaccount.com
  • sa-name: 서비스 계정명
  • project-id: 프로젝트명

이제 서비스 계정 키 파일이 현재 위치에 다운로드된다.
키 파일는 다시 다운로드할 수 없으며, 서비스 계정으로 인증하는 데 사용될 수 있으므로 안전하게 저장해야 한다.


현재 위치에 key.json 파일이 있다는 것을 알 수 있다.

Secrets로 사용자 인증 정보 가져오기

이제 서비스 계정 키를 갖고 있으므로 이를 컨테이너에 로드 할 방법이 필요하다.

우선 이전에 생성된 key.json 파일 이름을 pubsub-key라는 Secrets로 바꾸기 위해 다음 명령어를 실행한다.

kubectl create secret generic pubsub-key --from-file=key.json=[PATH-TO-KEY-FILE].json

Secrets 생성 후에는 현재 위치에서 이전 키 파일을 삭제한다.

rm -rf key.json

Secrets를 사용하여 애플리케이션 구성

애플리케이션에서 pubsub-key Secrets를 사용하려면 배포 사양을 다음과 같이 수정한다.

  1. Secrets을 사용하여 볼륨 정의
  2. 애플리케이션 컨테이너에 Secrets 볼륨 마운트
  3. Secrets 볼륨 마운트에 있는 키 파일을 가리키도록 GOOGLE_APPLICATION_CREDENTIALS 환경 변수 설정

다음 명령어를 입력하여 pubsub-with-secret.yaml 매니페스트 배포

kubectl apply -f ~/kubernetes-engine-samples/cloud-pubsub/deployment/pubsub-with-secret.yaml

cloud-pubsub/deployment/pubsub-with-secret.yaml 파일의 내용은 다음과 같다.

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pubsub
spec:
  selector:
    matchLabels:
      app: pubsub
  template:
    metadata:
      labels:
        app: pubsub
    spec:
      volumes:
      - name: google-cloud-key
        secret:
          secretName: pubsub-key
      containers:
      - name: subscriber
        image: gcr.io/google-samples/pubsub-sample:v1
        volumeMounts:
        - name: google-cloud-key
          mountPath: /var/secrets/google
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/secrets/google/key.json
  • pubsub-key라는 Secret을 사용하는 google-cloud-key라는 볼륨 정의
  • 컨테이너 내부의 /var/secrets/google 위치에서 google-cloud-key를 사용할 수 있게 해주는 볼륨 마운트 정의
  • /var/secrets/google/key.json으로 설정된 GOOGLE_APPLICATION_CREDENTIALS 환경 변수 정의. Secret이 컨테이너에 마운트 된 후 사용자 인증 정보를 포함한다.

다음 명령어를 입력하여 pod 상태가 Running인지 확인한다.

kubectl get pods -l app=pubsub

Pub/Sub 메시지 수신 테스트

애플리케이션이 구성이 끝났으므로 echo라는 다음 명령어를 입력하여 Pub/Sub Topic에 메시지를 게시한다.

gcloud pubsub topics publish echo --message="Hello, world!"


입력 결과, 애플리케이션에서 메시지가 선택되고 출력 스트림으로 출력 되는 것을 알 수 있다.

배포된 Pod의 로그를 조사하려면 다음 명령어를 입력한다.

kubectl logs -l app=pubsub


서비스 계정 사용자 인증 정보를 사용하여 Pub/Sub API에 인증을 수행하도록 GKE에서 애플리케이션을 성공적으로 구성하였다.

리소스 삭제

이 가이드에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 개별 리소스를 삭제해야 한다.

Pub/Sub subscription, topic 삭제

gcloud pubsub subscriptions delete echo-read
gcloud pubsub topics delete echo

컨테이너 클러스터 삭제

gcloud container clusters delete pubsub-test

🔗 References

profile
우당탕탕 좌충우돌 인프라 여행기

0개의 댓글