前言
上一篇:微服务实战|集中配置组件Config规避敏感信息泄露
上一篇文章中,我们介绍了使用集中配置中心组件Config实现了对称加密算法实现了配置信息的加密和解密,本文将介绍使用非对称加密算法实现同样的功能以及配置中心的安全管理。
一、Config非对称加密实战
1、生成秘钥文件
使用 JDK 中自带的数字证书管理工具keytool 。进入jdk安装目录下的bin目录,执行以下命令生成秘钥文件:
D:\soft\Java\jdk1.8.0_181\bin>keytool -genkeypair -alias config-server -keyalg RSA -dname "CN=cn,OU=cn,O=cn,L=cn,S=cn,C=cn" -keypass 123456 -keystroe d:/config-server.jks -storepass 123456
将生成的config-server.jks文件copy到config-server项目的resource目录下面。
2、配置秘钥
继续修改我们的config-server项目,将bootstrap.yml文件内容修改如下:
#对称加密配置
#encrypt:
# key: 123456
#非对称加密配置
encrypt:
key-store:
location: config-server.jks
alias: config-server
password: 123456
secret: 123456
3、启动验证
启动config-server项目,验证一下加密解密是否正常:
同样访问http://localhost:8005/encrypt/status,返回ok
再来访问http://localhost:8081/encrypt 加密接口:
同样一切正常,能够正常加密和解密。
4、项目实战
加密和解密功能正常之后,就要修改我们的配置文件内容了。
修改我们的config-server项目,在repo文件夹下,修改客户端的配置文件configclient-dev.yml,修改内容如下:
#对称加密密文
#app:
# key: '{cipher}5ab3ce1502c40c276074f400aee0be0f6279d6a85bb9d8d315a78c7a91603dde58d4512a6bc9f6492a8eddd34dbeeac0'
#非对称加密密文
app:
key: '{cipher}AQBFywM+SuemUIS18U8wXrw96hxmhq26u4UUKCxQ1jLTLEcT7MEldJ9C7H4USE+bxVIlHernOewcfWQBg8SwSqK9MuLr07Z1bTEwPEu8KfbEMKTXJBaK6OOVLPFKjaUS/ezHKlke1DYjPpxuo9QO5GOTXIGZOBIlcclJbBCAc2/JIEK34Na/vJdbmSVtNdo6qLw1ufDNPES5q7pweWrnaP4vmtzV8JSs7+UAOV4caf8Zxrv7Sp6KuxuRlEn2yNPoi9bzf4pBWoqxZ5cUsEkzMb5ZEEkmqXCXT4o6+AWdantXbzUXCVculh0FGHvJnnvzsDjoKnVJm0JULjNa5yWNik42tdqsj4KlW76XWcBNv4ditrNsYz13IhZpwsZGHtqTZ97AwobvaTY/UrV1We5ssx3O'
注意密文前面增加{cipher},这样才能正常解密。
5、验证
最后,再次重启registry项目以及config-server,config-client两个服务,访问client端的hello接口:http://localhost:8007/hello,同样正常返回了加密后的明文:
二、配置中心安全管理
刚才我们注意到,我们之间访问如:http://localhost:8005/encrypt/status、http://localhost:8081/encrypt 等状态,加密、解密接口是可以之间访问的。甚至我们可以之间访问配置中心获取配置文件的接口地址:http://localhost:8005/configclient/dev:
浏览器访问后返回的json报文为什么直接格式化了?安装这个插件就行了:Chrome浏览器插件:FeHelper
这是同样存在安全隐患的!我们同样需要做进一步的安全管理:
1、引入依赖
继续修改我们的config-server项目的pom文件,增加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
添加完成之后,重启 config_server 项目,注意重启的时候后台会打印如下日志:
Using generated security password: 8dc1da66-b6ea-4aa7-a67d-3d02f97e179c
然后浏览器再访问地址: http://localhost:8005/configclient/dev,就会跳转到登录页面,而不会直接返回配置信息,登录信息的用户名默认就是user,而密码就是上面打印的日志中生成的随机密码,我们也可以指定用户名和密码:
2、增加安全管理配置
修改config-server项目中的application.yml配置文件:
server:
port: 8005
spring:
application:
name: config-server
profiles:
active: native #本地文件
cloud:
config:
server:
native:
search-locations: classpath:/repo
security: #增加安全管理配置
user:
name: cxy965
roles: admin
password: 123456
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
这样,就可以使用我们指定的用户名和密码进行登录了。
3、调整客户端调用
增加安全管理配置之后,我们重新启动config-client项目,就会发现,无法从配置中心拉取配置:
2022-07-28 17:09:03.416 WARN 29296 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Could not locate PropertySource: Could not extract response: no suitable HttpMessageConverter found for response type [class org.springframework.cloud.config.environment.Environment] and content type [text/html;charset=UTF-8]
2022-07-28 17:09:03.418 INFO 29296 --- [ main] com.cxy965.demo.ConfigClientApplication : No active profile set, falling back to default profiles: default
意思是通过我们的配置信息,无法获取可用配置资源,是因为配置中心增加了安全管理,客户端无权访问了,这时,在客户端增加访问的用户名和密码就可以了。
修改config-client项目的bootstrap.yml,如下:
spring:
application:
name: configclient
cloud:
config:
username: cxy965 #增加访问配置中心用户名信息
password: 123456 #增加访问配置中心密码信息
name: configclient
profile: dev
discovery:
enabled: true
service‐id: config-server
eureka:
client:
service‐url:
defaultZone: http://localhost:8001/eureka/
再重新启动就可以了!