2024. 12. 11. 11:15ㆍSpring Microservice
Vault와 Spring Cloud Vault 통합은 Spring Boot 애플리케이션이 HashiCorp Vault를 사용하여 application.properties 또는 application.yml에 설정되어 있는 비밀 정보(예: 데이터베이스 자격 증명, API 키 등)를 안전하게 관리하고 동적으로 로드할 수 있도록 돕는 강력한 방법입니다. 이를 통해 민감한 설정 값을 코드나 설정 파일에 하드코딩하지 않고, Vault를 통해 안전하게 주입할 수 있습니다.
Spring Cloud Vault 통합의 주요 개념
1. Vault란?
- HashiCorp Vault는 비밀 관리 시스템으로, 비밀번호, API 키, 인증서, 동적 자격 증명 등을 중앙에서 안전하게 저장, 접근, 갱신, 폐기할 수 있도록 지원합니다.
- 주요 기능:
- 정적 비밀: 수동으로 저장된 데이터.
- 동적 비밀: Vault가 데이터베이스, AWS 등의 자격 증명을 자동 생성.
- 자동 갱신: 동적 비밀의 만료 전 갱신.
2. Spring Cloud Vault란?
- Spring Cloud Vault는 Spring Boot 애플리케이션이 Vault와 통합될 수 있도록 돕는 프로젝트입니다.
- 기능:
- Vault의 비밀 데이터를 Spring의
Environment
및@ConfigurationProperties
에 통합. @RefreshScope
와 함께 사용하여 런타임 중 비밀 데이터를 갱신 가능.- Spring Boot의 프로파일과 통합하여 환경별로 비밀 데이터 관리.
- Vault의 비밀 데이터를 Spring의
Spring Cloud Vault 설정
1. Maven/Gradle 의존성 추가
Vault와 Spring Cloud Vault를 사용하려면 spring-cloud-starter-vault-config
의존성을 추가합니다.
Maven
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
Gradle
implementation 'org.springframework.cloud:spring-cloud-starter-vault-config'
2. Vault 서버 설정
Vault 서버를 실행합니다. 예를 들어, Docker로 Vault를 실행할 수 있습니다:
docker run --cap-add=IPC_LOCK -d -p 8200:8200 --name=dev-vault vault:latest
초기화 후, Vault에 토큰을 생성하고 비밀 데이터를 저장합니다:
vault kv put secret/application my.secret=supersecret my.database.password=topsecret
3. Spring Boot 애플리케이션 설정
application.yml
파일에서 Vault와 통합합니다.
기본 설정 예제
spring:
cloud:
vault:
uri: http://localhost:8200 # Vault 서버 URL
token: s.xxxxxxxx # Vault 인증 토큰
authentication: TOKEN # 인증 방식 (TOKEN 또는 APPROLE)
config:
order: -10 # Vault의 설정 우선순위
fail-fast: true # Vault 연결 실패 시 애플리케이션 부팅 중단
backend: secret # Vault 백엔드 경로
default-context: application # 기본 경로
profile-separator: '/' # 프로파일 구분자
4. 비밀 데이터 접근
1) @Value
로 주입
Vault에 저장된 데이터를 @Value
를 통해 주입받을 수 있습니다.
@RestController
public class SecretsController {
@Value("${my.secret}")
private String secret;
@GetMapping("/secret")
public String getSecret() {
return secret;
}
}
2) @ConfigurationProperties
사용
Vault 데이터를 @ConfigurationProperties
로 매핑하여 주입받을 수 있습니다.
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "my")
public class MyProperties {
private String secret;
private String databasePassword;
// Getters and setters
}
5. 환경별 비밀 데이터 관리
Vault는 Spring Boot의 프로파일별 설정을 지원합니다. 예를 들어, dev
, prod
환경을 구분하여 비밀 데이터를 저장할 수 있습니다.
Vault에 데이터 저장
vault kv put secret/application/dev my.secret=devSecret
vault kv put secret/application/prod my.secret=prodSecret
프로파일별 접근
Spring Boot 애플리케이션이 dev
프로파일로 실행되면, secret/application/dev
경로의 데이터를 가져옵니다.
spring:
profiles:
active: dev
6. 비밀 데이터 갱신 (@RefreshScope
)
Vault 데이터가 변경되었을 때, @RefreshScope
가 적용된 빈은 /actuator/refresh
호출 시 갱신됩니다.
예제
@RestController
@RefreshScope
public class RefreshableController {
@Value("${my.secret}")
private String secret;
@GetMapping("/secret")
public String getSecret() {
return secret;
}
}
- Vault에서 비밀 데이터를 변경:
vault kv put secret/application my.secret=newSuperSecret
/actuator/refresh
호출:curl -X POST http://localhost:8080/actuator/refresh
- 변경된 비밀 데이터가 컨트롤러에 반영됩니다.
Spring Cloud Vault 주요 인증 방식
1. Token-based Authentication
- 가장 기본적인 인증 방식으로, Vault에 생성된 토큰을 사용.
- 설정:
spring.cloud.vault.authentication: TOKEN spring.cloud.vault.token: s.xxxxxxxx
2. AppRole Authentication
- 역할 기반 인증으로, 클라이언트 ID와 Secret을 사용.
- 설정:
spring.cloud.vault.authentication: APPROLE spring.cloud.vault.app-role: role-id: my-role-id secret-id: my-secret-id
동적 비밀 (Dynamic Secrets)
Vault는 데이터베이스 자격 증명과 같은 동적 비밀을 지원합니다. Spring Cloud Vault와 함께 사용하면 데이터베이스 자격 증명을 자동으로 생성하고 관리할 수 있습니다.
- Vault에서 동적 비밀 엔진 활성화:
vault secrets enable database
- 데이터베이스 자격 증명 구성:
vault write database/config/my-database \ plugin_name=mysql-database-plugin \ connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" \ allowed_roles="my-role" \ username="root" \ password="rootpassword"
- Spring Boot에서 자동으로 동적 자격 증명 사용.
장점
- 보안 강화: 비밀 정보가 애플리케이션 코드나 설정 파일에 노출되지 않습니다.
- 중앙 집중 관리: Vault에서 모든 비밀 정보를 관리합니다.
- 동적 자격 증명: 만료 및 갱신 가능한 자격 증명 제공.
- 프로파일 기반 설정: 환경별 비밀 정보 관리.
Vault와 Spring Cloud Vault 통합을 통해 민감한 데이터를 안전하게 관리하고, Spring Boot 애플리케이션에서 동적으로 로드 및 갱신할 수 있습니다.
'Spring Microservice' 카테고리의 다른 글
유레카 클라이언트 설정 (0) | 2024.12.11 |
---|---|
Spring boot의 서비스 디스커버리 개념 (0) | 2024.12.11 |
클라우드 기반 서비스 디스커버리 에이전트 (0) | 2024.12.11 |
Raft in Vault (0) | 2024.12.10 |
vault (0) | 2024.12.10 |