Einrichten von SSH-Schlüsseln für den Zugriff auf private Github-Repositorys auf Elastic Beanstalk

Lesezeit: 4 Minuten

Mein Node.JS-Projekt enthält Verweise auf private NPM-Repositorys, die auf GitHub gehostet werden. Dies funktioniert lokal gut, aber ich habe Probleme, dies auf Elastic Beanstalk zum Laufen zu bringen.

dependencies: {
  ...
  "express": "^4.12.4",
  "jsonwebtoken": "^5.0.5",
  "my-private-module": "[email protected]:<my-user>/<my-repo>.git#<my-version>",
  ...
}

Was ich brauche, ist in der Lage zu sein, eine funktionierende SSH-Konfiguration für Git auf meinen Elastic Beanstalk-Instances einzurichten, ohne geheime Schlüssel usw. in der Quellcodeverwaltung speichern zu müssen.

Offensichtlich verfügen die EB-Instanzen nicht über die erforderlichen SSH-Schlüssel, um auf meine privaten Github-Repos zuzugreifen. Wenn ich HTTPS-Stil-Git-URLs mit verwende username:[email protected] Inline, es funktioniert gut. Es funktioniert auch mit der oauth-Token-Methode angeboten von github (was im Wesentlichen ein user:pass ist). Ich möchte jedoch nicht, dass Anmeldeinformationen in die Quellcodeverwaltung eingecheckt werden, daher versuche ich, das Klonen von Github über SSH auf meinen EB-Instanzen zum Laufen zu bringen.

Ich habe eine Million Möglichkeiten ausprobiert, einschließlich npm preinstall Skripte gem diesen Blogbeitrag, die bis npm2 funktionierte, wo eine Änderung vor der Installation vorgenommen wurde, um ausgeführt zu werden, nachdem der Baum erstellt wurde, und die PR zur Behebung dieses Problems steht noch aus.

Ich habe es versucht .ebextensions Befehlskonfiguration, die versucht anzurufen git config ein platzieren insteadof auf [email protected] in eine HTTPS-URL mit einem OAUTH-Token, das von einer Umgebungsvariablen stammt (an sich schon schwierig, da env-Variablen zu diesem Zeitpunkt im Startzyklus nicht gesetzt sind und das Fehlen von $HOME die git-Konfiguration verwirrt).

Ich habe auch verschiedene Möglichkeiten ausprobiert .ebextensions um SSH auf meinen EB-Instanzen einzurichten, einschließlich diese Lösung aus den Kommentaren zum erwähnten Blogbeitrag. Das ist im Grunde, wo ich jetzt feststecke.

  • Ich habe erfolgreich ein Schlüsselpaar erstellt, es in meinem Github-Profil eingerichtet und verifiziert, dass der private Schlüssel von meinem lokalen Client zum Klonen meines Repos verwendet werden kann
  • Ich habe meinen privaten Schlüssel und eine ssh-Konfigurationsdatei in einem privaten S3-Bucket abgelegt
  • Ich habe eine erstellt .ebextensions files Konfiguration, die diese beiden Dateien aus meinem S3-Bucket in kopiert /tmp/.ssh/, gemäß dieses Beispiel
  • Ich habe eine Debug erstellt commands .ebextensions Konfiguration, die /tmp/.ssh auflistet und zeigt, dass die Dateien erfolgreich von S3 heruntergeladen wurden:

/tmp/.ssh/config enthält:

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

/tmp/.ssh/deploy_key enthält meinen privaten Schlüssel, der nachweislich lokal funktioniert.

Git gibt jedoch immer noch einen Fehler aus:

npm ERR! Command failed: git clone --template=/tmp/.npm/_git-remotes/_templates --mirror ssh://[email protected]/[.....]
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.

Mir gehen jetzt die Ideen aus. Meine beste Vermutung wäre, dass /tmp/.ssh nicht der Pfad ist, in dem git nach der ssh-Konfigurationsdatei sucht – es könnte gewesen sein, als die verknüpfte Lösung vorgeschlagen wurde, sich aber möglicherweise in späteren AMIs usw. geändert hat. Die verwendete Umgebung beim Starten von EB scheint es etwas eingeschränkt zu sein; Befehle werden als Benutzer ausgeführt nodejs aber /tmp scheint als Home-Verzeichnis verwendet zu werden, obwohl $HOME nirgendwo gesetzt ist.

Wie kann ich Git dazu bringen, meine SSH-Konfiguration abzurufen und folglich meinen SSH-Schlüssel zu verwenden? Wie kann ich herausfinden, wo Git nach einer SSH-Konfigurationsdatei sucht? Normalerweise ist es in ~/.ssh, aber da $HOME nicht gesetzt ist, nun ja… Das sollte einfach sein, aber es macht mich wahnsinnig.

Einrichten von SSH Schlusseln fur den Zugriff auf private Github Repositorys auf
JHH

Nach einem ganzen Tag des Kampfes und schließlich dem Stolpern über diese Antwort auf eine sehr ähnliche Frage, die ich zuvor übersehen hatte, stellt sich heraus, dass der richtige Ort ist, um ssh-Schlüssel zu platzieren, um von Git auf EB abgeholt zu werden /root/.ssh, nicht /tmp/.ssh, nicht /home/ec2-user/.ssh.

Meine endgültige Konfiguration (vorausgesetzt, es befindet sich ein privater SSH-Schlüssel in einem S3-Bucket unter <my-bucket>/github-eb-key, und der entsprechende öffentliche Schlüssel wird bei einem Github-Benutzer registriert, der Zugriff auf das/die Repo(s) hat, wobei ein AMI verwendet wird, das als konfiguriert ist 64bit Amazon Linux 2016.09 v3.3.0 running Node.js, und mit dem folgenden in .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

  • Ich habe festgestellt, dass dies nicht funktioniert, wenn package-lock.json verwendet wird, und ich konnte nicht herausfinden, warum. Es scheint, dass NPM bei der Installation etwas anderes macht, wenn die Daten aus package-lock.json abgerufen werden. Ich habe package-lock.json zur .egignore-Datei hinzugefügt und das funktioniert, könnte aber bei der Bereitstellung zu Versionskonflikten führen.

    – TeNrd

    26. Juni 2020 um 21:15 Uhr


.

592460cookie-checkEinrichten von SSH-Schlüsseln für den Zugriff auf private Github-Repositorys auf Elastic Beanstalk

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy