Hashicorp Vault를 이용한 AWS Access Key 관리

Hashicorp Vault - 서비스 소개 및 POC 과정

김광민
2021.12.21

목차

  • Hashicorp Vault 도입 배경
  • Hashicorp란?
  • Introduction to Vault
  • Install Vault
  • Starting the Server(DEV)
  • Secrets Engines & Dynamic Secrets

Hashicorp Vault 도입 배경

AWS 서비스를 이용하다보면 개발자와 인프라 담당자 가릴 것 없이 Access Key (aws-cli)를 사용하게 됩니다. 다양한 목적이 있을텐데요, 모니터링 메트릭을 수집하기 위해서 일 수도 있고 데이터를 쿼리하여 확인해 보기 위해 혹은 리소스의 생성과 변경, 삭제 등을 위해서도 Access Key를 사용하게 됩니다.

쉽게 말해 매우 편리합니다. 굳이 콘솔화면을 접속하지도 않고 내 로컬 노트북 PC에서 이 Access key를 이용해서 원하는 리소스를 변경, 관리 할 수 있습니다. 심지어는 복잡한 코딩도 필요 없이 간단하게 스크립트를 작성하는 것만으로도 컨트롤이 가능합니다. 실제로 많은 개발자 분들께서도 개발툴과 연동하여 업무를 하고 계십니다.

그러나 반대로 위험도도 매우 높은데요, Access Key라는게 얼마나 파워풀 하냐면, 예를들어 많은 권한을 가진 Access key가 유출된다면 이 Access Key를 이용해 악의적인 사용자가 개인정보 유출, 자원 삭제, 요금 폭탄 등등 무시무시한 일을 벌이게 될지도 모릅니다. 이런 행위들이 지구 반대편에서도 명령어 한줄만으로 가능하게 하는 것이 바로 이 Access key 라는 것 입니다.

그렇기 때문에 우리는 Access key 에 대한 체계적인 관리가 필수적입니다. 여기 Hashicorp사의 Vault라는 서비스를 이용하여 Access key 관리 뿐 아니라 잠재되어있는 보안이슈들을 해결해 보고자 도입을 검토하게 되었습니다 🙂

Hashicorp란?

Hashicorp(하시코프)사는 2012년에 미첼 하시모토, 아몬 데드거 라는 소프트웨어 개발자가 공동 창업한 기업입니다. 제공하는 제품들은 아래와 같은 제품들이 있고, 오픈소스를 통해 인프라 관리 도구를 개발하여 제공하는 회사라고 보시면 될 것 같습니다.

Hashicorp에서 제공하는 주요 제품들을 간단하게 살펴보겠습니다.

출처 : https://www.hashicorp.com/

테라폼(Terraform)

클라우드 인프라 자동화 도구로, 대규모 클라우드 관리를 자동화 할 수 있고 이를 코드로 관리합니다. IaC 기술에 대한 요구사항이 많아지는 현재 IT업계에서 테라폼에 대한 사용 경험이 굉장한 우대사항으로 어떤 기업들은 필수적인 업무능력으로 보는 곳도 있는 것 같습니다. AWS, GCP, Azure등의 클라우드에 대해 모두 지원합니다.

베이그런트(Vagrant)

베이그런트는 가상 머신으로 개발 환경을 관리할 수 있도록 도와주는 도구입니다. 커맨드라인을 통해 가상 머신을 관리하거나, 가상 머신 기반으로 프로젝트의 개발환경을 팀원들 간에 손쉽게 공유할 수 있도록 도와주는 도구입니다.

패커(Packer)

패커는 가상 머신, 클라우드, 컨테이너 이미지 작성을 자동화할 수 있는 도구입니다. 시스템의 특정 상태를 저장하는 대신 복원 가능한 방식으로 이미지 생성을 자동화할 수 있게 도와줍니다. 패커를 사용해 도커 이미지와 AMI 이미지를 빌드할 수 있습니다.

볼트(Vault)

이 블로그에서 다루게 될 도구입니다. UI, CLI, HTTP API 등의 인터페이스를 제공하고 있으며, 저장된 비밀 정보를 안전하게 사용할 수 있는 방법들을 제공해줍니다.

바운더리(Boundary)

바운더리는 사용자 인증을 기반으로 시스템과 서비스들에 안전하게 접근할 수 있는 방법을 제공해주는 도구입니다.

컨설(Consul)

컨설은 마이크로서비스와 클라우드 인프라스트럭처의 네트워크 이슈를 해결하기 위한 서비스 메시 솔루션입니다.

