下面的两行 bash 代码将秘密提取到运行 RHEL8 的 Azure VM 的 cloud-init 脚本中。但是这两行中的每一行都有一个意想不到的副作用,就是将秘密打印到 cloud-init 日志中,让全世界都能看到。
为了防止他们将秘密打印到日志中,必须在下面的两行中具体更改什么?
myVar=$(az keyvault secret show --name "mySecretsFile" --vault-name "$VAULT_NAME" --query "value")
echo "$myVar" | base64 --decode --ignore-garbage >>/home/username/somefoldername/keys.yaml
上面两行的日志如下所示,除了这里我们已经编辑了公共论坛的实际秘密。在实际的日志中,秘密被打印了两次:
+ myVar='"really-long-alpha-numeric-secret-redacted-for-stack-exchange"'
+ echo '"really-long-alpha-numeric-secret-redacted-for-stack-exchange"'
这可能是一个关于如何禁止在日志中打印某些类型的内容的简单 bash 问题。
最快和最简单的解决方案可能是使用
set +x
禁用似乎已在父脚本中设置的 shell 跟踪选项。最终更好的解决方案是删除
set -x
父脚本中的 。在对这些脚本进行测试和调试后,类似的跟踪选项set -x
不再有用,并且如本示例所示,甚至可能因意外暴露敏感凭据或其他数据而有害。我编写了从云服务器上的用户数据调用的脚本,以及在 cloud-init 下运行的父/子脚本。我的脚本在顶部附近有一行来启用跟踪,但是签入源代码仓库的版本总是将这行注释掉:
#set -x
它可以取消注释以进行现场故障排除,但默认情况下永远不会。