JVM/SpringCloud

Spring Cloud Config Server의 암호화

kyoulho 2023. 12. 30. 15:53

Config Server의 암호화


설정 정보를 평문으로 관리하는 것은 보안 문제를 일으킬 우려가 있다. Spring Cloud Config Server는 암호화된 프로퍼티 값을 제공하기 위해 대칭 키 또는 비대칭 키를 사용할 수 있다.
 

 

대칭키를 이용한 암호화


 

 동일한 키를 암호화와 복호화에 사용하는 방식으로 처리 속도가 빠르다는 장점이 있지만 키 교환의 어려움과 키 관리의 문제가 있다.

 

라이브러리

implementation("org.springframework.cloud:spring-cloud-starter-bootstrap")

bootstrap.yml

encrypt:
  key: abcdefghijklmnopqrstuexyz1234567890

 

bootstrap.yml 이란?
부트스트랩 단계에서 사용되는 설정 파일로, 애플리케이션이 구동되기 전에 사용자 정의 프로퍼티 소스를 구성하는 데 사용될 수 있다. 주로 외부 설정 서버와의 연동, 보안 설정, 암호화 키, 프로파일 등 초기화에 필요한 중요한 설정을 담는다. 부트스트랩 프로세스는 외부 설정 서버와의 통신, 프로필 활성화, 로깅 설정 등을 수행한다.

 

암복호화 엔드포인트

${서버도메인}/encrypt로 Text 데이터를 전송하면 암호화된 키를 응답한다. ${서버도메인}/decrypt로 복호화할 수 있다.

 
 

user-service.yml

암호화해서 데이터를 저장하면 사용될 때 config server가 복호화한다

  1 spring:
  2   datasource:
  3     url: jdbc:h2:mem:testdb
  4     username: sa
  5     password: '{cipher}a2a2810d9c6549f21d4c74ff9a13d124a6f29ed65cd448b84ee4406213ca3495'
// http://localhost:8888/user-service/default

{
  "name": "user-service",
  "profiles": [
    "default"
  ],
  "label": null,
  "version": "56b5cfea7180c29a0e58f37179909c5e8096fc0f",
  "state": null,
  "propertySources": [
    {
      "name": "file://Users/kyoulho/msa-study/git-local-repo/user-service.yml",
      "source": {
        "spring.datasource.url": "jdbc:h2:mem:testdb",
        "spring.datasource.username": "sa",
        "spring.datasource.password": "sa"
      }
    }
  ]
}

 

비대칭키를 이용한 암호화


암복호화에 서로 다른 키를 사용하는 방식으로 키 관리의 장점이 있지만 대칭키 방식에 비해 처리 속도가 느리다.

비대칭키 생성

$ keytool -genkey -alias apiEncryptionKey -keyalg RSA \
-dname "CN=kyoulho, OU=API Development, O=kyoulho.co.kr, L=Seoul, C=KR" \
-keypass "123456" -keystore apiEncryptionKey.jks -storepass "123456"
  • keytool: Java의 키 및 인증서 관리 도구인 keytool을 실행
  • -genkey: 새로운 키 페어를 생성하는 옵션
  • -alias apiEncryptionKey: 키 페어의 별칭(alias)을 apiEncryptionKey로 설정
  • -keyalg RSA: 키 페어의 알고리즘을 RSA로 설정
  • -dname "CN=kyoulho, OU=API Development, O=kyoulho.co.kr, L=Seoul, C=KR": 디지털 인증서에 포함될 사용자 정보(Subject Distinguished Name)를 설정, Common Name(CN), Organizational Unit(OU), Organization(O), Locality(L), Country(C) 등을 설정
  • -keypass "123456": 개인 키의 비밀번호를 123456로 설정
  • -keystore apiEncryptionKey.jks: 키 저장소 파일의 이름을 apiEncryptionKey.jks로 설정
  • -storepass "123456": 키 저장소의 비밀번호를 123456로 설정
keytool은 Java 플랫폼에서 제공하는 명령줄 도구로, 주로 Java Keystore를 관리하고, 키 쌍을 생성하며, 디지털 인증서를 관리하는 데사용된다. 

 

bootstrap.yml

encrypt:
  key-store:
    location: file://${user.home}/Desktop/msa-study/apiEncryptioniKey.jks
    alias: apiEncryptionKey
    # 키 저장소 비밀번호
    password: 123456
    # 개인키 비밀번호
    secret: 123456
728x90