问题描述
有一个运行在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服务器来实现。选择哪种方法取决于你的具体需求和安全要求。无论哪种方法,都应该避免在代码中硬编码敏感信息,并采取适当的安全措施来保护秘密的传递和使用。
希望这些解决方案对你有帮助!如果你有任何其他问题,请随时提问。