Spring .yml 환경변수 암호화

winkite·2024년 10월 14일
0

정리

목록 보기
7/7

구글의 smtp 사용해서 인증번호 메일을 보내는 기능을 사용하고 있었는데
그냥 간단한 사이드 프로젝트라서 .yml의 환경변수들을 그대로 노출시켜 2달정도 사용하고 있었다
(아이디, 앱 비밀번호 모두!..)

근데 어느 순간 해당 계정으로 메일이 계속 오는데 'OOO@asdf.com 으로 메일 전송에 실패했습니다 ~ ' 라길래 그냥 다른 개발자분이 계속 테스트하고 계신 줄 알고 넘어갔다

다음날 해당 계정이 정지되었다는 알림을 보고 뭔가 잘못됐다 싶어 바로 로그인해봤지만 역시 정지되었다!!

계정이 Google Workspace 정책을 위반하는 방식으로 사용된 것으로 보입니다. 위반의 예에는 스팸을 전송하거나 모든 유형의 사기 행위에 계정을 사용하는 것이 포함됩니다. 추가 지원이 필요한 경우 관리자에게 문의하세요.


내 계정 돌려줘!!!!


하필 해당 계정이 학교계정이라 학교에 문의했는데 다행히 이번 한 번만 풀어주신다고 하셨다
그래서 급하게 환경변수 암호화를 진행해보려고 한다.

처음엔 간단하게 .env 파일로 관리할까 생각했지만 혹시나 잘못돼서 내 계정이 또 노출되면 큰일나니까
확실하게 암호화해서 관리하는게 낫다고 생각해 Jasypt를 사용하기로 했다.

  1. 라이브러리 적용을 위한 의존성 추가
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
  1. application.yml에 jasypt 속성 추가
#application.yml
jasypt:
	encryptor:
		algorithm: PBEWithMD5AndDES #알고리즘
       	iv-generator-classname: org.jasypt.iv.NoIvGenerator #대칭키 암호화 작업 중 필요한 class명
        password: ${jasypt.encryptor.password} #환경변수 설정
  1. Config 클래스 생성
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JasyptConfig {
	
	@Value("${jasypt.encryptor.password}")
	private String ENC_KEY;
	
	@Bean("JasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        
        config.setPassword(ENC_KEY);
        config.setPoolSize(1);
        
        encryptor.setConfig(config);
        return encryptor;
    }
}
  1. https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
    에 접속해서 암호화된 값을 구한다.

  2. application.yml의 환경변수 값에 ENC(암호화된 값)으로 바꿔주면 된다.

mail:
	password: ENC(uyvksy9436H5P0mxFwq8nXoVNrYXYY2v)

마지막으로 가장 중요한 키 값!
${jasypt.encryptor.password}이 키 값으로 ENC()를 복호화하기 때문에 해당 키 값도 적어줘야하지만 .yml 파일에 그대로 적어버리면 암호화하는 의미가 없다!

그렇다면 키 값을 어디다 저장해야할까

  • local
    sts기준으로 설명하면 Run > Run Configurations 로 가서
    내 프로젝트 > Arguments > Vm arguments

-Djasypt.encryptor.password=[비밀 키]

  • 외부 서버를 톰캣으로 올린 경우
    /tomcat/bin 폴더로 이동해서 setenv.sh 파일을 만들어 다음과 같이 저장하면된다.
export JAVA_OPTS="-Djasypt.encryptor.password=[비밀 키]"

/tomcat/bin/catalina.sh 파일을 보면 setenv.sh 파일을 읽는 부분이 있다.


다행히 암호화 적용 이후로는 이상한 메일이 오거나 보내지진 않는다..
모르는 계정으로 수백개의 메일이 보내져있었다

앞으로는 개발할 때 개인정보나 환경변수를 아주 조심히 다뤄야겠다고 몸소 느꼈다.
미연에 방지했으면 더 좋았겠지만^^ 뼈저린 경험을 얻었으니 앞으로 조심하도록 하자.

profile
열심히 뛰는 개발자🏃

0개의 댓글