저번에 Config Server 암호화를 통해 Spring Cloud Config Server에 암호화를 적용하였습니다.
하지만 몇 가지 의문이 생겼습니다. 암호화를 적용했음에도 민감한 설정 값들이 충분히 안전하게 보호되고 있는가? 예를 들어, Config Server가 설정 파일을 복호화한 상태로 제공하면, 서버가 노출될 경우 민감한 정보도 그대로 노출될 위험이 있습니다. 또한 /decrypt
API를 통해 암호화된 값을 복호화할 수 있다면, 외부에서 이를 악용할 가능성도 존재합니다.
이 글에서는 이러한 의문점들을 구체적으로 살펴보고, 이를 해결하기 위한 보안 설정과 방법들을 다루겠습니다. 이를 통해 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}
)이 그대로 클라이언트 애플리케이션에 전달됩니다./decrypt
API를 통한 민감 정보 노출Config Server는 /decrypt
API를 통해 암호화된 데이터를 복호화할 수 있습니다. 이 API가 외부에 노출되면, 공격자가 암호화된 값을 복호화하여 민감한 정보를 유출할 가능성이 있습니다.
Spring Security를 활용하여 /decrypt
API에 접근 제한을 적용하거나, 필요에 따라 완전히 비활성화합니다.
build.gradle
에 Spring Security 의존성을 추가합니다.
Gradle
implementation 'org.springframework.boot:spring-boot-starter-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 인증
}
}
Spring Security의 기본 사용자 인증을 설정합니다. 아래 코드를 application.yml
에 추가합니다.
spring:
security:
user:
name: admin
password: strongpassword
curl -u admin:strongpassword -X POST http://localhost:8888/decrypt -d "{cipher}..."
/decrypt
API를 사용할 수 있습니다.