我需要存储/加载一个单独的 JKS 文件,以便在我的一个微服务(Spring/JAVA)上进行非常特定的第三方集成。这些密钥/证书对应由单独的后台任务使用,该任务应使用自定义黑盒 SDK 偶尔调用第 3 方服务器。此 SDK 需要 JKS 文件的路径作为输入参数之一,因此它必须物理存储在磁盘上。
我现在采用的最简单的方法:JKS 存储在资源文件夹下的 git 中,然后通过一些自定义 terraform 脚本向 docker 容器提供密码。 这有多糟糕/不安全?假设 repo 是私有 github。
我认为另一个选择可能是(考虑由 jenkins 构建器运行的 docker/terraform,部署到 aws ecs):
现在的问题是,如何在我的服务上正确存储和加载这个 JKS?最好的方式和最低可接受的方式是什么?
如果我们采用完整的企业安全模式,开发人员甚至不应该访问该 JKS 文件。
对于开发,他们应该获得一个不同的 JKS 文件,该文件为他们提供足够的权限来完成开发工作。
要获取只能在运行时从正在运行的 Docker 映像访问的文件,您可以将其放在仅在生产中安装的卷上,并与正常开发部署分开管理。
如果您使用 Docker Swarm 或 Docker Compose,您可以将其定义为外部 Docker Secret,您的文件将在
/run/secrets/my_secret.jks
下可用。
version: "3.8"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- my_secret_jks
secrets:
my_secret_jks:
external: true
如果您使用 Kubernetes,则可以将该文件存储为 Kubernetes Secret 并将其挂载为secret
类型的卷:
apiVersion: v1
kind: Pod
metadata:
name: secret-test-pod
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
# name must match the volume name below
- name: secret-volume
mountPath: /etc/secret-volume
readOnly: true
# The secret data is exposed to Containers in the Pod through a Volume.
volumes:
- name: secret-volume
secret:
secretName: test-secret