본문 바로가기

프로그래밍 언어/JAVA(JSP, Spring)

[Spring Boot] Jasypt를 이용한 application.yaml 암호화 적용 (ISMS 대응)

728x90
반응형

운영 중 ISMS 심사 대응을 위해 application.yaml에 저장된 인증정보 암호화 작업을 진행했다.

기존에는 인증 계정, 업체 식별 정보 등이 설정 파일에 평문으로 저장되어 있었다.

auth:
  id: admin
  pw: password

ISMS 관점에서는 중요 정보가 평문으로 저장되어 있으면 안 되며, 암호화된 정보와 복호화 키 또한 분리 관리되어야 한다.

즉,

  • 인증정보는 암호화 저장
  • 복호화 키는 소스 또는 설정 파일에 저장 금지
  • 암호문과 복호화 키를 별도 관리

구조를 갖춰야 한다.


적용 방식

Jasypt를 활용하여 설정 파일에는 암호문만 저장하고, 복호화에 필요한 마스터 키는 실행 환경에서 주입하도록 구성했다.

application.yaml
      ↓
ENC(암호문)
      ↓
Jasypt
      ↓
환경변수 또는 외부 설정
      ↓
복호화
      ↓
Spring Bean 주입

설정 파일이 유출되더라도 마스터 키가 없으면 복호화할 수 없는 구조다.


적용 내용

1. 의존성 추가

implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'

2. 암호화 대상 선정

인증 연동에 사용되는 주요 값을 암호화 대상으로 지정했다.

  • id
  • pw

3. 값 암호화

Jasypt CLI를 사용하여 암호문 생성

java -cp jasypt-1.9.3.jar \
org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \
input='평문값' \
password='마스터키' \
algorithm=PBEWITHHMACSHA512ANDAES_256 \
ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator

암호화 결과는 다음과 같이 적용했다.

auth:
  id: ENC(...)
  pw: ENC(...)

동일한 값을 암호화하더라도 랜덤 IV가 적용되기 때문에 매번 다른 암호문이 생성된다.


4. Jasypt 설정

jasypt:
  encryptor:
    algorithm: PBEWITHHMACSHA512ANDAES_256
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator

암호화와 복호화 시 동일한 알고리즘을 사용해야 한다.


5. 마스터 키 외부 주입

마스터 키는 소스코드나 설정 파일에 저장하지 않는다.

로컬 개발 환경

export JASYPT_ENCRYPTOR_PASSWORD=마스터키

또는

./gradlew bootRun \
--args='--jasypt.encryptor.password=마스터키'

운영 환경

export JASYPT_ENCRYPTOR_PASSWORD='마스터키'

운영 서버에서는 zcode.conf에서 관리하고 서비스 기동 시 자동으로 로드하도록 구성했다.


6. 코드 적용

Jasypt가 애플리케이션 시작 시 자동으로 복호화를 수행하므로 기존 코드 수정은 최소화할 수 있었다.

@Value("${auth.id}")
private String authId;

@Value("${auth.pw}")
private String authPw;

실제 SOAP 호출 시 요청값이 없는 경우 복호화된 기본 인증값을 사용하도록 처리했다.


작업 중 발생한 이슈

1. zsh 암호화 명령 실행 오류

zsh: no such event

 

원인

암호 또는 입력값에 포함된 ! 문자를 zsh가 히스토리 확장 문자로 인식

 

 

해결

password='마스터키'

작은따옴표로 감싸서 실행


2. ENC 적용 후 서버 기동 실패

jasypt.encryptor.password must be provided

 

원인

암호문은 존재하지만 복호화 키가 전달되지 않음

 

 

해결

환경변수 또는 실행 인자를 통해 마스터 키 전달

결과적으로 암호화가 정상 적용되었음을 확인할 수 있었다.

01
복호화 명시해주기.


3. Gradle Build 실패

contextLoads() failed

원인

테스트 컨텍스트에서도 ENC 값을 읽으며 복호화를 시도

 

 

해결

./gradlew build -x test

또는

  • 테스트용 환경변수 주입
  • 테스트 전용 설정 분리

4. 로그 중복 적재

원인

  • service.sh 로그 파일
  • logback FILE Appender

두 곳에서 동일 파일에 기록

 

 

해결

FILE Appender 제거 후 CONSOLE 출력만 유지

service.sh 로그로 일원화


정리

이번 작업의 핵심은 단순히 값을 암호화하는 것이 아니라, 암호문과 복호화 키를 분리 관리하는 구조를 만드는 것이었다.

설정 파일에는 암호문만 저장하고, 마스터 키는 운영 환경에서 외부 주입하도록 구성함으로써 ISMS 요구사항을 충족할 수 있었다.

결과적으로 기존 기능 변경 없이 보안 수준을 향상시키고, 설정 파일 유출 시에도 인증정보가 노출되지 않는 구조를 적용할 수 있었다.

반응형