[Spring] Vault란? SpringBoot 3.0 설정법

Coodori·2023년 3월 16일
0

CherishU

목록 보기
4/29

Vault란?

Vault는 HashiCorp에 의해서 개발된 크로스플랫폼 패스워드 및 인증 관리 시스템이다. 공개되면 안되는 비밀번호, API 키, 토큰 등을 저장하고 관리한다.

https://www.vaultproject.io/ 에서 개발했다.

사용 이유

사용자명, 엔드포인트, 비밀번호, 포트 등 중요한 정보를 형상관리툴에 노출시키지 않게 하기위하여 사용한다.

Spring 과 Vault

spring cloud 에서 공식적으로 vault 연결해주는 dependency를 제공해준다.
https://spring.io/guides/gs/vault-config/

Vault설정

org.springframework.cloud:spring-cloud-starter-vault-config 가 있고
springframework-vault-core 가 따로 있지만 해당 포스팅에서는
최근 공식문서에서 소개한 전자로 진행했습니다.

Vault 설치

$ brew install vault

Server 실행

$ vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000" # vault 서버 실행

확인
localhost:8200

루트 토큰 아이디 접속하면

추가로
관리가 가능한 어드민 창이 나오고 해당 창에서 오른쪽 위에 Command Line을 사용할 수 있다.
해당 커맨드 라인을 사용해서 정책에 맞는 역할키와 시크릿키 발급 가능하다.

만약 Get "https://127.0.0.1:8200/v1/sys/internal/ui/mounts/secret/application/db": http: server gave HTTP response to HTTPS client 이러한 에러가 발생하였을 경우

$ export VAULT_ADDR='http://localhost:8200'

key 값을 만들어줘야한다.

  • 생성
	$ vault kv put secret/application username=coodori password=1234 # key, vaule 생성
  • 확인
    $ vault kv get secret/application # path 으로 key, vaule 조회 

Spring Vault값 받아오기

Spring 환경 : Gradle, Java version 17 이상

  1. build.gradle에 추가

ext {
    set('springCloudVersion', "2022.0.0-RC3")
}


repositories {
    mavenCentral()
    maven {
        url "https://repo.spring.io/milestone/"
    }
}

dependencies {
	...
	implementation 'org.springframework.cloud:spring-cloud-starter-vault-config'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}
  1. 설정값 받아올 클래스 생성
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties() 
public class MyConfiguration {

    private String username;

    private String password;

}

여기서 vault에 키를 넣을 때 example.username이 아닌 username 으로 넣었다. 그래서 공백으로 처리했다.

더 좋은 방법

@Getter
@ConfigurationProperties()
public class MyConfiguration {

    private final String username;

    private final String password;

    public MyConfiguration(String username, String password) {
        this.username = username;
        this.password = password;
    }
}

username 과 password는 변경되지 않는 값이니 setter를 닫고
@ConfigurationProperties()는 생성자 주입이 가능하니 해당 기능을 사용하는 것이 좋을 듯 하다.

  1. yml 설정
spring:
  application:
    name: application // secret 뒤의 값
  cloud.vault:
  cloud:
    vault:
      token: 00000000-0000-0000-0000-000000000000
      scheme: http
      host: localhost // 기본값
      kv:
        enabled: true // 기본값
  config:
    import: vault://

기본값이긴하지만 이후 ec2에 올린 vault 값을 받아올 것이기 때문에 옵션을 미리 찾아봤다.

  1. Test
@Slf4j
@SpringBootApplication
@EnableConfigurationProperties(MyConfiguration.class) //추가
public class VaultApplication {

	private final MyConfiguration myConfiguration;

	public VoultApplication(MyConfiguration myConfiguration) {
		this.myConfiguration = myConfiguration;
	}

	public static void main(String[] args) {
		SpringApplication.run(VaultApplication.class, args);
	}
	// 테스트
	@PostConstruct
	public void run(){
		log.info("username = {}",myConfiguration.getUsername());
		log.info("password = {}", myConfiguration.getPassword());
	}

}

@Slf4j로 테스트를 진행했다.
@PostConstruct를 활용하여 빈 주입이 완료되면 실행하도록 했다.
추가로
@EnableConfigurationProperties(MyConfiguration.class)를 추가해주어야 해당 클래스에 설정값 주입이 된 값을 사용할 수 있다.

결과

성공적으로 username 과 password를 불러왔다.

Reference

https://spring.io/guides/gs/vault-config/
https://mungmange.tistory.com/135

profile
https://coodori.notion.site/0b6587977c104158be520995523b7640

0개의 댓글