5.2 健康指标
Config Server 附带一个健康指标(Health Indicator),用于检查配置的 EnvironmentRepository
是否正常工作。默认情况下,它会为 EnvironmentRepository
请求一个名为 app
的应用程序,这个默认的profile和label由EnvironmentRepository
的实现提供。
你可以使用自定义的profiles和labels配置健康指标以检查更多的应用程序。例如:
spring:
cloud:
config:
server:
health:
repositories:
myservice:
label: mylabel
myservice-dev:
name: myservice
profiles: development
可以使用这个配置项来禁用健康指标:spring.cloud.config.server.health.enabled=false
。
5.3 安全
你可以自由的使用任何对你有意义的方式去保护你的 Config Server (从物理网络的安全到OAuth2 bearer tokens),Spring Security
和 Spring Boot
以简单的方式将这些做的更好。
想要使用 Spring Boot
默认配置的 HTTP Basic 认证的话,只需要将 Spring Security
包含进classpath即可(可以引入 spring-boot-starter-security
包)。默认情况下使用了 user
这个用户名和随机生成的密码,这在实际情况下并不会很有用,所以我们建议你手动配置你的密码(通过 security.user.password
)并对其进行加密(请参考下面的教程来学习怎样做到这一点)。
5.4 加密和解密
重要
先决条件:要使用加密和解密功能,需要在你的JVM中安装全功能的JCE(默认情况下不会被安装)。你可以从Oracle下载
"Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files"
,并参考安装说明来进行安装(基本上就是将JRE 的lib/security
目录下的两个策略文件替换为你下载的那些文件)。
如果远程属性源中包含加密了的内容(以 cipher
开头的值),则在通过HTTP发送给客户端之前,他们将被解密。这种配置的主要优点是,属性值在“静止”(译注:原文为”at rest”)时(例如,在git存储库中)不必是纯文本的。如果某个值无法被解密,它将被从属性源中移除,同时一个新的属性将使用同样的key被添加进来。这个新的属性前缀为 invalid
,值被设置为含义为”不适用”的一个值(通常使用 <n/a>
)。这主要是为了防止在文本中存储密码而意外泄露。
如果你正在为你的config client配置远程存储仓库,那么它应该包含一个像下面这样的 application.yml
配置文件。例如:
application.yml.
spring:
datasource:
username: dbuser
password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
使用 .properties
文件进行配置时,被加密的值不能包含在引号中,否则这个只不会被解密:
application.properties.
spring.datasource.username: dbuser
spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
你可以安全得将这个纯文本推送到共享的git存储库中,这个密码将受到保护。
Config Server还公开了 /encrypt
和 /decrypt
这两个接口(请确保这两个接口是受到保护的并且只能被已经授权的代理访问到)。如果你在编辑一个远程的配置文件,你可以发送POST请求来使用Confog Server的 /encrypt
接口。例如:
$ curl localhost:8888/encrypt -d mysecret 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果你正在加密的字符是需要被 URLencode 的值,则需要使用
--data-urlencode
选项来让curl
正确的编码它们。请确保不要在加密值中包含任何
curl
统计命令。 将该值输出到文件可以帮助避免此问题。
可以使用 /decrypt
来进行相反的操作(如果服务器配置了对称加密使用的密钥或者完整的密钥对):
$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret
如果你使用 curl 进行测试,那么使用
--data-urlencode
来代替-d
或者使用Content-type: text/plain
来确保在含有特殊字符时curl 能正确的进行编码(+
尤其棘手)。
当你将一个值放在YAML文件或者properties文件中,然后将这个文件提交并推送到远程的可能不安全的存储区之前,请为这个值添加 {cipher}
前缀。
/encrypt
和 /decrypt
这两个接口也接受格式为 /*/{name}/{profiles}
的路径。当客户端调用主环境的资源时,该路径可以用来控制对每个应用程序 {name}
和配置 {profiles}
的分别加密。
要使用这种细粒度的方式控制加密的话,你还必须提供一个类型为
TextEncryptorLocator
的@Bean
。它根据不同的应用程序{name}
和配置{profiles}
来创建不同的加密器。当然,这不是默认的行为(默认情况所有的加密使用同一个key)。
Spring 的命令行客户端(需要安装 Spring Cloud CLI 扩展)也可以用来加密和解密。例如:
$ spring encrypt mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret
如果需要使用存在文件中的密钥(例如,一个用于RSA加密的公钥),需要为密钥值添加 @
前缀并提供这个文件的路径。例如:
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
命令中的 key
参数是必须的(尽管有一个 --
前缀)。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/98434.html