it-swarm.com.de

Spring Cloud Config Server mit SSH-Schlüssel für Git und Ausführung in Docker

Ich habe viele Fragen und Tutorials gefunden, bevor ich das alles zusammengestellt habe. Wollte es dokumentieren, damit jemand anderes viele Stunden Frustration sparen kann.

Ich versuche, ein privates Git-Repository auf BitBucket zu erstellen, um mit Spring Boot Config Server unter Verwendung von Schlüsseln zu arbeiten und es in Docker ausführen zu lassen. Ich habe viele Probleme.

  1. So konfigurieren Sie die Anwendung mit den Dateien application.yml. 

Ich kann nicht herausfinden, wo ich die SSH-Informationen ablegen sollte. Alle Tutorials scheinen für https zu sein.

  1. So geben Sie den privaten Schlüssel für die Konfiguration an. Für Dev ist die Syntax für Inline in YML ein Schmerz. Für die Produktion müssen Sie es über eine Umgebungsvariable bereitstellen. Dies ist eine weitere Syntaxaufgabe.

Ich erhalte immer die Fehlermeldung, dass der private Schlüssel ungültig ist.

  1. Wie kann man den Docker-Container dazu bringen, dem Host-Schlüssel zu vertrauen, ohne dass dies lästig ist?.

Es scheint mehrere Möglichkeiten zu geben, diese Arbeit zu machen, aber nur eine, die für mich funktioniert hat.

7
Wpigott

Das erste Stück ist die Konfiguration. Sie möchten den privaten Standardschlüssel ignorieren und einen als Umgebungsvariable bereitgestellten verwenden. (SSH_KEY). Das Git-Repo ist auch ein EV (GIT_URL), aber Sie können auch hartcode schreiben, wenn Sie möchten.

spring:
  cloud:
    config:
      server:
        git:
          uri:  ${GIT_URL}
          ignore-local-ssh-settings: true
          private-key: ${SSH_KEY}

Teil 2 ist schwierig. Für Dev möchten Sie den Schlüssel inline. Daher müssen Sie eine Pipe verwenden, um den Block in YAML voranzustellen. (Beachte, dass dieser Schlüssel weggeworfen wird, da ich ihn gerade generiert habe und jetzt wegwerfe)

private-key: |
                    -----BEGIN RSA PRIVATE KEY-----
                    MIIEpAIBAAKCAQEAszmCR06LVHk/kNYV6LoYgEfHlK4rp75sCsRJ7rdAbWNED+yB
                    bneOm5gue0LGIhT7iTP9D7aN6bKVHv1SBconCA7Pa2NMA9epcMT5ecJc8ndpZOFn
                    iqM77jmMMPvj8EIC06w5oK5zoYwpGotYQFHllf8M+20HtW2fZdPYAYwLcVdmc5tI
                    vLoS+10qw5D3X9zrwk2Cbt37Iqnz1cHOQq+g7sxgVgt18aIKKeg0JslaGqSlWMoT
                    ICUMHj89E4BMHj8ND8otSXHL+VhN+ghd7w1MpckxLWBsNs1+G1FuiJEVAtRq/j+8
                    SOilxgifvI1LqpZ5kO01XFlmkcuN4NMT03qpcwIDAQABAoIBAB5oQGk2sz7mv1kk
                    aV0tzaBeDUd1cWSpUw1UljKRFrY4ZEDLYH5MfH57iE9TWehIZRC3KFU1JMikitZS
                    JktjK9IbKSfQFgKE4XOHh8gXqMteZRw/feCwpydYzic1ZUvK903QZ4qSbn3XGNYv
                    FA79lhUny50Qt4EZkzSkh35js0FMSR9VmyXENxN6IgXUZyoaNAATr44Vkd488BY2
                    7PvdOniemo8/8p4Ij0Aq9Q7rOtm77ZXjyFRX5mDTi2ndSllMEhVcWXHSii+ukbvF
                    117Ns+8M7VWroNfRzI+Ilm/Xz/ePOLlNoYcY0h5+QM9vMPTX9Cpl5WofgOMK1sKd
                    mSdI4ukCgYEA12kcu0aDyIrEPHcyaT9izSFply0Uon2QKS9EQn6cr83vaEGViamh
                    f5q1coYouGnsLfbgKolEMKsYtbmJvInPFDCdc2x0Fmc207Wp1OECsN+HwElEXkrs
                    uPDpGQgs5odjN5Grue9837920oG3UBBdVDAKly2dTOcvoWW+88seFSUCgYEA1P7f
                    p78HDMQ8zTy5+3Rd4+lmJjPsY618XxSQ80j8Elrhi/DyTMA0XGc5c3cKRPmSj+JD
                    GN34WQbw7JO2mKM7YJs+tkSBeTKce8F3cZQy1jy3LNHCtfXylOxmxOFKynV5h2b/
                    jno+pGdmAPK5yvnGASd2eujtzt+AL07XiD2LnLcCgYEAsFRz131WfP/SuShdlLf1
                    WbODKuQVIxojuwLdHo1kF6k805v0G/dGoxzycOgPRz41vj57q3Yn4qr8FC3n6PTq
                    FT3idUyPDpO41r67Ye469KxWBHo1Q/aTJqTWOs5tatvixOcyqoa3MrUZQCI8+4YZ
                    z8Nvt+b3/66zV6vhDtHzMx0CgYAvWW2M0+mUS/ecRHivzqGkrdkYewh87C8uz9qd
                    SsdGqU9kla63oy7Ar+3Unkz5ImYTeGAkIgw4dlOOtBOugPMNOdXKHRaPQ9IHrO2J
                    oUFf4OVzoDnhy4ge1SLPd6nxsgXPNPVwzfopABdr9Ima9sWusgAjuK5NA+ByI9vE
                    HLJxpwKBgQCTM938cdx457ag1hS6EaEKyqljS1/B8ozptB4cy3h0hzw0crNmW84/
                    1Lt9MJmeR4FrWitQkkVLZL3SrYzrP2i+uDd4wVVD5epvnGP/Bk6g05/eB9LgDRx/
                    EeBgS282jUBkXZ6WpzqHCcku3Avs3ajzsC1WaEYx0tCiBxSkiJlaLQ==
                    -----END RSA PRIVATE KEY-----

