如何保护 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配置集中管理

:初探Spring Cloud Config配置集中管理

Spring Cloud Config 未解密配置服务器密码

如何获取 Spring-Cloud-Config-Server 管理的文件列表

Spring Cloud 如何搭建Config

如何使用 spring-cloud-starter-config 传递 X-Config-Token