MSA 구축 (6) - 암호화된 설정 파일 보호와 /decrypt API 접근 제어

오형상·2024년 11월 23일
0

Ficket

목록 보기
6/27
post-thumbnail

저번에 Config Server 암호화를 통해 Spring Cloud Config Server에 암호화를 적용하였습니다.

하지만 몇 가지 의문이 생겼습니다. 암호화를 적용했음에도 민감한 설정 값들이 충분히 안전하게 보호되고 있는가? 예를 들어, Config Server가 설정 파일을 복호화한 상태로 제공하면, 서버가 노출될 경우 민감한 정보도 그대로 노출될 위험이 있습니다. 또한 /decrypt API를 통해 암호화된 값을 복호화할 수 있다면, 외부에서 이를 악용할 가능성도 존재합니다.

이 글에서는 이러한 의문점들을 구체적으로 살펴보고, 이를 해결하기 위한 보안 설정과 방법들을 다루겠습니다. 이를 통해 Config Server를 더욱 안전하게 사용하고 민감한 정보를 보호하는 방법을 알아보겠습니다.


문제점 1: Config Server에서 복호화된 설정 파일 제공

Config Server는 기본적으로 클라이언트 애플리케이션에게 복호화된 설정 파일을 전달합니다. 이는 Config Server 자체가 노출될 경우, 민감한 정보가 외부에 유출될 가능성을 초래할 수 있습니다.

해결 방안: 암호화된 상태로 설정 파일 제공

Spring Cloud Config Server는 설정 파일을 암호화된 상태로 제공하는 기능을 지원합니다. 이 설정을 통해 민감한 값이 클라이언트 애플리케이션에 복호화되지 않은 상태로 전달되도록 설정할 수 있습니다.

Config Server의 bootstrap.yml 파일에 다음 설정을 추가합니다:

spring:
  cloud:
    config:
      server:
        encrypt:
          enabled: false
  • encrypt.enabled: false: Config Server가 클라이언트에 설정 파일을 전달할 때 암호화된 상태({cipher} 형식)로 제공합니다.

결과

  • 설정 파일의 암호화된 값({cipher})이 그대로 클라이언트 애플리케이션에 전달됩니다.


문제점 2: /decrypt API를 통한 민감 정보 노출

Config Server는 /decrypt API를 통해 암호화된 데이터를 복호화할 수 있습니다. 이 API가 외부에 노출되면, 공격자가 암호화된 값을 복호화하여 민감한 정보를 유출할 가능성이 있습니다.

해결 방안: Spring Security를 사용한 API 보호

Spring Security를 활용하여 /decrypt API에 접근 제한을 적용하거나, 필요에 따라 완전히 비활성화합니다.

Spring Security 설정 방법

1. Spring Security 의존성 추가

build.gradle에 Spring Security 의존성을 추가합니다.

Gradle

implementation 'org.springframework.boot:spring-boot-starter-security'

2. Spring Security 설정 클래스 작성

인증 기반 접근 허용

아래 코드를 사용하여 /decrypt/encrypt API를 인증된 사용자만 접근할 수 있도록 설정합니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .antMatchers("/encrypt", "/decrypt").authenticated() // 인증 필요
                .anyRequest().permitAll()
            .and()
            .httpBasic(); // HTTP Basic 인증
    }
}

3. 사용자 인증 정보 추가

Spring Security의 기본 사용자 인증을 설정합니다. 아래 코드를 application.yml에 추가합니다.

spring:
  security:
    user:
      name: admin
      password: strongpassword

4. 테스트

인증 테스트 (실패)

인증 테스트 (성공)
curl -u admin:strongpassword -X POST http://localhost:8888/decrypt -d "{cipher}..."

  • 인증 정보를 제공하면 /decrypt API를 사용할 수 있습니다.

0개의 댓글