配置服务的安全问题会很重要,其中的内容是我自己学习的,由于学习时间不长,有可能不是很完备,如果有更好的方案,烦请评论中留言或私信,谢谢!
1. 首先访问配置服务需要设置密码:
使用spring-security使得这件事变得很简单,在pom.xml中引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
在application.properties中指定用户名和密码,
security.user.name=user security.user.password=yourPW
如果不指定,用户名默认是user,密码会使用随机密码写入到log中。配置客户端也是需要提供账号密码才能访问的,配置客户端的搭建方案后面会说。
2. 大部分公司没能力自己改造git仓库,因此,机密性很高的配置放入git中并不安全。
配置服务提供了对配置的加密和解密,由于配置客户端会很多,并不安全,建议将加密和解密全部放在配置服务中完成。
3. 加密配置文件内容:
Config Server 可以使用对称(共享)密钥或者非对称密钥(RSA密钥对).就安全性来讲,非对称密钥是优先选择,但是,选择对称密钥进行加解密处理显得非常方便,因为,只需要简单的配置一个属性值.
加密使用公钥完成,私钥用来解密。原则上,如果你只想加密,服务器上只配置公钥(用私钥在本地自行解密)。实际中,建议将加密和解密全部放在配置服务中完成。原因是这种方式会把密钥管理过程让所有的客户端都知道,而不是把焦点聚集在服务器上。从另外一个方面讲,一个非常有益的建议是如果你的配置服务器相对不安全,只能有少数客户端需要加密配置属性。
加密配置:
1. 生成密钥库
$ keytool -genkeypair -alias mytestkey -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass changeme -keystore server.jks -storepass letmein
2. 配置配置服务配置文件
encrypt: keyStore: location: classpath:/server.jks password: letmein alias: mytestkey secret: changeme
4. 如何加密配置文件内容信息
经过上面的配置,配置服务器已经具备给配置文件内容加密与解密的能力,下面介绍如何进行加密和解密
服务器会暴露 /encrypt
和/decrypt
接口。如果你想编辑远程配置文件,你可以请求Config Server的/encrypt
接口来加密。
逆操作也可以通过/decrypt
来完成。
你加密的值增加{cipher}
前缀后,放入配置文件中即可,从配置服务器获取的配置会是经过自动解密的内容。
当客户端程序对主环境资源不能确定时,/encrypt
和/decrypt
接口也接受带有路径形式的请求 /*/{name}/{profiles}
,这样可以针对每个application(name)和profile进行详细的控制加解密。
如果以这种细粒度的方式来控制加解密,你必须提供一个TextEncryptorLocator
类型的@Bean
,使用这个Bean 可以为每个名称或profile创建不同的加密方法。默认提供的并没有这个功能(所有加密使用相同的密钥)。