node.js - docker 映像中的 ssh 凭据
问题描述
我有一个应用程序可以正常运行docker-compose up
。该应用程序使用 SSH 连接到我的主机并执行一些命令。现在我通过在源代码中编写它们来提供 SSH 凭据,如下所示:
const pass = 'mypassword';
let username = 'myusername';
let host = '172.17.0.1';
我正在尝试遵循本指南,以便以更好的方式提供凭据。我不明白这一行privateKey: require('fs').readFileSync('/here/is/my/key')
是如何工作的它是一个相对路径,“密钥”是一个密码为纯文本的文件吗?我应该从我的主机上提供什么东西吗?如何在 docker 容器中提供凭据?
解决方案
通常,要将参数传递到 Node.js 脚本读取的容器中,您可以:
- 利用环境变量(https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e---env---env-file)
- 使用卷( https://docs.docker.com/storage/volumes/)将主机系统中的目录挂载到正在运行的容器中
- 将它们作为参数传递(如何通过 docker run 将参数传递给 Shell 脚本)。
- 从远程服务器下载它们
对于 SSH 凭据等机密数据,我建议不要使用参数或环境变量,因为可以从各种来源检查它们。这篇文章很好地解释了为什么:https ://diogomonica.com/2017/03/27/why-you-shouldnt-use-env-variables-for-secret-data/
相反,我会创建一个您的 Node.js 脚本可以读取的简单配置文件。
{
"username": "myuser",
"password": "pass",
"host": "172.17.0.1",
...
}
您可以将此文件放在主机系统上的目录中,并在/myvolume
启动容器时将其挂载到容器中:
docker run -it -v host-directory:/myvolume myimage
您的 Node.js 脚本现在可以读取 JSON 文件:
const configFilePath = "/myvolume/secret-config.json"
const config = JSON.parse(fs.readFileSync(configFilePath));
// now you can use config.host, config.username and config.password
附带说明:我建议您将远程 SSH 服务器设置为使用私钥/公钥身份验证,因为密码通常不太安全。一旦你设置了私钥/公钥身份验证,你可以将私钥文件放在同一个卷中,并以类似的方式从你的 Node.js 脚本中加载它:)
推荐阅读
- java - 如何从 uid Firebase 数据库中获取电子邮件地址?
- java - 过滤字符串输出/提取一个键值对
- java - “错误:解析时到达文件末尾”
- sas - SAS 如果宏内的条件未按预期工作
- azure - 将在 Azure 上托管的 asp.net 中的环境变量引用的 JSON 文件的存储位置
- linux - 应用程序只看到双处理器机器上可用线程的一半
- hyperledger-fabric - 无法启动或升级 BNA
- python - 404 用于烧瓶中的所有路线
- database - CodeIgniter:没有 www 的服务器名称不会选择正确的数据库配置
- php - 使用 zoonman/linkedin-api-php-client 从 LinkedIn API V2 获取完整的 r_basicprofile 信息