In der Produktion müssen Sie an der Eingabeaufforderung eine Bash-Variable verwenden, um Ihren Schlüssel zu speichern, bevor Sie ihn an den Docker-Befehl übergeben, mit dem Ihr Container ausgeführt wird. Beispiel:

$ pem=$( cat path_to_key )
$ docker run -e "SSH_KEY=$pem" configserver

Zu diesem Zeitpunkt sollten Sie sich um die Bewerbung kümmern. Jetzt müssen Sie nur noch das vertrauenswürdige ssh-Host-Problem umgehen. Fügen Sie dazu diese Zeilen in Ihre Dockerfile ein. Ersetzen Sie "bitbucket.org" durch einen beliebigen Host. Diese Befehle erstellen das Verzeichnis ssh config, legen die Berechtigungen fest und erstellen und füllen die Datei knownhosts.

RUN mkdir -p /root/.ssh
RUN chmod 700 /root/.ssh
RUN ssh-keyscan bitbucket.org > /root/.ssh/known_hosts
13
Wpigott

Ich wollte eine weitere Wendung hinzufügen, die hoffentlich die Notwendigkeit, SSH-Schlüssel in der YAML-Datei (oder in den env-Variablen) herumzuspielen, entfernt. Dies ist normalerweise eine schlechte Idee.

Hierbei handelt es sich um die SSH-Konfigurationsdatei. Wenn also die App keinen Zugriff darauf hat oder nicht geändert werden kann, funktioniert dies nicht (allerdings kann ich mir keine realen Situationen vorstellen, in denen dies zutrifft, einschließlich Cloud-Bereitstellungen.) : Entweder AWS Cloudformation-Vorlagen oder Kubernetes ConfigMaps bieten nützliche Problemumgehungen.

Bei dem Problem geht es (größtenteils) um die (eher unerklärliche) Einschränkung, dass in den Spring Config-Anwendungseigenschaften keine private Schlüsseldatei angegeben werden kann.

In Ihrer ~/.ssh/config -Datei können Sie Folgendes hinzufügen:

Host git-config
    HostName github.myserver.example.com
    User someone
    IdentityFile /path/to/private_key

(Ich muss eine Verbindung zu einem privaten GitHub Enterprise-Server herstellen, und der mit dem SSH-Schlüssel verknüpfte Benutzer ist nicht derselbe, unter dem der Anwendungsserver ausgeführt wird. Dies funktioniert problemlos. Wenn dies nicht der Fall ist, verwenden Sie einfach github.com für die HostName und die User weglassen

Anstelle des tatsächlichen GitHub-URI verwenden Sie etwa Folgendes:

[email protected]:my-team/config-properties-demo.git

sie ersetzen git-config für den Host:

spring:
  cloud:
    config:
      server:
        git:
          uri: [email protected]:my-team/config-properties-demo.git
          strictHostKeyChecking: false

Es ist zwar etwas umständlich, aber relativ einfach zu automatisieren. Eine viel zu bevorzugende Option wäre, wenn Spring Config eine weitere Option hinzufügt, die auf das Material des privaten Schlüssels verweist:

spring:
  cloud:
    config:
      server:
        git:
          uri: [email protected]:my-team/config-properties-demo.git
          user: someone
          private_key_file: /path/to/private_key
          strictHostKeyChecking: false

Ich denke, dies ist für den Abschnitt "Verbesserungsanfragen" ...

2
Marco

Verzeihen Sie dem Necro, aber dies ist das # 1-Ergebnis bei Google (von SO) bei der Suche nach der SSH-Authentifizierung mit Git-Repos, wenn der Config-Server in einer Umgebung mit einem kurzlebigen Dateisystem bereitgestellt wird - und ich glaube, ich habe eine gefunden Weg, genau das zu tun. Nachfolgend finden Sie einen Überblick über das, was ich derzeit mache, um dies für meinen Kunden zu ermöglichen. 

https://Gist.github.com/hanserya/43b00162741fa3022481301db60e8acd

Es ist definitiv ein hässliches Entlein, aber es ist funktional und sollte als solide Basis für alle dienen, die es brauchen. Mit dieser Implementierung können Sie ein Volume in einen Container laden, auf dem der Konfigurationsserver ausgeführt wird. Dann konfigurieren Sie die Umgebung so, dass das Volume als SSH-Verzeichnis mit dem Konfigurationsschlüssel spring.cloud.config.server.git.sshLocation über das für Sie geeignete Medium verwendet wird (env-Variablen, bootstrap.yml usw.).

Viel Spaß beim Codieren!

0
Ryan Hansen