티스토리 뷰

반응형

또 하나의 프로젝트가 끝나가고.. 보안 취약점 점검을 받게 되는데......

프로퍼티 파일에 DB Connection을 위해 접속 계정을 명시한 것이 걸렸다.

 

Jasypt를 이용하여 프로퍼티 암호화 적용하였는데, 그 방법을 정리하고자 한다.

 

 

1. Maven 의존성 추가

        <!-- Properties Encryption -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>

- maven 을 사용하고 있기에 아주 심플하게 의존성을 추가할수 있었다.

*아래 블로그에서 버전 3 이상에서는 오류가 있다고 하길래 안전하게 버전 2.1.2로 사용하였다.

https://velog.io/@ssol_916/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-Jasypt-%EC%A0%81%EC%9A%A9%EA%B8%B0-2-

 

 

2. JasyptConfig Class 작성,  Main  클래스 어노테이션 추가

@Configuration
public class JasyptConfig {

    @Value("${jasypt.encryptor.password}")
    private String encryptKey; // 암호화된 프로퍼틴 값 가져오기

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor(){
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();

        config.setPassword(encryptKey); // 암호화 키

        config.setAlgorithm("PBEWithMD5AndDES"); // 대칭암호화
        config.setKeyObtentionIterations("1000"); // 해싱을 반복할 횟수
        config.setPoolSize("1"); // Encryptor를 클론하여 가지고 있을 갯수
        config.setProviderName("SunJCE"); // Default 값
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // Salt를 생성하는 클래스
        config.setStringOutputType("base64"); // 인코딩 값
        encryptor.setConfig(config);

        return encryptor;
    }
}

- Jasypt 와 관련된  Config  를 작성한다.

 

@EnableEncryptableProperties //프로퍼티 암호화 명시
@SpringBootApplication
public class HeidiApplication {

	public static void main(String[] args) {
		SpringApplication.run(HeidiApplication.class, args);
	}

}

- 메인 클래스에서 어노테이션을 통해 프로퍼티 암호화를 명시한다.

 

3. 프로퍼티 암호화

1) 아래 사이트에서 평문을 암호화문으로 만든다.

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

2) 프로퍼티 파일에 암호화문을 넣는다.

##DB 연결정보
##spring.datasource.url=jdbc:mysql://localhost/test
##spring.datasource.username=dbuser
##spring.datasource.password=dbpass
##spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=ENC(암호화문)
spring.datasource.username=ENC(암호화문)
spring.datasource.password=ENC(암호화문)
spring.datasource.driver-class-name=ENC(암호화문)

3) Jasypt 암호화 키를 설정한다.

- 문자열을 PBEWithMD5AndDES 알고리즘으로 암호화하려면 암호화키가 필요하다. PBEWithMD5AndDES 가 Jasypt의 Defalut 알고리즘으로, 다른 알고리즘으로 위에 생성한 Config 파일에서 변경가능하다.

PBEWithMD5AndDES알고리즘은 양방향 알고리즘, 대칭키 사용으로 Key 는 하나만 정하면된다.

(양방향 알고리즘: 복호화가 가능한 알고리즘, 대칭키: 암호화와 복호화 키가 동일한 키)

##Jasypt
jasypt.encryptor.bean=jasyptStringEncryptor
jasypt.encryptor.password=${JASYPT_PASSWORD}
jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix=)
jasypt.encryptor.pool-size=1

프로퍼티 파일에 jasypt.encryptor.password 속성에 암호화키를 명시한다.

 

4. 암호화키 설정

암호화키는 평문으로 저장할수 밖에 없기에 분실하면 안되기도 하고 노출되지 않도록 관리해야한다.

로컬 개발환경에서는 IDE에 빌드시, 시스템 변수로 등록하고, 서버에서는 시스템변수로 등록하면된다.

예시로 인텔리제이와 Window 서버를 보겠다.

 

1) 인텔리제이에서 암호화키 설정

- Run - Edit Configurations... 클릭

- Environment variables에 프로퍼티 파일  jasypt.encryptor.password =${변수명}  로 작성했다면, "변수명=암호화키(평문)"을 입력하고 OK를 클릭하면된다.

- 그리고 Run을 해보면 설정한 암호화키를 이용하여 위에 명시했던 ENC() 내의 암호화문자열이 복호화 되며, 정상적으로 DB Connection이 수행된다.

2) Window 서버에서 암호화키 설정

인텔리제이에서 설정하는 것보다 더 쉽다.

Window서버에 시스템 환경변수(Window검색창에 시스템 환경변수 편집 검색한다. 안나오면 제어판에서 찾거나...내 PC>우클릭>속성에서 찾으면된다.) 에 그대로 변수명을 입력하고 암호화키를 입력하면 된다.

 

- 이렇게 해놓으면 나중에 Window서버 환경+Tomcat 환경에서 알아서 프로퍼티 파일에 환경변수가 매핑된다. 프로퍼티 파일에서 "${}" 문구가 시스템환경변수라는 의미임

 

 

 

여기까지 하면 프로퍼티 파일에서 DB 접속 비밀번호를 숨길수 있게 된다.

오퀘이 좋았어!

 

그럼 20000

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함