1. ConfigData API
- 외부 설정을 가져오는 역할을 하는 API
- ✅ Vault, Config Server 등
- ✅ 어떤 설정 시스템을 가져올지, 순서를 어떻게 할지 지정 가능
- ➡️ 유연성 높음
ConfigData Locations
위치
- vault://
- vault:///<context-path> (컨텍스트 지정 가능)
- vault:///<context-path>?prefix=<prefix> (prefix 지정 가능)
기본 경로
- /secret/${spring.application.name}/${profile}
예시) application.yml
더보기
spring.config.import: vault://first/context/path, vault://other/path, vault://
spring.config.import: vault://my/path?prefix=foo., vault://my/other/path?prefix=bar.
- 여러 경로 등록 가능
- 키 중복 시, 병합됨 (앞에 온것이 우선순위 높음)
Conditionally enable/disable Vault Configuration
- 'optional:' prefix를 사용하면, vault 연결이 꺼져있어도 애플리케이션이 기동됨
예시) application.yml
더보기
spring.config.import: optional:vault://
spring.config.import: optional:vault:///<context-path>
Infrastructure Customization
- Vault와 통신하기 위해 내부적으로 여러 인프라 클래스를 의존함 (HTTP Client, RestTemplateBuilder 등)
- ✅ Spring Context 생성 전에, 필요한 인프라 빈을 직접 등록하여 커스터마이징할 수 있음
- ConfigData API 사용 시, VaultConfigDataLoader가 Bean을 등록함
- ConfigData API 사용 안할시, VaultAutoConfiguration이 Bean 등록함
커스터마이징) ClientHttpRequestFactory
더보기
ClientOptions options = new ClientOptions();
SslConfiguration sslConfiguration = SslConfiguration.unconfigured();
HttpClientBuilder builder = HttpComponents.getHttpClientBuilder(options, sslConfiguration);
InstanceSupplier<ClientFactoryWrapper> supplier = context ->
new ClientFactoryWrapper(new HttpComponentsClientHttpRequestFactory(builder.build()));
SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(ClientFactoryWrapper.class, supplier));
- Vault 연결 방식을 제어 가능
- ✅ 커넥션 타임아웃, SSL 설정, 프록시 설정 가능
커스터마이징) RestTemplateBuilder
더보기
InstanceSupplier<RestTemplateBuilder> supplier = context -> {
return RestTemplateBuilder
.builder()
.requestFactory(context.get(ClientFactoryWrapper.class).getClientHttpRequestFactory())
.defaultHeader("X-Vault-Namespace", "my-namespace");
};
SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(RestTemplateBuilder.class, supplier));
- 커스텀 헤더 추가 가능
- Namespace 헤더 지정 가능
2. Authentication methods
Token
- Vault의 기본 인증 방식
- ✅ 애플리케이션이 고정 토큰을 설정으로 넘겨 Vault에 접근함
- ✅ 설정에 토큰이 없으면, ~/.vault-token 파일에서 토큰을 찾아 쓰려 시도함
- ⚠️ 토큰이 유출되면 권한 안에서 secrets에 접근이 가능
설정) application.yml
더보기
spring:
cloud:
vault:
authentication: TOKEN # 인증 방식: 토큰
token: 00000000-0000-0000-0000-000000000000 # 사용할 고정 토큰
AppRole
- Vault에서 머신/애플리케이션 인증을 위해 사용되는 방법
3. Secret Backends
Key-Vaule Backend
- application 이름 + active profile을 조합해 vault의 secret 경로를 탐색함
- vault에 저장된 키는 그대로 Spring Property로 노출됨
기본 조회 경로
더보기
/secret/{application}/{profile}
/secret/{application}
/secret/{default-context}/{profile}
/secret/{default-context}
출처