application.yml에서 노출되면 안되는 값을 암호화하자

 

현재 문제

 

  • aws 접근키와 oauth의 client-secret같이 중요한 값이 application.yml에서 노출될 수 있다.
  • 설정 파일을 이미 git에서 추적하고 있기 때문에 .gitignore에 추가하더라도 여러 개발 환경에서 의도치 않게 공개될 수 있다.
  • 멘토와 코드 리뷰를 진행하기 위해서 private repo를 public으로 수정하고 싶었으나, 과거 commit에서 설정 파일에 암호가 노출되기 때문에 수정할 수 없었다. 처음부터 중요한 값들은 암호화하여 저장할 필요가 있다.

 

해결방안

 

  • aws parameter store 서비스를 사용
  • jasypt 라이브러리 사용
  • vault 툴 사용

 

프로젝트 배포에서 gcp의 프로모션을 사용할 수 있기 때문에 우선 jasypt로 암호화하기로 결정했다.

참고로, 현업에서는 vault를 사용한다고는 하나 간단한 프로젝트에는 적합하지 않다고 판단했다.

 

구현

 

의존성 추가

 

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

 

JasyptConfig 클래스

@RequiredArgsConstructor
@EnableEncryptableProperties
@Configuration
public class JasyptConfig {

    private final Environment environment;

    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        String password = environment.getProperty("jasypt");

        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);

        return encryptor;
    }
}

 

암호화에 사용할 password가 노출되면 의미가 없으므로 환경변수로부터 받도록 설정한다.

환경변수 설정은 인텔리제이의 경우 아래처럼 run configuration에서 할 수 있다.

 

마지막으로 application.yml에 다음을 추가한다.

jasypt:
  encryptor:
    bean: jasyptStringEncryptor

 

이제 암호화하고자하는 값을 아래 사이트에서 encrypt하여 설정 파일에 넣는다.

이때, 암호화된 값을 ENC()으로 감싸주어야한다.

https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

 

Different Online Crypto Tools

A list of all the crypto tools around the web. Choose the tool that suits your requirement.

www.devglan.com

 

주의할 점

해당 라이브러리는 글을 쓰고 있는 시점 기준에서 최근 commit이 2년 전으로 실제 운영 단계에서 활용하기는 무리라고 생각한다.

보다 안전한 보안을 위해 구현이 어떻게 이루어지고 어떤 위험을 가지고 있는지 제대로 파악하고 사용해야함을 잊지 말자.