개발/etc

Vault

mungmang 2023. 2. 7. 00:33

✎ Vault 

API 을 μ‚¬μš©ν•˜μ—¬ 민감정보λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ‹œμŠ€ν…œ.

✱ 민감정보
λΉ„λ°€λ²ˆν˜Έ, 토큰, μΈμ¦μ„œ λ“±μ˜ μ•”ν˜Έν™” ν•΄μ•Όν•˜λŠ” μ–΄λ– ν•œ 것듀

https://www.vaultproject.io/ μ—μ„œ κ°œλ°œν•¨.

 

✎ Vault μ‚¬μš© 이유

ν”„λ‘œμ νŠΈ 내에 λ³΄μ•ˆμ μΈ μš”μ†Œλ₯Ό κ³ λ €ν•΄μ•Ό ν•˜λŠ” κ°’(계정 및 νŒ¨μŠ€μ›Œλ“œ = 민감정보 λ“±)듀을 HTTP API 톡신을 μ΄μš©ν•˜μ—¬ μ™ΈλΆ€(=git μ €μž₯μ†Œ λ“±)에 λ…ΈμΆœμ‹œν‚€μ§€ μ•Šμ€ μƒνƒœλ‘œ μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— λ³΄μ•ˆμ— νš¨μœ¨μ μž„.

 

 

✎ κ°„λ‹¨ν•˜κ²Œ μŠ€ν”„λ§λΆ€νŠΈ ν”„λ‘œμ νŠΈ μ—μ„œ μ‚¬μš©ν•΄λ³Έ Vault

1. Vault μ„€μΉ˜ 및 μ‹€ν–‰ 확인

$ brew install vault # vault μ„€μΉ˜
$ vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000" # vault μ„œλ²„ μ‹€ν–‰

☞ https://www.vaultproject.io/docs/commands/server μ— μžμ„Έν•œ μ„€λͺ…이 μžˆλ‹€.

λŒ€μΆ© μ΄λ ‡κ²Œ 뜸
http://localhost:8200 으둜 μ ‘μ†ν–ˆμ„ μ‹œ λ‚˜μ˜€λŠ” ν™”λ©΄


⁉️ λ§Œμ•½ 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'

 

2. key/vaule 생성 및 확인

$ vault kv put secret/application username=mungmang password=12345 # key, vaule 생성

Key                Value
---                -----
created_time       2022-01-08T15:46:25.89734Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1
$ vault kv get secret/application # path 으둜 key, vaule 쑰회 

======= Metadata =======
Key                Value
---                -----
created_time       2022-01-08T15:46:25.89734Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1

====== Data ======
Key         Value
---         -----
password    12345
username    mungmang

☞ https://learn.hashicorp.com/collections/vault/getting-started 에 vault μ‚¬μš© 방법에 λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•΄μ€€λ‹€.

 

3. SpringBoot project 에 vault 연동여뢀 적용

// build.gradle νŒŒμΌμ— μ•„λž˜μ˜ 정보 μΆ”κ°€

ext {
    ...
    set('springCloudVersion', "2021.0.1-SNAPSHOT")
}

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

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}
// application.yml에 μ•„λž˜μ˜ λ‚΄μš© μΆ”κ°€
spring:
  config:
    import: vault:// 
  cloud:
    vault:
      uri: http://localhost:8200
      token: 00000000-0000-0000-0000-000000000000
      kv:
        backend: secret
        default-context: application #secret μ΄ν›„μ˜ 경둜

✱ 참고둜 Spring Cloude Vault 3.0 및 Spring Boot 2.4 이상에선 bootstrap.yml, bootstrap.properties κ°€ 더이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€κ³ ν•¨. 그리고  Spring Boot Config Data 접근방식을 μ‚¬μš©ν•˜λ €λ©΄ spring: config: import에 Vault μ‹œμŠ€ν…œμ„ 바인딩 ν•˜κΈ° μœ„ν•œ 속성 섀정이 ν•„μš”ν•¨. (Spring Boot 의 Config Data API
μ•„λ‹˜, application.yml에 spring:cloud:bootstrap:enabled: true or pom.xml or build.gradle νŒŒμΌμ— spring-cloud-starter-bootstrap import을 ν•˜μ—¬ bootstrap.yml 을 ν™œμ„±ν™”λ₯Ό ν•  수 있음.

☞ https://docs.spring.io/spring-cloud-vault/docs/current/reference/html/#client-side-usage μ— μžμ„Έν•œ μ„€λͺ…이 μžˆλ‹€.

 

// config νŒ¨ν‚€μ§€ 생성후 μ•„λž˜μ˜ 클래슀 생성 

@Getter
@Configuration
public class VaultData {

    @Value("${username}")
    private String username;

    @Value("${password}")
    private String password;
}
// 확인

@Slf4j
@SpringBootApplication
public class HelloApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext context = SpringApplication.run(HelloApplication.class, args);

        // vault ν…ŒμŠ€νŠΈ --
        VaultData vaultData = context.getBean(VaultData.class);
        log.info("username:{}", vaultData.getUsername());
        log.info("password:{}", vaultData.getPassword());
    }
}

 

 

 

end ~

'개발 > etc' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

SSE (Server Sent Event)  (1) 2023.08.20
ν—₯사고날 μ•„ν‚€ν…μ²˜ (Hexagonal Architecture)  (2) 2022.09.25
JWT (JSON WEB TOKEN)  (0) 2021.12.22
Rest API  (0) 2021.06.02
HTTPκ΄€λ ¨ (https, spdy, ajax, websocket)  (0) 2018.12.09