Docker镜像中的SSH凭据

3

我有一个应用程序,使用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')它是一个相对路径吗?“key”是一个明文密码文件吗?我需要从我的主机提供什么吗?如何在Docker容器中提供凭据?


将环境变量设置为 env vars,https://dev59.com/610a5IYBdhLWcg3wTHBt - Lawrence Cherone
好的,我将创建一个.env文件并在其中写入凭据。之后我会更改docker-compose文件。但是在代码中我需要做哪些更改? - Stavros Droutsas
我使用了这个链接中的方法:https://medium.com/the-node-js-collection/making-your-node-js-work-everywhere-with-environment-variables-2da8cdf6e786。谢谢。 - Stavros Droutsas
在指南中,他们希望您使用主机机器上的私钥挂载一个目录。 - Agost Biro
作为一个Docker卷? - Stavros Droutsas
1个回答

2
一般而言,要将参数传递到容器中以供您的Node.js脚本读取,您可以采用以下方法: 对于诸如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脚本中加载它 :)

最初的回答:

作为一种副产品,请设置你的远程SSH服务器使用私钥/公钥身份验证,因为密码通常不是很安全。当你设置完私钥/公钥身份验证后,你可以把私钥文件放在同一个存储卷里,并以类似的方式从Node.js脚本中加载它 :)


所以,如果我想传递用户名、密码、主机IP,就像我之前使用.env文件一样,我应该使用3个secret-config.json文件吗? - Stavros Droutsas
是的,这个想法是将主机名、用户名、密码等私密数据与命令输出(如ps)分开。您可以在此处了解更多信息:https://diogomonica.com/2017/03/27/why-you-shouldnt-use-env-variables-for-secret-data/ - mitchkman
这也假定您保持文件本身的安全,例如不以root身份在容器内运行任何进程并设置适当的文件权限。 - mitchkman
它正在工作!是否可以使用docker compose up运行它? - Stavros Droutsas
好的,我完成了。谢谢。 - Stavros Droutsas
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接