Spring Cloud Config 공식 문서에서 Features를 보면, Encrypt와 Decrypt를 지원한다.
- 각 마이크로 서비스에서 중요한 설정 정보는 보안에 민감한 정보들이 많다.
- 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에게 설정정보를 전달할 때 복호화하여 전달한다.
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에게 전달한다.
'개발 > Spring Cloud' 카테고리의 다른 글
[Spring Cloud] 마이크로서비스간 통신 (RestTemplate vs FeignClient) (0) | 2023.06.22 |
---|---|
[Spring Cloud] Config Server 구축하기 (busrefresh 하기) (1) | 2023.06.19 |
[Spring Cloud] Spring Cloud Gateway 구축하기 (0) | 2023.06.12 |
[Spring Cloud] Client Side Load Balancer & API Gateway 개념 정리 (0) | 2023.06.11 |
[Spring Cloud] Eureka Client 구축하기 (0) | 2023.06.05 |