如何在NodeJS应用程序中使用Hashicorp Vault

60次阅读
没有评论

问题描述

有一个运行在Pod中的NodeJS应用程序,需要读取Vault中的秘密。他找到了两种方法来实现这个需求:
1. 使用init容器将秘密挂载为.txt文件,并在应用程序中读取/解析它们。
2. 使用node-vault直接连接到Vault服务器并读取秘密,这需要初始令牌。

对于方法1,用户在一篇文章中发现作者认为这种方法不安全且复杂。对于方法2,用户不确定如何在不使用Amazon Secrets或其他服务的情况下自动解封和获取初始令牌。用户想知道获取和传递初始令牌给Pod的典型方式是什么。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1:使用init容器挂载秘密文件

使用init容器将秘密挂载为.txt文件,并在应用程序中读取/解析它们。这种方法可以确保秘密在容器启动之前就已经准备好了。

以下是实现这种方法的步骤:
1. 创建一个Kubernetes配置文件(例如vault-secrets.yaml),定义Pod和init容器的配置。
2. 在配置文件中,定义一个或多个init容器,用于挂载Vault中的秘密文件。
3. 在应用程序中,读取和解析这些秘密文件。

下面是一个示例的vault-secrets.yaml文件:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: my-app-container
      image: your_image:latest
      # 定义应用程序容器的其他配置
  initContainers:
    - name: vault-init
      image: vault:latest
      # 定义init容器的其他配置
      volumeMounts:
        - name: vault-secrets
          mountPath: /secrets
    # 定义其他init容器
  volumes:
    - name: vault-secrets
      emptyDir: {}

在上面的示例中,我们定义了一个名为my-app的Pod,其中包含一个名为my-app-container的应用程序容器和一个名为vault-init的init容器。init容器使用Vault镜像,并将Vault中的秘密文件挂载到/secrets目录下。应用程序容器可以读取和解析/secrets目录中的秘密文件。

方案2:使用node-vault连接到Vault服务器

使用node-vault库直接连接到Vault服务器并读取秘密。这种方法可以避免使用init容器,并且可以更灵活地处理秘密的获取和传递。

以下是实现这种方法的步骤:
1. 在NodeJS应用程序中,使用node-vault库连接到Vault服务器。
2. 在应用程序中,使用Vault的API来获取和解析秘密。

下面是一个示例的NodeJS代码片段:

const vault = require('node-vault')();

// 连接到Vault服务器
vault
  .init({ /* 初始化Vault客户端 */ })
  .then(() => vault.unseal({ /* 解封Vault */ }))
  .then(() => vault.auth({ /* 认证Vault */ }))
  .then(() => {
    // 获取和解析秘密
    return vault.read('secret/path/to/secret')
      .then(response => {
        const secret = response.data;
        // 在这里处理秘密
      });
  })
  .catch(error => {
    // 处理错误
  });

在上面的示例中,我们使用node-vault库连接到Vault服务器,并进行初始化、解封和认证操作。然后,我们使用Vault的API来获取和解析秘密。

请注意,为了安全起见,你应该避免在代码中硬编码初始令牌或其他敏感信息。你可以使用环境变量、配置文件或其他安全的方式来传递初始令牌给应用程序。

总结

在NodeJS应用程序中使用Hashicorp Vault可以通过使用init容器挂载秘密文件或使用node-vault库直接连接到Vault服务器来实现。选择哪种方法取决于你的具体需求和安全要求。无论哪种方法,都应该避免在代码中硬编码敏感信息,并采取适当的安全措施来保护秘密的传递和使用。

希望这些解决方案对你有帮助!如果你有任何其他问题,请随时提问。

正文完