Vault와 Spring Cloud Vault 통합

2024. 12. 11. 11:15Spring 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의 프로파일과 통합하여 환경별로 비밀 데이터 관리.

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;
    }
}
  1. Vault에서 비밀 데이터를 변경:
    vault kv put secret/application my.secret=newSuperSecret
  2. /actuator/refresh 호출:
    curl -X POST http://localhost:8080/actuator/refresh
  3. 변경된 비밀 데이터가 컨트롤러에 반영됩니다.

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와 함께 사용하면 데이터베이스 자격 증명을 자동으로 생성하고 관리할 수 있습니다.

  1. Vault에서 동적 비밀 엔진 활성화:
  2. vault secrets enable database
  3. 데이터베이스 자격 증명 구성:
  4. 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"
  5. Spring Boot에서 자동으로 동적 자격 증명 사용.

장점

  1. 보안 강화: 비밀 정보가 애플리케이션 코드나 설정 파일에 노출되지 않습니다.
  2. 중앙 집중 관리: Vault에서 모든 비밀 정보를 관리합니다.
  3. 동적 자격 증명: 만료 및 갱신 가능한 자격 증명 제공.
  4. 프로파일 기반 설정: 환경별 비밀 정보 관리.
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