본문 바로가기

Security/vault

[vault] vault에 gcp service account 추가 및 스프레드 시트 수정하기

vault에서 gcp secret engine 사용해보기!

오늘 포스팅의 목적은 vault에 gcp service account를 연결하여  미리 생성해둔 service account key를 이용하는 것이 아니라  short-terml lived를 가진 key를 vault에서 생성하는것이다. 그리고 그렇게 생성된 키를 가지고 spread sheet API를 이용할 것이다.

 

vault에서 gcp secret engine을 사용하기 위해서는 다음과 같은 세가지 방법이 있다.

1️⃣ Rolesets : vault에서 service account를 생성

2️⃣ Static accounts : vault외부 즉, gcp에서 생성한 service account를 연결. token 또는 key를 생성할 수 있다. (키는 10개까지밖에 생성되지 않는다. 하지만 기간이 만료되면 자동으로 삭제된다.)

3️⃣ Impersonated accounts : 또다른 service account에 대해 OAuth2 access token을 생성. static accounts와 다르게 10개의 키만 생성할 수 있다는 제한이 없고 짧은 수명을 가진다.(기본적으로 1시간. 12시간까지 늘릴 수 있음)

위 세가지 방법 중에 나는 static accounts 로 access key를 생성하는 방법을 선택하였다.

 

1. gcp에서 service account 생성 &  google sheet API enable

작업을 하기전에 우선 gcp console에서 프로젝트를 생성해준다.

spread sheet를 수정할 수 있고 vault에 등록될 service account 를 생성해준다.

IAM 및 관리자 > 서비스 계정 > + 서비스 계정 만들기 (권한은 적절히 부여 나는 편집자 권한을 추가해주었다.)

test-sa 라는 이름의 서비스 계정을 생성하였다.

그리고 spread sheet API를 이용할 것이기 때문에 google sheet API를 enable 시켜준다.

 

2. vault에서 gcp secret enable

❯ vault secrets enable gcp
Success! Enabled the gcp secrets engine at: gcp/
 
❯ vault write gcp/config credentials=@$HOME/.config/gcloud/application_default_credentials.json ttl=3600
Success! Data written to: gcp/config

gcloud를 cli로 한번 로그인하면 ~/.config/gcloud/application_default_credentials.json 위치에 기본적으로 credentials 파일이 생성된다. 그 파일을 이용하거나 또는 만약 google cloud engine이나 google kubernetes engine에서 명령어를 수행한다면 해당 값을 공백으로 둬서 default credentials을 이용할 수 있다. ttl은 3600초 즉 1시간으로 주었다.

🔆 gcloud credentials 설정하는 방법

https://cloud.google.com/sdk/docs/install?hl=ko 여기에서 자기 환경에 맞는 google cli를 설치한다. 아래 명령어는 압축 해제 후 해당 디렉토리로 이동한 후에 입력한다.

# cli 설치쉘 실행
./google-cloud-sdk/install.sh
# cli 초기화
./google-cloud-sdk/bin/gcloud init
# 로그인 창이 뜨고 로그인 후 프로젝트 선택하면 credentials이
# ~/.config/gcloud/.config/gcloud/application_default_credentials.json 위치에 생성된다.

3. vault에서 gcp secret과 service account 연결

# vault secret에 static account 추가
❯ vault write gcp/static-account/test-sa \
    service_account_email="test-sa@{PROJECT_NAME}.iam.gserviceaccount.com" \
    secret_type="service_account_key"
Success! Data written to: gcp/static-account/test-sa

# test-sa service account key 생성
❯ vault read gcp/static-account/test-sa/key
Key                 Value
---                 -----
lease_id            gcp/static-account/test-sa/key/qscB7h8xrejdyE3xM2TypT8t
lease_duration      1h
lease_renewable     true
key_algorithm       KEY_ALG_RSA_2048
key_type            TYPE_GOOGLE_CREDENTIALS_FILE
private_key_data    ewogICJ0eXBlIjogInNlcnZpY2VfYWNjb3VudCIsCiAgInByb2plY3RfaWQi..

vault에서 service account key 생성 후 gcp console로 이동해보면 키가 생성되어 있는것을 확인할 수 있다.

다만 키 ttl은 1시간이지만 만료일은 다르게 보인다. ttl시간은 gcp에서 관리하는게 아니라 볼트 내부적으로 관리하여 저렇게 보이는 것 같다. 

그리고 주의할점은 email이나 secret_type등은 생성 후 변경되지 않으니 주의해서 추가해주어야 한다.

 

4. gcp spread sheet enable

service account로 관리하고 싶은 스프레드 시트에서 해당 service account를 추가해준다.

 

5. service account access token 사용하기

python이용

import hvac
from google.oauth2 import service_account
import base64
import json
import gspread

scope = [
    "https://spreadsheets.google.com/feeds"
]

client = hvac.Client(url={VAULT_URL}, token={TOKEN})

# vault 에서 가져온 후 decoding
encoded_secret = client.read('gcp/static-account/test-sa/key')['data']['private_key_data']
secret_bytes = base64.b64decode(encoded_secret)
my_json = secret_bytes.decode('utf8').replace("'", '"')
data = json.loads(my_json)
s = json.dumps(data)

# gcp authentication
service_account_info = json.loads(s)
credentials = service_account.Credentials.from_service_account_info(service_account_info,scopes=scope)
gc = gspread.authorize(credentials)

# spreadsheet 조회
spreadsheet_url = "https://docs.google.com/spreadsheets/d/18SVPaMMV7eCOnA0i7ofTOuP9ypwuk04UeEI9i00w1W4/edit#gid=0"
doc = gc.open_by_url(spreadsheet_url)
sheet = doc.worksheet("sheet1")

list_of_lists = sheet.get_all_values()
print(list_of_lists)

처음에 인증부분에서 헤맸던 부분이, vault에서 나온 값이 base64 encoding 되어있는지 몰랐던 것이다. 🥲

그리고 많은 블로그를 보면 다음과 같은 라이브러리를 많이 쓰는데 아래 라이브러는 deprecated되었기 때문에 google-oauth2를 사용하는 것이 좋을듯 하다. 

from oauth2client.service_account import ServiceAccountCredentials

소스를 대충 살펴보면 볼트에 로그인해서 위에 cli에서 확인했던 것 처럼 gcp/static-account/test-sa/key 위치에서 키를 생성하여 가져온다.

해당 값은 바로 사용할 수 없으니 base64 decoding작업을 거치고 google 인증을 수행한다.

spread를 조작하기 위해서 spread sheet url과 시트 이름이 필요하다. sheet1은 spread sheet의 첫번째 시트 이름이다.

그래서 해당 파이썬을 run 하면 다음과 같은 결과가 나온다.

실제 spread sheet

 


REFERENCE

https://developer.hashicorp.com/vault/docs/secrets/gcp

 

Google Cloud - Secrets Engines | Vault | HashiCorp Developer

The Google Cloud secrets engine for Vault dynamically generates Google Cloud service account keys and OAuth tokens based on IAM policies.

developer.hashicorp.com

https://google-auth.readthedocs.io/en/master/reference/google.oauth2.service_account.html#module-google.oauth2.service_account

 

google.oauth2.service_account module — google-auth 1.30.0 documentation

This module implements the JWT Profile for OAuth 2.0 Authorization Grants as defined by RFC 7523 with particular support for how this RFC is implemented in Google’s infrastructure. Google refers to these credentials as Service Accounts. Service accounts

google-auth.readthedocs.io

 

'Security > vault' 카테고리의 다른 글

[Vault] minikube에 vault 설치하기(with HA, TLS)  (1) 2023.09.26