如何保护 Spring Cloud Config Server
Posted
技术标签:
【中文标题】如何保护 Spring Cloud Config Server【英文标题】:How to Secure Spring Cloud Config Server 【发布时间】:2015-06-18 18:08:53 【问题描述】:我了解 Spring Cloud Config Server 可以使用用户名和密码进行保护,该用户名和密码必须由访问客户端提供。
如何防止客户端存储这些用户名和 客户端中 bootstrap.yml 文件中的明文密码 应用程序/服务?
【问题讨论】:
您可以尝试在 bootstrap.yml 中使用密码占位符,并将密码作为环境变量提及。 yathirigan 有没有达到这个朋友?如何?谢谢! 【参考方案1】:非常基本的“基本身份验证”(来自这里https://github.com/spring-cloud-samples/configserver)
您可以通过包含对 Spring Security 的额外依赖项来添加 HTTP 基本身份验证(例如,通过 spring-boot-starter-security)。用户名为“user”,密码在启动时打印在控制台上(标准 Spring Boot 方法)。如果使用 maven (pom.xml
):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
如果您想要自定义用户/密码对,您需要在服务器配置文件中注明
security:
basic:
enabled: false
并在您的代码中添加这个最小类 (BasicSecurityConfiguration.java
):
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
//@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class BasicSecurityConfiguration extends WebSecurityConfigurerAdapter
@Value("#'$qa.admin.password:admin'") //property with default value
String admin_password;
@Value("#'$qa.user.password:user'") //property with default value
String user_password;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
auth
.inMemoryAuthentication()
.withUser("user").password(user_password).roles("USER")
.and()
.withUser("admin").password(admin_password).roles("USER", "ACTUATOR");
@Override
protected void configure(HttpSecurity http) throws Exception
http
.csrf()
.disable()
.httpBasic()
.and()
.authorizeRequests()
.antMatchers("/encrypt/**").authenticated()
.antMatchers("/decrypt/**").authenticated()
//.antMatchers("/admin/**").hasAuthority("ROLE_ACTUATOR")
//.antMatchers("/qa/**").permitAll()
;
@Value("#'$qa.admin.password:admin'") 允许在属性配置文件、环境变量或命令行中定义密码。
例如(application.yml
):
server:
port: 8888
security:
basic:
enabled: false
qa:
admin:
password: adminadmin
user:
password: useruser
management:
port: 8888
context-path: /admin
logging:
level:
org.springframework.cloud: 'DEBUG'
spring:
cloud:
config:
server:
git:
ignoreLocalSshSettings: true
uri: ssh://git@gitlab.server.corp/repo/configuration.git
这对我有用。
编辑:不用Class,你可以直接把基本的用户配置放在application.yaml
:
security:
basic:
enabled: true
path: /**
ignored: /health**,/info**,/metrics**,/trace**
user:
name: admin
password: tupassword
对于 Spring Boot 2,application.yml 中的配置现在位于 spring.security.* (https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#security-properties) 下
spring.security:
basic:
enabled: true
path: /**
ignored: /health**,/info**,/metrics**,/trace**
user:
name: admin
password: tupassword
【讨论】:
客户端应该如何请求这些配置?谢谢。 我认为问题在于根本不将密码和用户名存储为明文,出于安全原因,我现在也发现了这一点。 你可以使用 org.springframework.security.crypto.factory.PasswordEncoderFactories.createDelegatingPasswordEncoder();和 org.springframework.security.crypto.password.PasswordEncoder.encode(password);以确保密码不会以简单的测试形式存储在内存中。【参考方案2】:适合我的基本身份验证配置。
服务器端:
需要依赖:org.springframework.boot:spring-boot-starter-security
bootstrap.yml
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: git@bitbucket.org:someRepo/repoName.git
hostKeyAlgorithm: ssh-rsa
hostKey: "general hostKey for bitbucket.org"
security:
user:
name: yourUser
password: yourPassword
客户端:
bootstrap.yml
spring:
application:
name: config
profiles:
active: dev
cloud:
config:
uri: http://localhost:8888
username: yourUser
password: yourPassword
management:
security:
enabled: false
来源:Spring doc security feautres、Spring cloud config client security
【讨论】:
嗨,一旦我添加了跟随我的客户端而不解析属性。有什么想法吗? 您好,不确定,可能只是无效的 .yml 格式(有时可能有点烦人)?可以发一些细节吗? 客户端和服务器都需要spring安全依赖吗?不能让它工作:/仍然是 unathoraized 嘿,应该只为配置服务器添加依赖项。您可以检查如果没有此依赖项,您是否能够在没有任何授权的情况下获取配置,如果这有效,请再次添加依赖项,尝试从浏览器获取配置,您应该重定向到 /login 页面。【参考方案3】:加密文本可以放在 bootstrap.yml 中。
检查 -> http://projects.spring.io/spring-cloud/spring-cloud.html#_encryption_and_decryption
【讨论】:
他问的不是这个。以上是关于如何保护 Spring Cloud Config Server的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Config 未解密配置服务器密码