노마드(Nomad)

노마드는 애플리케이션 배포와 스케줄링을 하는 오케스트레이션 도구입니다. 비교적 심플한 아키텍처로 구성되어있으며, 컨테이너와 컨테이너가 아닌 워크로드를 지원하며, 온프레미스와 클라우드 환경을 지원합니다.

웨이포인트(Waypoint)

웨이포인트는 다양한 플랫폼에서 빌드, 배포, 릴리스를 위한 워크플로우를 관리할 수 있도록 도와주는 도구입니다.

또한 SaaS 형태의 클라우드 플랫폼 서비스를 유료로 제공하는데 현재는 Terraform, Vault, Consul 3가지 서비스를 제공하고 있습니다.

Introduction to Vault

Vault는 앞서 이야기 한 것처럼 Hashicorp에서 제공하는 보안 관련 서비스입니다.

먼저 “시크릿(Secrets)” 이라는 개념에 대해 이해가 필요합니다. 시크릿은 우리가 이야기 하는 크리덴셜, 즉 시스템을 접속할 때 필요한 인증과 인가 정보를 부여하는 모든 것을 의미합니다. 대표적인 몇 가지 예로 계정/비밀번호, DB인증정보, API토큰 또는 TLS인증서 등을 들 수 있습니다.

이러한 것들 모두 시크릿의 영역에 속하며, 매우 신중하게 관리해야 합니다. 누가 시스템에 접근했는지 시스템에 어떤 것들을 이용했는지에 대한 로깅이 필요합니다.

실제로 대부분의 회사들이 이런 “시크릿” 영역에 있는 정보들을 관리하는 상태들을 보면 상황이 좋지 않은 경우가 많습니다. 예를 들어 소스 코드 내부에 Plain Text로 작성 되어 있는 경우도 있고, 때로는 계정/패스워드가 헤더에 하드코딩 되어있는 경우도 있습니다.

Vault는 이러한 문제점들을 해결해 주기 위해 등장했습니다. 모든 곳에 흩어져 있는 시크릿 정보들을 중앙화 하고, Vault에 저장된 데이터와 Client간에 오고 가는 데이터에 대한 암호화를 보장합니다. 그리고 Audit(감사 추적) 기능을 제공합니다. 어떤 인증정보가 웹 서버를 접근했는지, 어떤 사람이 해당 시스템에서 어떤 인증정보에 접근했는지 알 수 있습니다.

Vault의 구성요소

Vault 의 구성요소는 크게 다섯가지로 분류할 수 있습니다.

Auth(인증)

그림에도 나와있듯, 다양한 방법으로 인증을 받을 수 있습니다. 가장 기본적인 아이디/패스워드 방식부터 신뢰할 수 있는 타사의 Github 또는 LDAP 등에서 인증하도록 위임할 수 있습니다.

Core

암호화 알고리즘이 구현되고 권한에 대한 라우팅이 이루어집니다.

Secrets

다양한 서비스를 지원하며, Key/Value 같은 간단한 값부터 DB 엔진 등 AWS Credential 같은 값들을 동적으로 생성할 수 있습니다.

Storage

토큰, 정책, 구성을 저장하려면 스토리지가 필요합니다. Consul, DDB, MongoDB, S3 등등 시스템에 맞는 것을 선택하여 구성합니다.

Audit(심사)

Audit log가 제공됩니다. 시스템에서 들어오고 나가는 모든 요청과 응답을 기록하여 내부에서 일어나는 일에 대해 기록합니다. Vault는 감사 로그가 실패할 경우에 들어오는 요청을 거부하도록 설계되었습니다.

Vault의 구조

Vault 구조를 매우 쉽게 설명해 보겠습니다.

  1. 클라이언트는 Vault에 토큰과 시크릿 경로를 보냅니다.
  2. Vault는 클라이언트가 원하는 데이터를 가지고 있습니다. (시크릿 정보)
  3. Vault는 클라이언트의 토큰 권한을 확인하고 허용되면 요청된 시크릿 정보를 반환합니다.

Install Vault

Vault는 소스 코드, 컴파일된 바이너리, 패키지 등으로 설치가 가능합니다.

여기서는 Mac을 통한 패키지 설치로 테스트 해보겠습니다.

 $ brew tap hashicorp/tap // 패키지 저장소인 Hashicorp tap을 설치합니다.



 $ brew install hashicorp/tap/vault // Vault를 설치 합니다.



Starting the Server(DEV)

