프로젝트를 진행하며 OAuth 2.0을 적용해 소셜 로그인을 적용했다. 이때 API호출에 대한 키와, 비밀번호가 필요한데, 이러한 설정 파일을 깃허브에 올리지 않고 협업하는 사람들과 어떻게 공유할 수 있을까에 대해서 고민하게 되었다. 그러던 중 vault라는것에 대해서 알게 되었고 vault를 이용해 보안상 중요한 데이터들을 관리해보게 되었다. vault를 처음 적용시키다 보니 많은 어려움을 겪었지만 적용시키는데 성공하였고 적용시키는 과정을 정리한 자료가 많지 않아 이를 정리해보고자 한다.
Vault란?
우선 적용하는 과정을 설명하기에 앞서 Vault가 무엇인지부터 알아보도록 해보자. 글의 첫부분을 읽으면 예상할 수 있듯이, vault란 문서와 파일을 저장하는 저장소로, ID기반 비밀 및 암호화 관리 시스템이다.
다음 Vault 공식문서를 통해 알 수 있듯이 Vault는 인증 및 권한 부여 방법으로 제어되는 암호화 서비스를 제공해준다.
자세한 기능은 아래 링크를 통해 보도록 하고 프로젝트에 Vault를 적용시켜보도록 해보자
https://developer.hashicorp.com/vault/docs/what-is-vault
프로젝트에 적용시키기
1. Vault를 다운받자 현재 내 컴퓨터는 윈도우 64비트 운영체제 이므로 다음의 사이트에서 내 환경에 맞는 버전을 설치했다. https://developer.hashicorp.com/vault/downloads
2. 풀고싶은곳에 압축을 푼 후 해당 경로로 cmd를 킨다. 나같은 경우는 다음과 같은 경로에 압축을 풀었다.
3. 그 후 해당경로내에 hcl파일을 만든 후 다음의 명령어로 서버러를 키면 된다. hcl에 대해 작성하는 방법은 다음의 사이트를 통해 알 수 있다. https://developer.hashicorp.com/vault/docs/configuration
나의 경우는 해당 경로에 vaultconfig.hcl이라는 이름의 파일로 만들었다.
storage "file" {
path= "./vault-data"
}
listener "tcp" {
address = "127.0.0.1:8200"
tls_disable =1
}
disable_mlock=true
만든 후에 cmd 창으로 돌아가 vault 서버를 키면 된다.
vault server -config ./vaultconfig.hcl
서버를 키면 다음과 같은 화면이 보일 것이다.
4. 새로운 cmd창을 열어 다음의 명령어를 통해 포트를 열어주고 서버를 열기위한 키를 초기화 시켜준다.(vault operator intit은 서버를 처음 열때만 초기화 해주면 됨)
set VAULT_ADDR=http://localhost:8200
vault operator init
5. 초기화가 완료되면 다음과 같은 화면이 뜰것이다.
6. 이떄 root token과 unsael key를 잘 기억하도록 하자. unseal-key 같은경우 잠겨있는 서버를 열때 사용되며 root token은 해당 서버에 관리자로 로그인할때 필요하다. 서버가 잠겨있는지 열려있는지는 다음의 명령어로 확인이 가능하다.
vault status
7. 다음의 명령어로 root-token으로 로그인 하도록 하자.
set VAULT_TOKEN=s.wO85qvAKuzL4QQifLE9N5aiq
8. 이때 5번의 과정에서 확인한 unseal키를 이용해 3번의 useal을 하여 서버의 잠금을 풀 수 있다.
vault operator unseal Y2fJhNi5AXU3HdShQ4p0bZ/KfXVWU3ZYRwaecnlkEYYP
vault operator unseal XS/NJF3X/OcrVzoM9a5oSG2D7Mls2+WCE104RgCAJLrH
vault operator unseal W+W/R7Dwgaj+qwPsrKo3RBDxSzrfoW917AwgoAzvFcOT
9. 이제 서버가 열리게 되었다. 그 이후 서버에 다음의 명령어를 사용해 데이터에 접근 가능하게 하거나 3에서 만든 hcl파일에 ui = true 옵션을 주어 http://localhost:8200에 직접 들어가 데이터를 넣을 수 있다.
vault secrets enable -path=secret/ kv
10. 이후 다음의 명령어를 통해 키 값 형태의 데이터를 넣을 수 있다.
vault kv put secret/javainuseapp dbusername=root
vault kv put secret/javainuseapp dbpassword=root
vault kv put secret/${만들고 싶은 경로 이름} 데이터의 키=데이터의 값의 문법으로 이루어져 있다.
11. 다음 하고있는 프로젝트에 들어가 bootstrap.yml파일을 다음과 같이 생성한다.
spring:
application:
name: javainuseapp //10에서 만든 경로 이름이다.
cloud:
vault:
host: localhost
port: 8200
scheme: http
token: s.wO85qvAKuzL4QQifLE9N5aiq //5의 화면에서 볼 수 있는 root token의 값이다.
12. 그 후 설정파일에 다음과 같이 데이터를 접근할 수 있다.
spring.datasource.username=${dbusername} //10에서 생성한 데이터의 키
spring.datasource.password=${dbpassword}
13. vault 서버 접속과 bootstrap 활성화를 위해 maven repostiory에서 본인의 환경에 맞는 설정을 build.gradle이나 pom.xml에 추가해준다. https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap/4.0.0
https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-vault-config/4.0.0
위와 같은 과정으로 프로젝트에서 vault서버에 접속하게 되었다. 이를 통해 .gitignore에 설정 파일을 올리지 않아도 되며 보안 값들이 안전하게 보관시킬 수 있게 되었다. 본인의 경우 docker에서 vault 컨테이너를 만들어 서버를 띄웠는데 이 또한 위의 과정과 비슷하다.
'프로젝트 > 고민' 카테고리의 다른 글
팩토리 메소드 패턴으로 리팩토링 (0) | 2023.03.01 |
---|---|
낙관적 락을 적용하여 동시성 문제 해결하기 (0) | 2023.02.21 |
프로젝트를 시작하며(docker) (1) | 2023.01.09 |
프로젝트를 시작하며(branch 전략) (0) | 2023.01.04 |
프로젝트를 시작하며(merge 전략) (0) | 2023.01.04 |