繁体   English   中英

云构建中的 ssh 个密钥

[英]ssh keys inside cloud build

我正在尝试创建一个将在容器中运行的服务,通过 ssh 连接到远程主机并远程执行多个命令。 该服务将在云构建中构建和运行。 现在我一直在尝试将 SSH 密钥注入容器 - 构建失败并出现错误:

Step #2 - "run replication command": Load key "/root/.ssh/id_rsa": invalid format

我的密钥是使用ssh-keygen创建的,因此它们可能是正确的。 SSH 密钥似乎存在某种问题,但我不知道出了什么问题。 我已经尝试过的:

  1. 由于这是这个问题的后续,我已经尝试在构建阶段通过秘密管理器注入密钥。 这失败了,因为构建器拒绝正确执行替换并传递变量名而不是值(也就是说,我有一个名为 PRIVATE 的秘密环境变量,当我将它引用为 $$PRIVATE 时,构建器将值设置为 $PRIVATE,这不是我需要的);
  2. 我尝试以不同的方式创建秘密:
    • echo $(cat container_private_key.pem) | gcloud secrets create private-key --data-file=-
    • echo -n <secret value here> | gcloud secrets create private-key --data-file=-
    • gcloud secrets create private-key --data-file=container_private_key.pem
      这些都不起作用,云构建仍然抱怨格式无效。 我尝试在文件末尾添加/删除换行符,但没有帮助。
  3. 我还尝试插入带有和不带标题的键,但没有产生积极影响。

现在密钥注入如下:

mkdir -p /root/.ssh && chmod 0700 /root/.ssh && echo $CONTAINER_PRIVATE_KEY > /root/.ssh/id_rsa && \
    echo $CONTAINER_PUBLIC_KEY > /root/.ssh/id_rsa.pub && chmod 400 /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa.pub

如您所见,值取自环境变量,这些变量实际上包含键,我尝试回应它们。 我假设这个问题在某种程度上与我的计算机、秘密管理器和从环境变量中回显值之间的某个阶段被损坏的密钥有关,但我无法理解它可能发生的确切位置。

我做了一些挖掘,发现我关于 SSH 键在某个时候被破坏的假设是正确的。 问题说明:

  1. 我在一个文件中向 Secret Manager 提交一个秘密(这里没问题,文件似乎以其原始形式上传);
  2. 我的秘密被引用并作为环境变量导出到 Cloud Build,这就是事情变得糟糕的地方。 在这个地方的某个地方,密钥被去除了所有特殊的不可打印符号,SSH 将在下一步中将其视为格式错误的密钥;
  3. 该值成功进入文件,但由于格式错误,SSH 不关心也不会使用密钥。

因此,为了解决此问题,我执行了以下操作:我在主机上将密钥编码为 base64,并在最后一刻对其进行了解码。 请注意对base64的调用

mkdir -p /root/.ssh && chmod 0700 /root/.ssh && echo "$CONTAINER_PRIVATE_KEY" | base64 --decode > /root/.ssh/id_rsa && \
    echo "$CONTAINER_PUBLIC_KEY" | base64 --decode > /root/.ssh/id_rsa.pub && chmod 400 /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa.pub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM