使用Spring Boot时存储密码的最佳实践



我们正在开发一个Java Spring Boot应用程序,该应用程序需要访问数据库,密码存储在application.properties文件中。

我们的主要问题是,当上传到GitLab/GitHub时,密码可能是可见的。

我发现我们可以使用Jasypt来加密数据,但从我读到的内容来看,我需要在执行时使用解密密钥,该密钥也存储在Git上,以便使用Kubernates进行部署。

在这种情况下,有什么方法可以保护我们的密码吗?如果有什么不同的话,我们正在使用AWS,我们正在尝试使用EKS服务,但到目前为止,我们已经安装了一个安装了K8的VM。

您应该在application.properties文件中使用环境变量:

spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}

或者使用默认值(用于开发(:

spring.datasource.username=${SPRING_DATASOURCE_USERNAME:admin}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:admin}

然后,您可以将Kubernetes Secret添加到您的命名空间:

apiVersion: v1
kind: Secret
metadata:
name: mysecret
namespace: mynamespace
data:
SPRING_DATASOURCE_PASSWORD: YWRtaW4=
SPRING_DATASOURCE_USERNAME: YWRtaW4=

并将其分配给您的部署:

apiVersion: apps/v1
kind: Deployment
metadata:
name: mydeployment
spec:
# omitted...
containers:
- name: mycontainer
envFrom:
- secretRef:
name: mysecret
- configMapRef:
name: myconfigmap
# omitted...

另一种选择是将整个application.properties文件存储在Secret或ConfigMap中,并将其作为文件装载到容器中。

这两种情况在这里都有更详细的解释:https://developers.redhat.com/blog/2017/10/03/configuring-spring-boot-kubernetes-configmap

不要将密码存储在application.properties中,因为您提到这是不安全的,但您的应用程序可能有不同版本(dev、staging、prod(,它将使用不同的数据库和不同的密码。

在这种情况下,您可以在源文件中保持密码为空,并将此配置外部化,即您可以在将运行应用程序的k8部署文件或VM中使用环境变量,如果它们具有正确的格式,则spring-boot将其作为属性值加载。来自春季文档:

Spring Boot允许您将配置外部化,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括Java属性文件、YAML文件、环境变量和命令行参数。

最新更新