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.
Je n'arrive pas à comprendre où je devrais mettre l'info SSH. Tous les tutoriels semblent être pour https.
Je continue à recevoir une erreur que la clé privée est invalide.
Il semble y avoir plusieurs façons de faire ce travail, mais un seul qui a fonctionné pour moi.
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
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" ...
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!