본문 바로가기
개발/Spring Cloud

[Spring Cloud] Config Server 설정 정보의 암호화 처리

by baau 2023. 6. 20.

Spring Cloud Config 공식 문서에서 Features를 보면, Encrypt와 Decrypt를 지원한다.

https://spring.io/projects/spring-cloud-config

  • 각 마이크로 서비스에서 중요한 설정 정보는 보안에 민감한 정보들이 많다.
  • ex) 데이터베이스 암호, API 키, JWT의 Secret Key와 같은 사용자 인증 정보 등
  • 따라서 설정 정보에 보안에 민감한 정보를 저장할 때는 암호화를 하여 저장하는 것이 매우 중요하다.

Spring Cloud Config의 Encrypt와 Decrypt를 사용하여 설정 정보를 안전하게 저장하는 방법에 대해서 알아보자.

 

 

대칭키 암호화(symmetric) & 비대칭키 암호화(asymmetric)

  • 대칭키 암호화
    • 암호화와 복호화에 동일한 키를 사용하는 방식
    • 주요 알고리즘으로는 DES(Data Encryption Standard), AES(Advanced Encryption Standard) 등이 있다.
    • 키가 유출되면 암호화된 데이터가 해독될 수 있기 때문에 키를 안전하게 공유하는 것이 중요하다. 
    • 계산 속도가 빠르고 효율적이지만, 보안성 문제가 있을 수 있다.
    • 대량의 데이터를 암호화할 때 주로 사용한다.
  • 비대칭키 암호화
    • 암호화와 복호화에 서로 다른 키 쌍을 사용하는 방식
    • 공개키(public key)개인키(private key)로 구성
    • 공개키는 누구에게나 공개될 수 있지만, 개인키는 키의 소유자만 알고 있어야 한다.
    • 공개키로 암호화된 데이터는 개인키로만 복호화할 수 있다.
    • 주요 알고리즘으로는 RSA(Rivest-Shamir-Adleman), ECC(Elliptic Curve Cryptography) 등이 있다.
    • 계산 속도는 느리지만, 대칭키 암호화 방식보다 복잡하여 주로 키 교환 및 인증, 전자 서명 등에 사용된다.

 

설정 정보 암호화 하기

  • Remote Git Repository 혹은 다른 저장소에 설정정보를 저장할 때 암호화해서 저장한다.
  • Config Server는 각 Micro Service에게 설정정보를 전달할 때 복호화하여 전달한다.

출처 : https://www.inflearn.com/course/스프링-클라우드-마이크로서비스/dashboard

 

Symmetric Encryption

Config Server 의존성 주입

implementation 'org.springframework.cloud:spring-cloud-config-server'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'

 

Config Server의 boostrap.yml 작성

encrypt:
  key: abcdefg1234567890abcd

암호화 때 사용할 키를 지정한다. 실제 대칭키는 누출되면 해당 키를 알고 있는 사람이 암호화된 정보를 복호화할 수 있기 때문에 외부에 노출되어 있으면 안 된다. 따라서 환경 변수, 암호화 키 관리 시스템, 보안 저장소 등과 같은 안전한 저장소에 저장해야 한다.

예시는 편의상 Plain Text로 작성하였다.

 

Symmetric Encryption & Decryption 실행

1) 암호화 

  • HTTP Method : POST
  • Request URI : "{Config Server URI}/encrypt"
  • Request Body : 암호화할 데이터

2) 복호화

  • HTTP Method : POST
  • Request URI : "{Config Server URI}/decrypt"
  • Request Body : 복호화할 데이터

 

Micro Service의 중요 설정 파일 암호화

  • Micro Service의 중요 설정 파일을 Config Server가 암호화하여 관리하기 위해
  • 중요 설정 파일을 Config Server가 읽어오는 저장소로 옮긴다.

  • Postman으로 구한 암호화된 텍스트를 복사해서 Config Server가 읽어올 설정파일에 붙여 넣는다.
  • 암호화된 데이터를 설정 파일에 저장할 때는 위와 같이 '{cipher}암호화된텍스트' 형식을 맞추어 저장해야 encrypt 된 Text로 인지할 수 있다.
    • 암호화된 Text를 수정하면 복호화할 수 없기 때문에 '<n/a>'로 읽어오게 된다.
    • {cipher}를 명시하지 않으면, 암호화된 Text를 단순 Text로 인식하여 읽어온다.
  • Config Server가 설정정보를 읽어오면, 암호화된 데이터를 Decrypt 하여 각 Micro Service에게 전달한다.

 

