脚本cloud-init
需要设置环境变量值以包含机密。
下面可以更改哪些特定语法来防止秘密
PASS
并被PSS
打印在cloud-init
日志中?
当前代码:
以下是导致机密写入日志文件的 cloud-init 脚本部分的示例:
export PASS=$PSS
echo "export PASS='$PSS'" >> /etc/environment
echo "export PASS='$PSS'" >> /etc/bashrc
echo "export PASS='$PSS'" >> /etc/profile
问题:
问题在于,上面显示的当前代码将变量中包含的显式值打印到 cloud-init 日志中。这意味着,目前保护机密的唯一方法是锁定日志并尽可能对轮换机密保持高度警惕。
我们需要的:
有没有一种 Linux 原生方法可以防止机密信息被打印到输出和日志中?
我们希望它与工具和云无关。这意味着我们希望避免依赖管道工具的秘密混淆功能,并且我们还希望无论是在 AWS、Azure 还是任何其他云提供商中运行,都可以隐藏秘密。我们想要一个可移植且不可知的 linux/bash 解决方案来解决这个问题。
我们对所有 Linux 实例使用基于 RHEL 的映像,包括纯 RHEL,还包括 Amazon Linux 2 和 CentOS。
对评论的回应
根据@falcajr
的问题,cloud-init 脚本开始,无论脚本中#!/bin/bash
是否存在问题仍然存在。set -e
我们看到的秘密日志是云初始化脚本运行时的控制台输出,毫无疑问它已经存储在某个地方,并且我们必须将其单独存储在我们自己的自动化系统中。该OP需要一个Linux本机解决方案,这样目的地在哪里就无关紧要了。例如,如果有一个obscureFromOutput()
函数,我们会要求类似以下的内容,除了有效的语法而不是以下组成的伪代码:
echo "export PASS='obscureFromOutput($PSS)'" >> /etc/environment
根据@Isaac
的评论,PSS
被接收为 cloud-init 脚本的输入变量。我们认为,packer 目前是发送输入变量的工具,这并不重要,因为我们想要一个 Linux 原生解决方案,如果我们切换到或或 任何其他工具PSS
,该解决方案也能正常工作。如果您有解决此问题的特定方法,此 OP 正在请求一个特定的解决方案。ARM templates
cloud formation
然后,我们尝试了@falcojr
第二个建议,使每个命令如下所示,但秘密仍然显示在打包器命令行输出中,并被推送到日志中:
echo "export PASS='$PSS'" >> /etc/environment &> /dev/null
我们使用的语法正确吗?还有其他可以尝试的吗?
答案1
您能否从代码内部从 AWS Secrets Manager 存储和检索它们,而不是将它们静态地放置在文件中?您可以将权限添加到实例配置文件,以便服务器可以在启动时检索它们,将它们存储在变量中,并在执行期间使用它们。
答案2
你不能把它封装在脚本中吗?
据我了解,问题在于亚马逊将每一行回显到日志中,并且在记录之前扩展了环境变量。
将其包装在脚本中应该会强制它在扩展环境变量之前进行记录。
我还没有测试过这个(用手机打字)
sh -c "
echo \"export PASS='\$PSS'\" >> /etc/environment
echo \"export PASS='\$PSS'\" >> /etc/bashrc
echo \"export PASS='\$PSS'\" >> /etc/profile
"
答案3
如果您的脚本中有一个set -x
,那么这可能会解决问题:
# Turn off tracing before any commands with a secret in them.
set +x
export PASS=$PSS
echo "export PASS='$PSS'" >> /etc/environment
echo "export PASS='$PSS'" >> /etc/bashrc
echo "export PASS='$PSS'" >> /etc/profile
# Turn tracing back on after.
set -x
根据文档:
-x
在扩展之后和执行之前打印简单命令、
for
命令、case
命令select
、命令和算术命令及其参数或关联单词列表的痕迹。变量for
的值PS4
被扩展,并且结果值在命令及其扩展参数之前打印。
编辑:措辞和格式。