在我的项目中,我计划在我的 spring cloud conifg 服务器设置中使用多个后端来存储不同的数据:使用 git 后端来存储非敏感数据,并使用Vault来存储密码/令牌等敏感数据。这与 https://content.pivotal.io/blog/spring-cloud-services-supports-vault-multiple-backends-use-the-right-config-repo-for-the-job 的建议类似。
我的问题是,由于从保管库返回的解密值通过配置服务器传回“客户端应用程序”,配置服务器将以任何方式缓存/存储/记录来自保管库的响应。如果这是真的,配置服务器将成为黑客的一个大目标,我们可能必须通过额外的配置来保护配置服务器。
我认为解决您问题的真正答案是保护堆栈的每一层,以防止任何单点的入侵。
Spring 文档没有明确提及缓存数据 - 所以在这方面你应该是安全的。对于配置服务器来说,缓存来自外部数据存储的配置也没有多大意义,因为它不是该数据的真实来源。我们希望它始终从源获取数据,以确保我们获得最新版本的数据。我认为可能存在缓存的情况如果配置服务器在本地存储配置并且能够观察文件的更改并相应地刷新其缓存。但话虽如此,我仍然不相信这一层缓存的好处。
从 Spring Cloud Config Server 的个人使用来看,我还没有看到它注销整个配置;事实上,它一开始只记录很少的内容。我确信您可以通过设置适当的级别来进一步抑制日志记录。您还应该考虑使用 SSL 保护 Vault & Config Server 以及 Config Server 与每个应用程序之间的连接。这将阻止您以明文形式传输数据,并为您提供额外的安全层。
public class NoSessionManager implements SessionManager {
private final ClientAuthentication clientAuthentication;
public NoSessionManager(ClientAuthentication clientAuthentication) {
this.clientAuthentication = clientAuthentication;
}
@Override
public VaultToken getSessionToken() {
return clientAuthentication.login();
}
}
在 Spring 配置中添加此类
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.vault.authentication.SessionManager;
import org.springframework.vault.config.AbstractVaultConfiguration;
@Configuration
public class VaultSessionManagerConfig {
@Bean
public BeanPostProcessor sessionManagerBeanPostProcessor(AbstractVaultConfiguration vaultConfiguration) {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (SessionManager.class.isInstance(bean)) {
return new NoSessionManager(vaultConfiguration.clientAuthentication());
}
return bean;
}
};
}
}
这对我来说很有效