Vault를 구성하기에 앞서 Dev 버전을 설치하여 테스트 합니다.

 $ vault server -dev // vault 서버(개발)를 활성화 합니다.



 ~ export VAULT_ADDR='http://127.0.0.1:8200' // Vault 클라이언트와 개발서버가 통신하도록 해줍니다.
 ~ export VAULT_DEV_ROOT_TOKEN_ID=s.HQ7IiehMcXSy0c63mN0pl6j3 // VAULT_TOKEN 환경 변수 값을 생성된 루트 토큰 값으로 설정합니다.
 ~ vault status // vault 상태를 확인 합니다.



Secrets Engines & Dynamic Secrets

Vault 의 구조를 알아보았으니, 시크릿 엔진을 통해 동적으로 생성되는 시크릿 정보를 획득해 보겠습니다.

시크릿 엔진은 시크릿 정보를 저장, 생성 또는 암호화하는 Vault의 구성 요소 입니다.

그림과 같이 클라이언트(사람 혹은 머신)는 인증 절차를 통해 시크릿 엔진에게 정보를 요청하고 허용된 인증정보인지 확인이 되면 시크릿 엔진에서 클라이언트에게 정보를 전달해 줍니다.

Enable a Secrets Engine

먼저 Secrets Engine을 활성화 해줍니다.

참고로 각 시크릿 엔진과는 서로 격리되어 있습니다.

예를 들어, 시크릿 엔진을 여러개 만들어도 서로 통신할 수 없습니다.

 ~ vault secrets enable -path=kv kv**
 ~ vault secrets enable kv** // kv 라는 시크릿 엔진을 활성화 합니다.

두 명령어는 동일한 명령어 입니다. (이미 존재한다는 에러메시지를 확인할 수 있습니다.)

이와 같이 시크릿 엔진을 활성화 한 후에 간단하게 Key/Value를 넣어볼 수 있습니다.

 ~ vault kv put kv/dealicious a=b // dealicious 라는 시크릿 안에 key:a , value:b 라는 데이터를 저장
 ~ vault kv get kv/dealicious** // dealicious 라는 시크릿에 대한 정보 확인
 ~ vault kv delete kv/dealicious // dealicious 라는 시크릿 삭제

Dynamic Secrets

Dynamic Secrets은 클라이언트가 엔진에 엑세스 할 때 생성 됩니다. 이는 요청 전까지 시크릿 정보 자체가 존재하지 않기 때문에 누군가가 이를 훔치거나 동일한 시크릿을 사용하는 위험이 없습니다. 또한 일회성 시크릿 정보를 생성하기 때문에 시간이 지나 만료가 되면 자동으로 삭제가 되고 유출에 대한 위험도 줄어들게 됩니다.

AWS Secrets Engine을 통해 Dynamic Secrets을 알아보겠습니다.

먼저 AWS Secrets을 활성화 해줍니다.

 ~ vault secrets enable -path=aws aws



AWS Secrets Engine을 활성화 한 후에는 AWS와 통신하도록 구성합니다. 이를 위해서는 AWS IAM Role이 필요합니다. Vault 서버에서 AWS Access Key ID를 보유할 수 있도록 Access Key ID와 Secret Key ID를 환경변수로 설정합니다.

 ~ export AWS_ACCESS_KEY_ID=<aws_access_key_id> // Access Key를 export 합니다.
 ~ export AWS_SECRET_ACCESS_KEY=<aws_secret_key> // Secret Access Key를 export 합니다.
 ~ vault write aws/config/root \
   access_key=$AWS_ACCESS_KEY_ID \
   secret_key=$AWS_SECRET_ACCESS_KEY \
   region=ap-northeast-2** // vault에 configuration 해줍니다.

IAM Role을 구성합니다.

마지막으로 등록된 정보를 활용하여 AWS Credential 정보를 generate 해줍니다.

 ~ vault read aws/creds/my-role



성공입니다! 이 Access Key는 방금 발급된 따끈따끈한 키 입니다. 발급된 Access Key를 사용하여 AWS 내에서 모든 작업을 수행할 수 있습니다. 현재는 만료시간이 default값인 768h(32day) 로 되어있지만 이 또한 변경이 가능합니다.

이것으로 Vault 를 통한 AWS Access Key를 동적으로 생성해보는 테스트가 완료 되었습니다.

다음에는 Consul을 통한 Vault 서버의 실제 구축(클러스터 구성)과 LDAP 연동을 진행해보도록 하겠습니다.

감사합니다.

김광민

DevOps

"뿌린대로 거둡니다"