Vault(4) - 볼트의 아키텍처 구조 이해하기

볼트를 운영하다 보면 이런 대화를 종종 듣게 된다.

“볼트 서버 재기동했습니다. 누구 두분만 Unsealed 좀 해주세요”

“제가 접속 가능하니 할께요”

“저도 가능합니다. 지금 Unsealed했어요”

“감사합니다. Unsealed 처리 되었어요. 이제 사용하시면 됩니다.”

이게 도대체 무슨 말일까. 서버를 기동했는데 누군가는 왜 필요한 것이며 Unsealed는 도대체 무엇을 하는 것일까? 오늘은 이에 대해서 알아보고자 한다. 우선, 볼트의 시스템 아키텍처에 대해 살펴보자.

볼트의 시스템 아키텍처

볼트는 암호화된 데이터를 저장하는 스토리지 백엔드와 HTTP 서비스를 제공하는 API, 그리고 배리어(Barrier) 내부 영역으로 구성된다. 배리어 내부 영역은 볼트에 의해 신뢰성을 보장받으며, 이 영역에 접근하기 위해서는 봉인이 해제되어야 한다. 스토리지 백엔드와 API 영역은 봉인되지 않은 외부에 존재하기 때문에, 봉인이 해제되지 않은 상태에서도 동작이 가능하다.

vault-layers

스토리지 백엔드는 볼트가 암호화된 데이터를 저장하기 위해 사용하는 영역이다. 볼트 서버 자체는 저장된 데이터의 내구성을 보장하지 않지만, 대신 스토리지 벡엔드를 통해 데이터의 영속성을 보장한다. 다만, 스토리지 백엔드는 배리어 외부 영역에 존재하기 때문에 데이터의 기밀성을 보장해주지는 않는다. 시크릿은 배리어 내부에서 암호화된 상태로 스토리지 백엔드에 전달되며, 스토리지 백엔드는 이 데이터의 내구성을 높이는 역할만 담당하는 것이다. 어떤 스토리지 백엔드를 사용하는가에 따라 데이터의 저장 방식도 달라지는데, MySQL을 스토리지 백엔드로 사용하면 시크릿 데이터를 DB에 저장하고, S3를 사용하면 데이터를 파일에 저장한다. 스토리지 백엔드로 사용할 수 있는 시스템은 다음과 같다.

  • MySQL, MSSQL, PostgreSQL, Google Cloud Spanner 등 대부분의 DBMS
  • DynamoDB, Cassandra, CouchDB 등의 NoSQL
  • 일반 파일 시스템
  • S3 등 클라우드 기반 스토리지 시스템

배리어는 볼트 내부의 암호화 장벽이다. 볼트와 스토리지 백엔드 사이를 통과하는 모든 데이터는 배리어를 거친다. 베리어 외부는 신뢰되지 않는 영역이므로, 배리어를 통과할 때에는 항상 암호화된 상태로 전달된다. 배리어는 내부에 접근하기 전에 봉인이 해제되어야 한다. 볼트 서버는 재기동시 봉인된 상태로 실행되기 때문에, 봉인 해제 권한을 가진 몇 명의 사람들이 봉인을 해제해야만 배리어 내부에 접근할 수 있다.

인증 메서드는 볼트에 접근할 수 있는 권한을 제어하는 계층이다. 사용자와 어플리케이션이 어떻게 볼트에 접속하고 권한을 받아 사용할 것인가에 대한 고민의 결과라고 생각하면 된다. username/password 기반의 벡엔드와 Token 백엔드가 대표적인데, 이전 실습에서 볼트 로그인시 입력한 토큰이 바로 Token 백엔드 방식에 해당한다. 이외에도 LDAP이나 Github, OIDC 등을 인증 백엔드로 사용할 수 있다. 만약 OIDC를 인증 백엔드로 사용한다면, 사용자 퇴사시 OIDC 연동 계정만 삭제하는 것으로 권한을 깔끔하게 회수할 수 있다.