반응형
해당 글에서는 OpenSource인 Vault에 대해 이해를 돕기 위해 작성한 글입니다.
💡 [참고] Vault와 관련된 글에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다
분류 | 설명 | 링크 |
환경설정 | Docker로 Vault Server 구축 방법 | https://adjh54.tistory.com/393 |
환경설정 | Dockerfile로 Vault Server 구축 방법 | https://adjh54.tistory.com/415 |
환경설정 | Vault Server Unseal Key 초기화 방법 | https://adjh54.tistory.com/396 |
1) Vault
💡 Vault
- HashCorp 사에서 만든 Vault는 다양한 환경에서 애플리케이션의 외부 비밀 속성(예: 데이터베이스 비밀번호, API 키 등)을 외부화된 구성으로 중앙에서 관리할 수 있습니다.
- Spring Boot 환경에서 Vault로부터 시크릿 정보를 읽어오며 Valut에 시크릿 정보를 쓰는 것도 가능합니다. 이러한 방식으로 애플리케이션의 중요한 정보는 코드에서 분리되어 보안이 보장됩니다.
- 기밀정보의 동적인 제공, 중앙 집중식 시크릿 관리, 즉각적인 액세스 제어, 감사 추적 기능 등을 제공하여, 기업의 보안 정책을 준수하는 데 도움이 됩니다.
1. Vault의 특징
특징 | 설명 |
기밀정보의 동적 제공 | 애플리케이션이 필요에 따라 비밀정보를 요청하고, Vault는 요청된 정보를 제공합니다. |
중앙 집중식 시크릿 관리 | 모든 애플리케이션의 시크릿 정보를 중앙에서 관리할 수 있습니다. |
즉각적인 액세스 제어 | 애플리케이션이 Vault에 접근 할 수 있는 ‘특정 토큰 아이디’를 기반으로 Vault 서비스를 호출하고, Vault는 해당 '특정 토큰 아이디'를 수신한 뒤 요청된 '비밀정보'를 제공합니다. |
감사 추적 기능 | Vault는 모든 액세스 요청을 로깅하여 감사를 위한 추적이 가능합니다. |
[더 알아보기]
💡 중앙 집중식 관리라면 이면 MSA 환경에서 모든 서버들의 비밀정보를 한 곳에서 관리할 수 있겠네?
- 맞습니다. 비밀번호를 한 곳에서 관리하기에 보안정보 관리에 훨씬 용이합니다.
2. Vault 수행 과정
💡 Vault 수행 과정
1. Spring Boot → Hashicorp Vault: Secret Request(비밀정보 요청)
- Spring Boot 애플리케이션에서는 서버를 실행할 때, Valut에 접근할 수 있는 ‘특정 토큰 아이디’(Secret Request)’ 를 기반으로 Vault 서비스를 호출하여 ‘비밀 정보(Secret)’를 검색합니다.
2. Hashicorp Vault → Spring Boot: Secret Response(비밀정보 응답)
- Valut 서비스는 Spring Boot 애플리케이션의 ‘특정 토큰 아이디’(Secret Request)’를 수신하고 요청된 ‘비밀 정보(Secret)’를 전달합니다.
- 이 단계를 통해서 애플리케이션은 필요한 시크릿 정보를 안전하게 받아올 수 있습니다.
3. Spring Boot → Remote Service : Connection Request(커넥션 요청)
- Spring Boot 애플리케이션이 원격 서비스와 연결을 시도하는 과정을 의미합니다.
- 이 단계에서 애플리케이션은 Vault에서 안전하게 가져온 비밀 정보(예: 데이터베이스 비밀번호, API 키 등)를 사용하여 원격 서비스에 연결 요청을 보냅니다.
- 이렇게 함으로써, 중요한 정보를 코드 내에 직접 작성하거나 노출시키지 않아도 되어 보안을 더 효과적으로 관리할 수 있습니다.
4. Remote Service → Spring Boot : Connection Response(커넥션 연결)
- Vault 서비스가 Spring Boot 애플리케이션의 Secret Request를 수신하고, 요청된 '비밀 정보'를 애플리케이션으로 전송하는 단계입니다.
- 이 단계를 통해 애플리케이션은 필요한 시크릿 정보를 안전하게 받아올 수 있습니다.
[ 더 알아보기 ]
💡 Vault에서 비밀정보를 일괄적으로 가져오는 것일까? 아니면 필요에 따라 가져오는 것일까?
- Spring Boot 애플리케이션에서는 비밀정보를 필요에 따라 가져옵니다.
- 애플리케이션에서는 비밀정보를 요청하고 Valut는 요청된 정보를 애플리케이션으로 제공합니다.
💡 그러면 사실상 Connection 과정이 필요에 따라 정보를 가져오는 과정이 되겠네?
- 맞습니다. Valut에 접근 할 수 있는 ‘특정 토큰 아이디’를 기반으로 Valut 서비스를 호출하고 Vault는 해당 '특정 토큰 아이디'를 수신한 뒤 요청된 '비밀정보'를 제공합니다.
3. Vault 주요 키워드
용어 | 분류 | 설명 |
Seal Key | 키 | Vault에서 모든 데이터를 암호화하는데 사용되는 키입니다. |
Unseal Key | 키 | Vault의 암호화된 데이터를 복호화하는데 사용되는 키입니다. |
Initial Root Key | 키 | Vault 서버를 처음 설정할 때 생성되는 최상위 레벨의 키입니다. |
Encryption key(protected by the root key) | 키 | 루트 키에 의해 보호되는 암호화 키입니다. |
Keyring | 기능 | 여러 암호화 키를 안전하게 저장하고 관리하는 Vault의 기능입니다. |
Rekey | 작업 | Vault의 Unseal 키를 교체하는 작업을 의미합니다. |
Rotate | 작업 | Vault 내부에서 사용되는 암호화 키를 교체하는 작업을 의미합니다. |
Secrets Engine | 구성요소 | Vault에서 비밀정보를 생성하고 관리하는 구성요소입니다. |
Secrets | 데이터 | Vault에서 보호하고 있는 비밀 데이터입니다. |
Authentication Method | 구성요소 | Vault에 접근할 때 사용되는 인증 방식입니다. |
ACL(Access Control List) Policy | 구성요소 | Vault 리소스에 대한 접근 권한을 관리하는 정책입니다. |
HCL File | 파일 형식 | HashiCorp 제품에서 사용되는 설정 파일 형식입니다. |
2) Vault Seal Key / Unseal Key
💡 Vault Seal Key / Unseal Key
- Vault 서버를 보안 관리를 위한 것으로 비밀 정보의 암호화 복호화, 그리고 권한 관리를 위해서 사용됩니다.
종류 | 설명 |
Seal Key | - Vault에서 모든 데이터를 암호화하는데 사용되는 키입니다. - 관리자가 직접 관리하지 않으며 시스템에서 관리가 됩니다. |
Unseal Key | - Vault의 암호화된 데이터를 복호화(해독)하는데 사용되는 키입니다. - 관리자에 의해 직접 관리가 됩니다. |
1. Vault Seal Key
💡 Vault Seal Key
- ‘Vault에 저장된 데이터들은 암호화’를 수행하며 이 암호화를 위해 사용되는 키를 의미합니다.
- 최초 Vault Server의 저장소의 모든 데이터는 봉인된 상태로 시작되며 비밀 정보에 접근이 불가능합니다.
- 관리자가 직접적으로 Seal Key를 통해 암호화를 수행하는 것은 아니며 Vault 시스템 내부에서 자동적으로 사용되어 모든 데이터를 암호화할 때 사용합니다.
[ 더 알아보기 ]
💡 결론적으로 Vault Seal Key는 관리자가 관리하지는 않는 거네?
- 맞습니다. 관리자가 직접 관리하는 것이 아닌 Vault 시스템 내부에서 자동적으로 사용되어 모든 데이터를 암호화시킵니다.
2. Vault Unseal Key
💡 Vault Unseal Key
- Vault의 암호화된 ‘데이터를 복호화’하는 데 사용되는 키를 의미합니다.
- 해당 키는 Vault 서버의 시작, 재시작 등을 할 때마다 요청이 되며 데이터를 복호화하기 위해서 필요하며 이를 통해 비밀 정보에 접근이 가능해집니다.
- 이러한 Unseal Key는 ‘관리자에 의해 관리가 되는 키’입니다. 각각 키는 여러 명에게 분배되어 관리되며 암호화된 데이터를 복호화하기 위해서는 여러 명의 분배된 키를 통해서 복호화를 수행합니다.
- 이를 통해 한 사람이 단독으로 Vault 데이터를 해독할 수 없도록 보안이 강화되어 있습니다.
💡 Vault 처리과정
1. Key shares/Unseal Keys
- Vault 서버 보안 관리를 위해 사용되며 비밀 정보의 암호화, 복호화 및 권한 관리를 위해 사용이 됩니다.
- 초기에 Vault 서버를 구성하면 Unseal Keys가 여러 관리자에게 배분되며(Key shares) 이들 키를 통해 Vault 서버에 접근할 수 있습니다(Unseal Keys)
- 전체 Unseal 키 중 과반수를 입력해야 접근이 가능합니다.
2. Root Key
- Vault 서버를 처음 설정할 때 생성되는 최상위 레벨의 키로 Vault의 모든 보안정보에 대한 최종 접근 권한을 가집니다.
- 최초에만 Root Key로 사용하며 이를 직접적으로 사용하는 것을 피하며 대신 인증 방법을 통해 Vault에 접근하는 것이 일반적입니다.
3. Encryption key(protected by the root key)
- 데이터를 암호화하는 데 사용됩니다. 원본 데이터를 암호화하고 해당 키 또는 대응하는 복호화 키를 사용하여 암호화된 데이터를 다시 원본 상태로 복호화할 수 있습니다.
- 이러한 Encryption Key는 데이터의 보안을 유지하는 중요한 역할을 합니다.
[참고] Vault의 Key shares / Unseal Keys 과정은 ‘샤미르 비밀 공유 알고리즘’을 기반으로 구성이 되었습니다. 이에 대해 궁금하신 분은 아래의 글을 참고하시면 도움이 됩니다.
💡 상세 사용예시 -1
- Docker를 통해서 Vault Server를 최초 구성하는 과정에 Unseal 키와 Root Key를 발급을 받습니다.
- 아래의 Unseal Key는 여러 사람들에게 분배되어 관리됩니다.
💡 상세 사용예시 - 2
- Valut 서버의 구성이 완료되어 관리자 페이지로 접근을 할 때 아래와 같이 Unseal 키를 입력하라는 화면이 나옵니다.
- 정책마다 다르겠지만 5개의 Unseal 키 중에 3개를 입력하면 다음으로 이동이 가능합니다.
3) Vault Keyring
💡 Vault Keyring
- 다수의 암호화 키(비밀번호, API 키, 인증서 등)들을 안전하게 저장하고 관리할 수 있는 기능을 제공합니다. 이를 통해 중요한 정보를 안전하게 보관하고 필요에 따라 쉽게 접근할 수 있는 기능을 제공합니다.
- 또한 ‘특정 사용자만 접근’이 가능한 접근 권한을 지정할 수 있고 ‘키의 버전 관리’도 가능하게 해 주어서 각 키는 특정 버전 정보와 함께 저장됩니다.
- Keyring의 주요한 특징은 키의 회전(Key Rotate)을 지원한다는 점입니다. 이는 새로운 키를 생성하고 이를 현재 키로 설정하는 과정을 의미합니다.
- 이러한 과정을 통해 기존 키가 노출되더라도 새로 생성된 키를 통해 데이터 보안을 유지할 수 있습니다. Vault에서는 Keyring 관리를 자동화해 주므로, 사용자는 키 관리에 대한 부담을 덜 수 있습니다.
💡 Vault Key Rotate
- Rekey 과정을 통해 Unseal 키를 교체하는 작업과 Rotate 과정을 통해 내부 사용되는 암호화 키를 교체하는 작업을 통해 키가 노출되었을 시 이를 교체하는 과정입니다.
1. Rekey
- Vault의 ‘Unseal Key’를 교체하는 작업을 의미합니다.
- 이는 Vault의 보안을 강화하는 중요한 작업으로, 특정한 조건 하에서 Unseal 키가 노출되었을 때, 또는 주기적인 보안 업데이트를 위해 수행될 수 있습니다.
- Rekey 과정을 통해 새로운 Unseal 키가 생성되며, 이전의 Unseal 키는 더 이상 사용되지 않게 됩니다.
2. Rotate
- Vault 내부에서 사용되는 ‘암호화 키(Encryption Key)’를 교체하는 작업을 의미합니다. 즉, Vault가 보호하고 있는 보안 데이터를 암호화하기 위해 사용되는 키를 새로운 것으로 교체하는 것입니다.
Vault가 자동으로 새로운 키를 생성하고 이를 사용하여 데이터를 암호화합니다. 이전의 키는 자동으로 폐기되며, 이 과정은 Vault의 데이터 보안을 유지하기 위해 주기적으로 수행되는 것이 일반적입니다.
[ 더 알아보기]
💡 Vault에서 Rekey 과정을 수행하면 Unseal Key가 교체되는 게 맞는 건가?
- 맞습니다. 해당 과정을 통해 새로운 Unseal 키가 생성되며 이전의 Unseal 키는 더 이상 사용되지 않게 되며, 이 키들은 관리자에게 재 배분이 됩니다.
💡 그럼 언제 Rekey 과정을 수행하는 것일까?
- Vault의 Unseal Key가 노출되었거나 주기적인 보안 업데이트를 수행하는 경우 이를 수행합니다.
💡 Rotate 과정은 관리자가 관여하는 게 아니라 시스템에서 처리되는 건가?
- Vault 시스템에서 자동으로 처리되는 과정입니다. 이를 통해 새로운 암호화 키를 생성하고 이를 사용하여 데이터를 암호화합니다.
4) Secrets Engine
💡 Secrets Engine
- Vault에서 비밀정보를 생성하고 관리하는 구성요소입니다. 이들의 다양한 유형의 비밀정보를 처리하며 각각 특정한 용도나 환경에 따라 설계되어 있습니다.
- Secrets Engine 내에 Secrets이라는 비밀 정보를 관리합니다.
분류 | 설명 | Secrets Engines 종류 |
Generic | 가장 기본적인 형태의 보안 정보를 제공하고 관리 | 키-값 저장소, PKI 인증서 생성 및 관리, SSH 로그인을 위한 동적 키 생성, 암호화와 복호화 수행, 시간 기반의 일회용 패스워드 관리, LDAP 및 Kubernetes를 통한 사용자 인증 |
Cloud | 클라우드 서비스와 통합하여 보안 정보를 직접 관리하고 생성 | Alibaba Cloud, AWS, Azure, Google Cloud |
Infra | 인프라 서비스와 통합하여 보안 정보를 보다 안전하게 보관하고 관리 | Consul, 다양한 데이터베이스 시스템, Nomad 플랫폼, RabbitMQ 메시지 브로커 |
분류 | Secrets 종류 | 설명 |
Generic | KV | 키-값 저장소를 제공하는 방식 |
Generic | PKI Certificates | 공개키 인증서를 생성하고 관리하는 방식 |
Generic | SSH | SSH 로그인을 위한 동적인 키를 생성하는 방식 |
Generic | Transit | 암호화와 복호화를 수행하는 방식 |
Generic | TOTP | 시간 기반의 일회용 패스워드를 관리하는 방식 |
Generic | LDAP | LDAP로 사용자 인증하는 방식 |
Generic | Kubernetes | Kubernetes로 사용자 인증하는 방식 |
Cloud | AliCloud | Alibaba Cloud 서비스와 통합하여 이용하는 방식 |
Cloud | AWS | AWS 서비스와 통합하여 이용하는 방식 |
Cloud | Azure | Azure 서비스와 통합하여 이용하는 방식 |
Cloud | Google Cloud | Google Cloud 서비스와 통합하여 이용하는 방식 |
Cloud | Google Cloud KMS | Google Cloud KMS와 통합하여 이용하는 방식 |
Infra | Consul | Consul과 통합하여 이용하는 방식 |
Infra | Databases | 다양한 데이터베이스 시스템과 통합하여 이용하는 방식 |
Infra | Nomad | Nomad 플랫폼과 통합하여 이용하는 방식 |
Infra | RabbitMQ | RabbitMQ 메시지 브로커와 통합하여 이용하는 방식 |
5) 인증 방법 (Authentication Method)
💡 인증 방법 (Authentication Method)
- Vault 서버에 접근하는 사용자나 시스템을 식별하고 권한을 부여하기 위한 방법을 의미합니다.
- Vault에 접근할 수 있는 특정 토큰 아이디나 인증서, 사용자 이름과 비밀번호 등을 통해 이루어집니다. 이러한 다양한 인증방법을 통해 Vault는 사용자와 시스템의 신원을 확인하고 적절한 권한을 부여하여 보안을 유지합니다.
분류 | 설명 | Authentication Method 종류 |
Generic | 일반적인 인증 방법을 제공합니다. | AppRole, JWT, OIDC, TLS Certificates, Username & Password |
Cloud | 클라우드 서비스와 통합하여 사용자를 인증합니다. | AliCloud, AWS, Azure, Google Cloud, GitHub |
Infra | 인프라 서비스와 통합하여 사용자를 인증합니다. | Kubernetes, LDAP, Okta, RADIUS |
분류 | Authentication Method 종류 | 설명 |
Generic | AppRole | 사전에 정의된 역할에 따라 애플리케이션 인증을 제공하는 방식 |
Generic | JWT | JSON Web Token을 사용한 인증하는 방식 |
Generic | OIDC | OpenID Connect 프로토콜을 이용한 인증하는 방식 |
Generic | TLS Certificates | TLS/SSL 인증서를 이용한 인증하는 방식 |
Generic | Username & Password | 사용자 이름과 비밀번호를 이용한 기본 인증하는 방식 |
Cloud | AliCloud | Alibaba Cloud 사용자를 인증하는 방식 |
Cloud | AWS | AWS IAM 사용자를 인증하는 방식 |
Cloud | Azure | Azure Active Directory 사용자를 인증하는 방식 |
Cloud | Google Cloud | Google Cloud 사용자를 인증하는 방식 |
Cloud | GitHub | GitHub 사용자를 인증하는 방식 |
Infra | Kubernetes | Kubernetes 서비스 어카운트를 인증하는 방식 |
Infra | LDAP | LDAP 디렉토리 사용자를 인증하는 방식 |
Infra | Okta | Okta 사용자를 인증하는 방식 |
Infra | RADIUS | RADIUS 서버를 통한 인증하는 방식 |
6) Vault ACL Policy(Access Control List)
💡 Vault ACL Policy(Access Control List)
- Vault 리소스에 대한 ‘접근 권한을 관리하는 방식’입니다. 이 정책은 특정 경로에 대한 접근 권한을 지정하며, 사용자나 시스템이 Vault의 어떤 부분에 접근하고 어떤 작업을 수행할 수 있는지를 결정합니다.
- 예를 들어, 사용자가 특정 시크릿 정보를 읽을 수 있는지, 쓸 수 있는지, 혹은 삭제할 수 있는지를 ACL 정책을 통해 관리할 수 있습니다.
이를 통해 특정 사용자나 그룹이 필요한 정보만 접근하도록 하여 보안을 강화할 수 있습니다
1. HCL File(HashiCorp Configuration Language File)
💡 HCL File(HashiCorp Configuration Language File)
- HashiCorp가 개발한 여러 제품(예: Terraform, Vault 등)에서 사용되는 설정 파일 형식입니다.
- JSON과 유사하게 데이터를 표현하지만, 사람이 읽기 쉽고 쓰기 쉬운 형식을 제공하려는 목표를 가지고 설계되었습니다.
- HCL 파일은 주석, 변수, 함수 등을 지원하며, 반복적인 코드를 최소화하는데 도움이 됩니다.
💡 사용예시
- multiflex라는 Secrets Engine에서 ‘data’의 접근하여 dbconfig라는 Secrets에 대한 접근 권한을 부여합니다.
- 접근 권한은 생성, 읽기, 수정, 나열하는 권한을 부여하였습니다.
# Grant 'create', 'read' , 'update', and ‘list’ permission
path "multiflex/data/dbconfig" {
capabilities = [ "create", "read", "update", "list" ]
}
💡 [참고] Policies에 대한 정보가 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
2. capabilities 속성 값
접근 권한 종류 | 설명 |
create | 지정된 경로에 대해 새로운 시크릿 정보를 생성하는 권한을 부여합니다. |
read | 지정된 경로에 대해 비밀 정보(Secret)를 읽을 권한을 부여합니다. |
update | 지정된 경로에 대해 비밀 정보(Secret)를 수정 할 수 있는 권한을 부여합니다. |
delete | 지정된 경로에 대해 비밀 정보(Secret)를 삭제 할 수 있는 권한을 부여합니다. |
list | 지정된 경로에 대해 비밀 정보(Secret)를 나열 할 수 있는 권한을 부여합니다. |
sudo | 모든 활동에 대한 권한을 부여합니다. |
deny | 지정된 경로에 대한 모든 권한을 거부합니다. |
subscribe | 지정된 경로에 대한 업데이트를 받을 수 있는 권한을 부여합니다. |
오늘도 감사합니다. 😀
반응형
'공통 > OpenSource' 카테고리의 다른 글
[OpenSource] sonarQube 이해하기 -1 : 정의, 주요특징, 구성요소, 수행 프로세스 (0) | 2024.01.06 |
---|