如何正确存储 .jks 并将其加载到我的 Java/Spring 微服务上?

问题描述 投票:0回答:1

我需要存储/加载一个单独的 JKS 文件,以便在我的一个微服务(Spring/JAVA)上进行非常特定的第三方集成。这些密钥/证书对应由单独的后台任务使用,该任务应使用自定义黑盒 SDK 偶尔调用第 3 方服务器。此 SDK 需要 JKS 文件的路径作为输入参数之一,因此它必须物理存储在磁盘上。

我现在采用的最简单的方法:JKS 存储在资源文件夹下的 git 中,然后通过一些自定义 terraform 脚本向 docker 容器提供密码。 这有多糟糕/不安全?假设 repo 是私有 github。

我认为另一个选择可能是(考虑由 jenkins 构建器运行的 docker/terraform,部署到 aws ecs):

  1. 在运行时从 aws Secret Manager/加密 s3 加载,然后存储在文件系统上。
  2. 在形象塑造阶段以某种方式供应。
  3. 在容器启动阶段以某种方式供应。

现在的问题是,如何在我的服务上正确存储和加载这个 JKS?最好的方式和最低可接受的方式是什么?

spring docker security aws-secrets-manager
1个回答
0
投票

如果我们采用完整的企业安全模式,开发人员甚至不应该访问该 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
© www.soinside.com 2019 - 2024. All rights reserved.