两个server 两个数据库 微服务_如何为K8S微服务建立一个到数据库的SSL链接

本文介绍了如何为K8S微服务设置到数据库的SSL连接,特别是实现单向验证(Server Authentication)。首先,从数据库服务器获取CA证书并创建truststore.jks。然后,在K8S中,通过secret和volume将truststore部署到微服务,并利用Vault管理truststore密码。最后,通过Spring Boot应用配置连接参数,实现加密连接。
摘要由CSDN通过智能技术生成

在微服务之间, 人们通常会使用https进行加密通讯。 在数据库和微服务之间, 越来越多的公司也开始要求使用SSL来进行加密通讯,即便数据库和微服务其实是在同一个内网当中。 到数据库的加密连接, 通常也分为单向验证(通常也叫做Server Authentication)和双向验证(Two-way Authentication, 包括了Server Authentication和Client Authentication)(https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-using-ssl.html), 这一点上和https的连接是类似的。在下面的介绍中讲将介绍如何一步步为k8s的微服务建立到数据库的实现了Server Authentication的SSL连接。

通常要建立单向的SSL认证, 客户端需要配置一个trust store, 然后在trust store中存放能够验证数据库服务器的CA证书。 客户端还需要保存对应这个trust store的密钥, 才能够打开truststore,读取到CA证书。

通过下面的命令我们先为微服务程序创建好truststore和对应的password, 首先从对应的数据库服务器上去下载对应的ca证书。 如果是mysql 的服务器, 可以通过以下的命令来获得ca证书在服务器上存放的位置。

show varaibles like '%ssl%'

你应该会看到下面的输出:

下载对应的ca.pem证书到本机, 运行下面的命令生成一个truststore.jks, 并且记下对应的password。

keytool -import -alias dbServerCACert -file ca.pem -keystore truststore.jks

那么在K8s的微服务中, 如何读取到这个truststore.jks. K8s里面提供了两个重要的概念, 一个是secret,secret通常用来存放敏感数据, 并且支持二进制格式, 正好用来存放trustore.jks文件。 一个是volume(存储卷)可以认为是容器内存放持久化内容的地方。 我们可以1) 把truststore.jks转成一个secret, 部署到微服务所在的cluster;2) 然后为这个secret建立一个Volume; 3) 通过把这个Volume加载到对应的微服务的容器。 微服务就可以读取到这个truststore的文件了。

创建secret:

kubectl create secret generic db-truststore-secret --from-file=./truststore.jks

在service对应的deployment文件中创建volumn:

- name:dbtruststoresecret:secretName:db-truststore-secretdefaultMode:420

在deployment文件中把volumn加载到对应的container中:

volumeMounts:- name:dbtruststoremountPath:/etc/truststores

这样在微服务启动之后, 它在自己的/etc/truststores文件目录下就能够发现truststore.jks文件。

接下来就是如何存储truststore.jks的密钥了。 在现在的程序里面越来越多的通过Vault(https://www.vaultproject.io/)来管理密钥。Vault Server提供了api, 用户可以通过api来将密钥存放在指定的目录下。Vault

Manage Secrets and Protect Sensitive Data

Secure, store and tightly control access to tokens, passwords, certificates, encryption keys for protecting secrets and other sensitive data using a UI, CLI, or HTTP API.

通过以下的命令, 我们把我们的truststore的密码存入到了vault当中。这里省略了如何获取vault-token, 有兴趣的小朋友可以自行查阅vault的文档。

curl --tlsv1.2 -ksSlL --header "X-Vault-Token:" --request PUT -d '{"db.trustCertificateKeyStorePassword":"XXXX"}' https:///v1/secret/private//

好了, 密码也存放好了, truststore.jks现在也已经可以在微服务容器内部访问到了。 最后的一步就是如何从应用程序访问到它们。如果你是一个spring boot的应用程序, 那么我们很容易和vault整合再一起, 只需要在spring boot的bootstrap.yml中配置好vault server的地址,以及在你的build.gradle里面加上对spring-cloud-vault的依赖。

spring:profiles:xxxcloud:vault:enabled:trueuri:authentication:TOKENtoken:generic:backend:secret/private/application-name:config:lifecycle:lease-endpoints:sysleasesenabled:false

这样在springboot启动的时候就会自动到vault server指定的地址里面去加载密钥, 然后我们可以在application.properties里面引用db.trustCertificateKeyStorePassword的值了。

spring.datasource.url=jdbc:mysql://:3306/?serverTimezone=UTC&sslMode=VERIFY_CA&trustCertificateKeyStoreUrl=file:/etc/truststores/truststore.jks&trustCertificateKeyStorePassword=${db.trustCertificateKeyStorePassword}

至此,所有的配置完工, 启动你的spring boot的应用程序, 现在从容器到数据库之间的连接就是加密保护的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值