web-dev-qa-db-fra.com

Spring Cloud Config Server utilisant la clé SSH pour Git et s'exécutant dans Docker

J'ai trouvé beaucoup de questions et de tutoriels avant de rassembler tout cela. Je voulais le documenter pour que quelqu'un d'autre puisse économiser de nombreuses heures de frustration.

J'essaie de faire en sorte qu'un référentiel git privé sur BitBucket fonctionne avec Spring Boot Config Server à l'aide de clés de déploiement et qu'il soit exécuté dans Docker. Je rencontre beaucoup de problèmes.

  1. Comment configurer réellement en utilisant les fichiers application.yml. 

Je n'arrive pas à comprendre où je devrais mettre l'info SSH. Tous les tutoriels semblent être pour https.

  1. Comment fournir la clé privée à la configuration. Pour Dev, la syntaxe pour inline dans YML est une tâche difficile. Pour la production, vous devez le fournir via une variable d'environnement, qui est une autre corvée syntaxique.

Je continue à recevoir une erreur que la clé privée est invalide.

  1. Comment faire en sorte que le conteneur Docker fasse confiance à la clé de l’hôte sans l’invite "faites-vous confiance à ce type"?.

Il semble y avoir plusieurs façons de faire ce travail, mais un seul qui a fonctionné pour moi.

7
Wpigott

La première pièce est la configuration. Vous voulez ignorer la clé privée standard et en utiliser une fournie en tant que variable d'environnement. (SSH_KEY). En outre, le dépôt git est un EV (GIT_URL) mais vous pouvez coder en dur si vous le souhaitez.

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

La deuxième partie est délicate. Pour Dev, vous voulez la clé en ligne, vous devez donc utiliser un tuyau pour préfixer le bloc en YAML. (Notez que cette clé est jetée comme je viens de la générer et je l’ai maintenant jetée)

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-----

Au niveau de la production, vous devez utiliser une variable bash dans la commande Invite pour stocker votre clé avant de la transmettre à la commande Docker qui exécute votre conteneur. Exemple:

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

À ce stade, vous devriez avoir l'application prise en charge. Maintenant, tout ce dont vous avez besoin est de surmonter le problème non sécurisé de l’hôte ssh. Pour cela, ajoutez ces lignes dans votre fichier Docker. Remplacez «bitbucket.org» par l’hôte de votre choix. Ces commandes créent le répertoire ssh config, corrigent les autorisations, puis créent et remplissent le fichier knownhosts.

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

Je voulais ajouter une autre tournure à ce problème, qui permettrait, espérons-le, de ne plus avoir à manipuler les clés SSH dans le fichier YAML (ou dans les variables env), ce qui est généralement une mauvaise idée.

Cela tourne autour du fichier de configuration SSH, donc si l'application n'y a pas accès, ou si elle ne peut pas être modifiée, cela ne fonctionnera pas (mais je ne peux penser à aucune situation réelle dans laquelle cela s'appliquerait, y compris les déploiements dans le cloud. : soit les modèles AWS Cloudformation, soit Kubernetes ConfigMaps fourniraient des solutions utiles).

Le problème concerne (pour l'essentiel) la limitation (plutôt inexplicable) de l'impossibilité de spécifier un fichier de clé privée dans les propriétés de l'application Spring Config.

Dans votre fichier ~/.ssh/config, vous pouvez ajouter les éléments suivants:

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

(Je dois me connecter à un serveur privé GitHub Enterprise et l'utilisateur associé à la clé SSH n'est pas identique au serveur d'application utilisé: cela fonctionne parfaitement; si ce n'est pas le cas, utilisez simplement github.com pour la variable HostName, et omettez la User)

Ensuite, au lieu d’utiliser l’URI GitHub, quelque chose comme:

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

vous remplacez git-config pour l'hôte:

spring:
  cloud:
    config:
      server:
        git:
          uri: git@git-config:my-team/config-properties-demo.git
          strictHostKeyChecking: false

Il est en effet un peu lourd, mais relativement facile à automatiser ..__ Une option bien préférable serait que Spring Config ajoute une autre option qui pointe vers le matériel de clé privée:

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

J'imagine qu'il en est une pour la section "demandes d'amélioration" ...

2
Marco

Pardon the necro, mais c’est le premier résultat obtenu sur Google (de SO) lorsqu’il a cherché comment effectuer une authentification SSH avec Git repos quand le serveur de configuration est déployé dans un environnement doté d’un système de fichiers éphémère - et j’ai trouvé un façon de faire exactement cela. Vous trouverez ci-dessous un résumé de ce que je suis en train de faire pour que cela se produise pour mon client. 

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

C'est certainement un vilain petit canard, mais il est fonctionnel et devrait servir de base solide à quiconque en a besoin. Avec cette implémentation, vous pourrez monter un volume sur un conteneur exécutant le serveur de configuration. Ensuite, configurez simplement l’environnement pour utiliser le volume en tant que répertoire SSH avec la clé de configuration spring.cloud.config.server.git.sshLocation via le support qui vous convient le mieux (variables env, bootstrap.yml, etc ...).

Bon codage!

0
Ryan Hansen