비밀 엔진(Secrets Engine) — Vault가 시크릿을 다루는 방식

비밀 엔진(Secrets Engine) — Vault가 시크릿을 다루는 방식

시크릿을 저장하고 싶다고 해서 전부 같은 방식으로 다룰 필요는 없어요. API 키처럼 단순히 저장해 두고 읽기만 하면 되는 값이 있는가 하면, DB 자격증명처럼 요청할 때마다 새로 만들어줘야 하는 값도 있죠. Vault의 비밀 엔진(secrets engine) 은 바로 이런 "데이터를 어떻게 처리할지"를 각각의 경우에 맞게 정의하는 구성 요소입니다.

비밀 엔진은 데이터를 저장·생성·암호화하는 컴포넌트예요. 암호화된 Redis/Memcached처럼 저장하고 읽기만 하는 것도 있고, 외부 서비스에 연결해 요청 시 동적 자격증명을 만들어주는 것도 있으며, 암호화 서비스(as a service), TOTP 생성, 인증서 발급 등 훨씬 다양한 것들도 있어요.

출처: Secrets engines — HashiCorp Vault 공식 문서

비밀 엔진은 경로 위에서 동작한다

비밀 엔진은 Vault의 경로(path) 에서 활성화됩니다. 요청이 들어오면 Vault의 라우터가 해당 경로 프리픽스를 자동으로 비밀 엔진에 연결해요. 각 엔진은 자기만의 경로와 속성을 정의하므로, 사용자에게는 마치 가상 파일시스템처럼 보입니다 — 읽고, 쓰고, 삭제하는 연산을 지원하니까요.

비밀 엔진의 수명 주기

대부분의 비밀 엔진은 CLI나 API로 활성화(enabled)·비활성화(disabled)·튜닝(tuned)·이동(moved) 할 수 있어요.

  • 활성화(Enable) — 비밀 엔진을 지정된 경로에서 켜요. 몇몇 예외를 빼면 하나의 엔진을 여러 경로에서 활성화할 수 있고, 각 엔진은 자기 경로에 격리돼요. 기본적으로는 타입 이름이 곧 경로가 되죠(예: awsaws/에).
  • 비활성화(Disable) — 존재하는 엔진을 꺼요. 비활성화하면 그 엔진의 모든 시크릿이 폐기(지원하는 경우)되고, 물리 저장소에 있던 데이터도 전부 삭제돼요.
  • 이동(Move) — 엔진의 경로를 옮겨요. 시크릿의 lease가 생성된 경로에 묶여 있기 때문에 모든 시크릿이 폐기되지만, 엔진의 설정 데이터는 이동 후에도 유지돼요.
  • 튜닝(Tune) — TTL 같은 엔진의 전역 설정을 조정해요.

활성화 후에는 엔진이 응답하는 경로를 vault path-help로 직접 조회하며 그 경로의 API 규칙대로 상호작용할 수 있어요.

주의할 점: 마운트 포인트끼리는 서로 충돌할 수 없어요. 한 마운트가 다른 마운트의 프리픽스가 되면 안 되고, 반대로 다른 마운트의 프리픽스가 되는 이름으로 마운트를 만들 수도 없어요. 예를 들어 foo/barfoo/baz는 공존할 수 있지만, foofoo/baz는 공존할 수 없습니다.

배리어 뷰(Barrier View) — 엔진 간 격리

비밀 엔진은 Vault의 물리 저장소에 대한 배리어 뷰를 받아요. 이건 리눅스의 chroot와 아주 비슷한 개념입니다.

비밀 엔진이 활성화되면 무작위 UUID가 생성되고, 그 UUID가 해당 엔진의 데이터 루트가 돼요. 엔진이 물리 저장소에 쓸 때마다 이 UUID 폴더가 프리픽스로 붙거든요. Vault의 저장 계층은 ../ 같은 상대 경로 접근을 지원하지 않으므로, 활성화된 엔진이 다른 엔진의 데이터에 접근하는 것이 구조적으로 불가능해집니다.

즉, 설령 악의적인 엔진이 있더라도 다른 엔진의 데이터에는 손을 댈 수 없어요. 이 배리어 뷰가 Vault의 중요한 보안 기능 중 하나입니다.

더 알아보기