기술 이모저모/[Ops] Devops

[Vault] Vault 서비스 사용 방법[2/2]

Kobby 2023. 4. 30. 19:46

앞선 게시물에서 Vault를 사용하기 위해 Role + Policy + Secrets을 생성하였다.

이제는 서비스에서 어떻게 Vault Secrets을 사용할 수 있는지 알아보도록 하자!!

 

[Vault] Vault 서비스 사용 방법[1/2]

앞선 게시물로 Vault 배포 및 활성화 방법에 대해서 알아보았다. 설치하였으면 이제 사용해보아야하며, 본 게시물에서는 Vault 사용방법에 대해 알아보자! [Vault] Vault Helm 배포 및 활성화 방법 K8s를

dobby-isfree.tistory.com

 

Vault Secrets 사용방법

Vault는 Sidecar 형태로 vault agent가 주입이 된다. 그렇기에 사용하는 Deployment에 특정 annotation 값을 설정해야 한다.

 

Vault를 사용하기 위한 annotation은 여러가지가 있으나 아래 값만 설정하면 Sidecar로 주입할 수 있고, Vault를 사용할 수 있다.

- agent-inject = vault sidecar 주입 여부
- agent-inject-first = init container 설정 여부
- agent-inject-secret-config.json = Vault 고유 문자열(큰 의미없는 값이다.)
- agent-inject-template-config.json = Vault 템플릿
- secret-volume-path-config.json = Vault 비밀정보 위치
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: vault-test
  name: vault-test
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: vault-test
  template:
    metadata:
      annotations:
        vault.hashicorp.com/agent-init-first: "true"
        vault.hashicorp.com/agent-inject: "true"
        vault.hashicorp.com/role: test
        vault.hashicorp.com/agent-inject-secret-config.json: test
        vault.hashicorp.com/agent-inject-template-config.json: |
          {{- with secret "test/data/test" -}}
          {"username":"{{ .Data.data.username }}","password":"{{ .Data.data.password }}"}
          {{- end }}
        vault.hashicorp.com/secret-volume-path-config.json: /test
      labels:
        app: vault-test
    spec:
      containers:
      - image: nginx
        name: vault-test

 

위와 같이 설정할 경우 vault-test Pod은 아래와 같이 vault-agent-init Job이 돌고 결과적으로는 vault-agent가 주입되었다.

Vault agent container 여부

 

그리고 vault-test의 Container를 들어가서 확인해보면 위 annotaion에서 지정한 경로와 파일에 비밀정보가 들어가있다!!

 - 만약 파일 위치를 바꾸고 싶다면 secret-volume-path-config.json의 값을 수정하면 되고

 - 만약 파일명을 바꾸고 싶다면 config.json 대신에 변경할 파일 이름을 넣으면 된다.

Vault 비밀정보 확인

 

만약 Vault Policy에 권한은 있지만, Secrets 값이 없는 경우

아래와 같이 test/test에 대한 권한은 있지만 username2 Secrets이 없으면 Pod 실행에는 문제가 없다.

다만, username2에 대해서 <no vaule>로 값이 표시된다.

        vault.hashicorp.com/agent-inject-template-config.json: |
          {{- with secret "test/data/test" -}}
          {"username":"{{ .Data.data.username }}","password":"{{ .Data.data.password }}"}
          {"username2":"{{ .Data.data.username2 }}"
          {{- end }}

Vault Policy O, Secrets X

 

만약 Vault Policy 권한이 없은 경우

test Role이 /test/test2에 대한 Policy가 없을 경우에는 아래와 같이 vault-agent Container가 정상적이지 않다.

그렇기에 최종적 Pod이 정상적이지 않은 상태가 된다.

        vault.hashicorp.com/agent-inject-template-config.json: |
          {{- with secret "test/data/test" -}}
          {"username":"{{ .Data.data.username }}","password":"{{ .Data.data.password }}"}
          {"username2":"{{ .Data.data.username2 }}"
          {{- end }}
          {{- with secret "test/data/test2" -}}
          {"username":"{{ .Data.data.username }}","password":"{{ .Data.data.password }}"}
          {"username2":"{{ .Data.data.username2 }}"
          {{- end }}

Vault  Policy X

 

지금까지 Vault 설치 방법과 사용방법에 대해서 알아보았다!

지금 비밀정보를 사용할 수 있는 방법을 보면 AWS KMS와 연동하는 방법도 있고, Vault를 제외한 다른 방법도 많다.

 

하지만, 아직까지?는 Vault가 가장 대중적인 방법인것 같고 사용방법도 어렵지 않다.

 

데브옵스는 기존 업무/배포/서비스 환경을 어떻게하면 더욱 개선할 수 있을까 방법을 고민하고/찾아보는 직무라고 생각한다.

K8s Secrets으로도 유사한 작업을 할 수 있지만 더 효율적이고 사용성이 간편한 Vault를 도입한것처럼 앞으로도 불편한 프로세스와 업무 내용이 있다면 개선하기 위해 노력할것이다!! 라고 마음속으로 다짐합니다.

 

끝!