Asymmetric Encryption

Config Server 의존성 주입

implementation 'org.springframework.cloud:spring-cloud-config-server'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'

 

JDK keytool을 사용하여 Public Key, Private Key 생성

1) PublicKey와 PrivateKey를 저장할 디렉터리 생성

 

2) keytool을 사용하여 RSA 키 쌍과 관련된 key-store 파일을 생성

keytool -genkeypair -alias apiEncryptionKey -keyalg RSA -dname "CN=Minnseng, 
OU=API Development, O=minnseong.com, L=Seoul, C=KR" -keypass "test1234" -keystore 
apiEncryptionKey.jks -storepass "test1234"
  • keytool : Java의 keytool 유틸리티 실행 명령어
  • -genkeypair : 공개키와 개인키를 생성하는 옵션
  • -alias : 생성할 키의 별칭을 지정하는 옵션, key-store에서 해당 키 쌍을 참조할 때 사용
  • -keyalg RSA : RSA 알고리즘을 사용하여 키 쌍을 생성하는 옵션
  • -dname : 인증서에 포함될 사용자의 정보를 지정하는 옵션
    • CN (Common Name), OU(Organizational Unit), O(Organization), L(Location), C(Country) 등의 정보가 포함
  • -keypass : 개인키의 암호 지정
  • -keystore : 생성할 key-store 파일의 경로와 이름을 지정하는 옵션
  • -storepass : key-store 파일 자체의 암호를 지정하는 옵션, key-stor 파일을 열거나 사용할 때 필요한 옵션

 

3) keytool 명령어

  • keytool -list -keystore apiEncryptionKey.jks -v
    • key-store 파일의 내용을 상세 보기
  • keytool -export -alias apiEncryptionKey -keystore apiEncryptionKey.jks -rfc -file t rustServer.cer
    • apiEncryptionKey.jks key-store 파일에서 apiEncryptionKey 별칭의 인증서를 추출하여 trustServer.cer라는 인증서 파일을 생성
    • 추출된 인증서는 인증서의 공개키 정보를 포함합니다
  • keytool -import -alias trustServer -file trustServer.cer -keystore publicKey.jks
    • trustServer.cer 인증서 파일을 사용하여 publicKey.jks key-store 파일에 공개키를 생성
    • 인증서 파일에서 추출된 공개키를 trustServer 별칭으로 저장
    • 생성된 publicKey.jks 파일은 다른 애플리케이션에서 인증서의 공개키를 사용

Public Key에 해당하는 publickey.jks & Private Key에 해당하는 apiEncryptionKey.jks & 인증서에 해당하는 trustServer.cer를 확인할 수 있다.

 

Config Server의 bootstrap.yml 작성

encrypt:
  key-store:
    location: file://${user.home}/keystore/apiEncryptionKey.jks
    password: test1234
    alias: apiEncryptionKey
  • location
    • key-store 파일의 경로와 이름 지정
    • ${user.home}은 Mac에서 사용자의 홈 디렉터리
  • password
    • key-store 파일 자체의 암호를 설정하는 부분
    • key-store 파일을 열거나 사용할 때 필요한 암호
  • alias
    • key-store 내에 저장된 키의 별칭

 

Asymmetric Encryption & Decryption 실행

1) 암호화 

  • HTTP Method : POST
  • Request URI : "{Config Server URI}/encrypt"
  • Request Body : 암호화할 데이터

2) 복호화

  • HTTP Method : POST
  • Request URI : "{Config Server URI}/decrypt"
  • Request Body : 복호화할 데이터

 

Micro Service의 중요 설정 파일 암호화

  • Micro Service의 중요 설정 파일을 Config Server가 암호화하여 관리하기 위해
  • 중요 설정 파일을 Config Server가 읽어오는 저장소로 옮긴다. Postman으로 구한 암호화된 텍스트를 복사해서 Config Server가 읽어올 설정파일에 붙여 넣는다.

  • 암호화된 데이터를 설정 파일에 저장할 때는 위와 같이 '{cipher}암호화된텍스트' 형식을 맞추어 저장해야 encrypt 된 Text로 인지할 수 있다.
    • 암호화된 Text를 수정하면 복호화할 수 없기 때문에 '<n/a>'로 읽어오게 된다.
    • {cipher}를 명시하지 않으면, 암호화된 Text를 단순 Text로 인식하여 읽어온다.
  • Config Server가 설정정보를 읽어오면, 암호화된 데이터를 Decrypt 하여 각 Micro Service에게 전달한다.