
진행중인 PII 보호를 중점으로 하는 프로젝트에서 사용자의 개인정보는 온프레미스 환경에 저장하고, 클라우드에는 식별자(ID)만 전달합니다.
이 아키텍처에서는 온프레미스 환경 기반의 보안 저장소를 구축하여, DB 비밀번호 등 시스템 내 주요 credentials을 안전하게 관리할 필요가 있는데 . . . 이를 위해 HashiCorp Vault를 알게되어 도입하였으며, 애플리케이션 측에서 필요한 credential 를 안전하게 가져올 수 있도록 AppRole 인증 방식을 적용했습니다.
참고로 HashiCorp Vault는 기본적으로 웹 기반 UI도 지원하지만 저는 처음 Vault를 접해보기도 했고, 그냥 터미널에서 진행했습니다. . .
요즘 많이들 애플리케이션을 컨테이너로 띄우는게 일반적이지만, Vault 공식 문서에서 최대한 안정적이고 보안을 중시하는 프로덕션 환경에서는 직접 OS/VM에 Vault를 설치해서 운영하는 방식을 추천한다고 해서 직접 설치해서 실행하였습니다.
https://developer.hashicorp.com/vault/tutorials/day-one-raft/raft-deployment-guide
우선적으로 PII DB에 접근하기 위한 DB 관련 credentials를 어디에 보관해야 할지 하다가 선택한 솔루션입니다.
사람은 ID/PW를 입력해서 로그인하지만, 앱 서버가 어떻게 Vault에 로그인 할지 정해야합니다.
Vault 기반 환경에서 가장 표준적으로 사용되는 M2M(Machine-to-Machine) 인증 방식이 바로 AppRole입니다.
AppRole은 인증 정보를 아래 두 개로 분리합니다:
이 두 가지가 합쳐져야만 Vault 토큰을 발급받을 수 있습니다!
먼저 비밀번호를 저장할 공간(KV Engine)을 만들고, 실제 DB 계정 정보를 저장했습니다.

아무나 비밀번호를 보면 안 되므로, secret/pii-db 경로를 "읽기(Read)"만 가능한 정책을 만들었습니다.

AppRole 인증을 활성화하고, 앞서 만든 정책을 연결했습니다.

설정이 완료된 후, 애플리케이션이 사용할 Role ID와 Secret ID를 발급받았습니다.

설정이 정상적으로 동작하는지 검증하기 위해, 발급받은 ID를 사용하여 Vault 로그인을 시도했습니다. 이 과정이 성공해야만 앱이 DB 비밀번호를 가져올 수 있습니다.

이제 애플리케이션 서버에서 이 AppRole을 사용하여 Vault에서 비밀번호를 동적으로 받아와 MySQL에 접속하는 과정을 구현하고 테스트를 통해 검증해보면 될거같습니다!!
Vault 설정이 완료되었으므로, 실제로 "애플리케이션 시작 -> Vault 인증 및 DB 암호 획득 -> DB 연결 -> PII 데이터 저장"의 전체 흐름이 정상적으로 동작하는지 최종 검증을 진행했습니다.
먼저 앱 서버에서 앱 컨테이너를 구동시켰습니다. 컨테이너 로그상에서 Vault 로그인 및 MySQL 연결 성공 메시지를 확인한 뒤, 간단하게curl 명령어를 통해 실제 PII 데이터(이름, 여권번호) 저장을 요청해보았습니다.
이 테스트가 성공하려면 애플리케이션이 AppRole을 통해 Vault에서 동적으로 DB 접속 정보를 받아와야만 합니다.

마지막으로 DB 서버에 접속해서 데이터가 실제로 테이블에 잘 들어갔는지 확인하였습니다!
