一尘不染

为Elastic Beanstalk上的github私有存储库访问设置SSH密钥

node.js

我的Node.JS项目包含对托管在github上的私有NPM存储库的引用。在本地可以正常工作,但是我正在努力使其在Elastic
Beanstalk上正常工作。

dependencies: {
  ...
  "express": "^4.12.4",
  "jsonwebtoken": "^5.0.5",
  "my-private-module": "git@github.com:<my-user>/<my-repo>.git#<my-version>",
  ...
}

--

我需要的是能够在我的Elastic Beanstalk实例上为git设置有效的SSH配置,而不必在源代码控制中存储秘密密钥等。

显然,EB实例没有访问我的私人github仓库所需的SSH密钥。如果我将HTTPS样式的git
URL与username:password@github.com内联一起使用,则效果很好。它也可以使用github提供的oauth令牌方法工作(本质上是user:pass)。但是我不希望将任何凭据签入到源代码控制中,因此我试图从github进行克隆以在我的EB实例上通过SSH进行工作。

我已经尝试了上百万种方法,包括npm preinstall根据此博客文章提供的脚本,脚本以前一直工作到npm2为止,在npm2上进行了更改,预安装在树生成后运行,而解决该问题的PR仍在进行中。

我尝试了一个.ebextensions命令配置,该配置尝试调用git config以将insteadofgit@github.com上的HTTPS
URL放入具有来自环境变量的OAUTH令牌(本身很棘手,因为启动时此时未设置环境变量)循环,缺少$ HOME会使git config混淆)。

我还尝试了各种不同的方法来.ebextensions在我的EB实例上设置SSH,包括从提到的博客文章的评论中得到的解决方案。基本上这就是我现在停留的地方。

  • 我已经成功创建了一个密钥对,并在我的github配置文件上进行了设置,并验证了本地客户端可以使用私钥来克隆我的仓库
  • 我已将我的私钥和ssh配置文件放在私有S3存储桶中
  • 根据此示例,我创建了一个.ebextensions files配置,将这两个文件从S3存储桶复制到/tmp/.ssh/
  • 我创建了一个调试commands .ebextensions配置,其中列出了/tmp/.ssh并显示文件已成功从S3下载:

/tmp/.ssh/config包含:

Host github.com
    IdentityFile /tmp/.ssh/deploy_key
    IdentitiesOnly yes
    UserKnownHostsFile=/dev/null
    StrictHostKeyChecking no

/tmp/.ssh/deploy_key包含我的私钥,该私钥经过验证可在本地使用。

但是,git仍然抛出错误:

npm ERR! Command failed: git clone --template=/tmp/.npm/_git-remotes/_templates --mirror ssh://git@github.com/[.....]
npm ERR! Cloning into bare repository '/tmp/.npm/_git-remotes/git-ssh-git-github-com-[...]
npm ERR! Host key verification failed.
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.

我现在想法不多了。我最好的猜测是/tmp/.ssh不是git用来查找ssh配置文件的路径-
可能是在提出链接解决方案时提出的,但可能在以后的AMI:s等中已更改。使用的环境EB启动时似乎有点局限;命令以用户身份运行,nodejs但/
tmp似乎用作主目录,即使未在$ HOME处设置$ HOME。

如何获取git来获取我的SSH配置并因此使用我的SSH密钥?如何找到git在哪里寻找SSH配置文件?通常它位于〜/ .ssh中,但是由于未设置$
HOME,所以……这应该很容易,但会让我发疯。


阅读 271

收藏
2020-07-07

共1个答案

一尘不染

事实证明,放置ssh键以便被git在EB上拾取的正确位置是/root/.ssh不是 /tmp/.ssh不是 /home/ec2-user/.ssh

我的最终配置(假设在的S3存储桶中有一个私有SSH密钥<my-bucket>/github-eb- key,并且使用访问权限访问该仓库的github用户注册了相应的公共密钥),使用配置为的AMI 64bit Amazon Linux 2016.09 v3.3.0 running Node.js,并且在AMI中配置了以下内容.ebextensions/01_ssh_setup.config

Resources: 
  AWSEBAutoScalingGroup: 
    Metadata: 
      ? "AWS::CloudFormation::Authentication"
      : 
        S3Auth: 
          buckets: 
            - <my-bucket>
          roleName: 
            ? "Fn::GetOptionSetting"
            : 
              DefaultValue: aws-elasticbeanstalk-ec2-role
              Namespace: "aws:asg:launchconfiguration"
              OptionName: IamInstanceProfile
          type: s3
files: 
  /root/.ssh/github-eb-key: 
    authentication: S3Auth
    mode: "000600"
    owner: root
    group: root
    source: "https://s3-eu-west-1.amazonaws.com/<my-bucket>/github-eb-key"
  /root/.ssh/config: 
    mode: "000600"
    owner: root
    group: root
    content: |
      Host github.com
        IdentityFile /root/.ssh/github-eb-key
        IdentitiesOnly yes
        UserKnownHostsFile=/dev/null
        StrictHostKeyChecking no
2020-07-07