clés de déploiement GitHub: comment autoriser plus d'un dépôt pour une seule machine

Donc, j'ai un hôte, l'appelle rob. J'ai utilisé la commande ssh-keygen sur rob pour obtenir une clé publique, que j'ai donné à github en ajouter une nouvelle déployer touche écran pour dépôt cheech. Maintenant, je veux déployer chongrob. Mais si je vais à l'écran Ajouter une nouvelle clé de déploiement pour le dépôt chong sur github, et collez la clé publique, j'ai généré sur rob il est dit key already in use. J'ai pensé que si la clé était utilisée, je pourrais cloner!--3-->rob mais ça dit permission refusé.

il est donc clair que c'est plus compliqué que je ne le pensais et que cela implique d'avoir plusieurs clés ou quelque chose. Que dois-je faire pour cloner chongrob?

merci de votre aide.

34
demandé sur Nathan 2012-07-25 22:22:23

9 réponses

une fois qu'une clé a été attachée à un repo comme clé de déploiement, elle ne peut pas être utilisé sur un autre repo. Si vous rencontrez cette erreur lors du paramétrage jusqu'déployer des clés, alors vous aurez besoin de modifier votre distance et de configurer votre ~/.ssh/config le fichier à utiliser un inexistant github.com nom d'hôte ssh sera en mesure d'utiliser pour choisir le bon ssh déployer clé pour votre référentiel.

# first we remove the origin
$ git remote -v
origin  git@github.com:username/foo.git (fetch)
origin  git@github.com:username/foo.git (push)
$ git remote rm origin

# here we add a new origin using a host nickname called
# foo.github.com that we will reference with a Host stanza in our
# ~/.ssh/config to specify which key to use with which fake hostname.
$ git remote add origin git@fake-hostname-foo.github.com:username/foo.git
$ git remote -v
origin  git@fake-hostname-foo.github.com:username/foo.git (fetch)
origin  git@fake-hostname-foo.github.com:username/foo.git (push)

Générer la clé de déploiement pour votre dépôt et lui donner un nom raisonnable comme:

$ ssh-keygen -t rsa -f ~/.ssh/id_rsa-foo -C https://github.com/username/foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa-foo.
Your public key has been saved in /home/username/.ssh/id_rsa-foo.pub.
The key fingerprint is:
c0:ff:ee:34:24:11:5e:6d:7c:4c:b1:a0:de:ad:be:ef https://github.com/username/foo
The key's randomart image is:
+--[ RSA 2048]----+
|  E   o..o.oo.   |
| M o o o .+CoW   |
|  + o = o. ..    |
| .   . +         |
|        S        |
|       o .       |
|        +        |
|       . o       |
|        ..o.     |
+-----------------+

une Fois que vous avez ajout de la touche deploy vous devrez ensuite ajouter la strophe suivante à votre ~/.ssh/config fichier:

Host fake-hostname-foo.github.com
    Hostname github.com
    IdentityFile ~/.ssh/id_rsa-foo

Maintenant vous pouvez le tester avec:

$ ssh -T git@fake-hostname-foo.github.com
Hi username! You've successfully authenticated, but GitHub
does not provide shell access.
60
répondu aculich 2016-07-14 01:00:41

la solution la plus simple que j'ai trouvée a été esquissée ici.

1) Saisissez cette commande (vous le ferez pour le nombre de touches dont vous avez besoin):

ssh-keygen-t rsa-c "your_email@example.com"

2) lorsqu'on vous invite avec l'énoncé ci-dessous,tapez un nom unique(i.e., foo1_rsa).Le fichier sera créé dans votre répertoire courant, vous devrez peut-être déplacer .ssh si vous voulez être bien rangé:

entrer le fichier dans pour enregistrer la clé (/Utilisateurs/vous/.ssh/id_rsa): [Appuyez sur enter]

3) Mettez à jour votre fichier de configuration SSH:

vi~/.SSH / config

Qui peut être vide:

Host cheech github.com
Hostname github.com
IdentityFile ~/.ssh/foo1_rsa

Host chong github.com
Hostname github.com
IdentityFile ~/.ssh/foo2_rsa
11
répondu Naruto Sempai 2014-09-27 01:39:41

une clé de déploiement pour github est unique ... Vous devez générer une nouvelle clé pour l'autre référentiel. Il suffit d'exécuter la commande ssh-keygen

voir la documentation de github pour ceci:https://help.github.com/articles/managing-deploy-keys

3
répondu klaustopher 2012-07-25 21:44:42

si vous êtes à l'aise de donner rob accès à tous les dépôts privés de votre compte GitHub, vous pouvez supprimer la clé comme clé de déploiement de cheech puis l'ajouter comme une clé SSH à votre compte GitHub dans son ensemble. Ce serait donner aux rob accès aux deux cheech et chong.

Cela ne fonctionnera pas si vous avez d'autres dépôts dans votre compte que vous ne souhaitez pas rob pour accéder à.

si vous avez besoin d'un contrôle plus fin, vous devrez générer touches supplémentaires sur rob et les affecter comme clés de déploiement à des dépôts spécifiques.

2
répondu Nathan 2012-08-02 18:59:42

je sais que c'est+ de 5 ans mais il n'y a pas de réponse à cette question populaire, donc voici ce que je considère la meilleure façon compte tenu de la propreté et de l'avenir de la lisibilité:


AJOUTER UN UTILISATEUR DEPLOY À VOTRE ÉQUIPE

Etape 1: créer une nouvelle adresse e-mail dans le domaine de votre organisation pour un nouveau déployer de l'utilisateur. Quelque chose comme deploy@organisation.example.com.

Etape 2: utilisez cette boîte aux lettres pour créer un nouveau compte GitHub ( GitHub appelle ces "utilisateurs de machines") donnez un nom d'utilisateur deploy-ExampleOrganisation donc son rôle est clair.

Etape 3: Créer un utilisateur sur votre serveur appelé "déployer" avec une commande comme ceci:

useradd -d /home/deploy -m deploy

générer une clé SSH pour déployer@servername, spécifiant pas de phrase de passe et / home / deploy/.ssh / id_rsa comme l'emplacement du fichier:

ssh-keygen -t rsa -b 4096 -C "deploy@servername"

Ajouter le contenu de / home / deploy/.SSH / id_rsa.pub comme une clé SSH sur votre nouveau deploy-ExampleOrganisation GitHub compte: Accédez à paramètres > touches SSH et GPG > nouvelle touche ssh.

Etape 4: créer une équipe dans votre organisation appelée quelque chose comme "déploiement en lecture seule les utilisateurs", ajouter un nouvel utilisateur à l'équipe et donner à l'équipe un accès en Lecture à toutes les pensions qui seront déployés. (si vous n'avez pas de Compte d'organisation, vous pouvez quand même donner à cet utilisateur l'accès à plusieurs prises en pension privées)

Étape 5: ajouter la clé SSH de votre machine personnelle pour déployer le fichier des clés autorisées de l'utilisateur (/home/deploy/.SSH / authorized_keys) pour que vous (ou votre script de déploiement) puissiez vous connecter en tant que déployer lors du déploiement code.

Boum! C'est tout... vous avez maintenant un flux propre et auto-documenté.


avantages d'un déploiement utilisateur sur la méthode des faux noms d'hôtes:

  • pas de pirate! C'est un compte d'utilisateur standard avec des noms clairs, accédant à des repos via de vrais noms d'hôtes.
  • moins de clés flottant autour.
  • si / quand vous passez à des serveurs supplémentaires, il est facile de donner à votre Utilisateur Deploy un compte sur chacun d'eux et juste en ajoutant 1 nouvelle clé à son compte GitHub, son compte sur le nouveau serveur est prêt à déployer code.
  • Deploy user only a un accès en lecture-seule avec de faibles privilèges aux seules repos listés dans l'équipe et vos clés personnelles SSH sont gardées à l'écart du serveur donc si une personne méchante accède à votre serveur, elle ne peut pas avoir accès à toutes vos repos aussi bien.
  • outil de déploiement de fichiers de configuration (par exemple Capistrano) ne vous salissez pas en contenant ces faux noms d'hôtes confus. (c'est quand ils ont commencé à se propager au-delà du serveur que je suis vraiment devenu mal à l'aise avec cette méthode.)
  • si vous oubliez comment vous avez fait cela dans un an la propriété du fichier vous mènera à l'utilisateur de déploiement ls -la, la touche SSH vous mènera au nom de compte GitHub ssh -T git@github.com et alors vous êtes totalement à la vitesse.
  • Et enfin... c'est la méthode recommandée par GitHub.
2
répondu Martin Joiner 2017-10-13 09:55:41

gérer plusieurs clés de déploiement GitHub peut être rendu facile avec mon minuscule npm module github-ajouter-clé. Il utilise l'approche décrite dans grande réponse, et tout ce que vous aurez besoin est

$ github-ajouter-clés rob/chong

dans votre local cloné rob/chong et suivez le processus automatisé.

1
répondu Vassiliy Pimkin 2017-05-23 10:30:58

Vous pouvez aussi créer un wrapper ssh et le passer comme GIT_SSH. Cette option a l'avantage que vous n'avez pas à changer le git remote. https://stackoverflow.com/a/14221028/3461

0
répondu Ben Atkin 2017-05-23 10:30:58

alors que L'idée de Pimkin était géniale, Je ne voulais pas installer node juste pour cela, j'ai donc créé quelque chose de similaire au bash:

https://gist.github.com/blvz/8eeebacae11011c25fc79eff12f49ae9

Installer et à utiliser:

curl https://gist.githubusercontent.com/blvz/8eeebacae11011c25fc79eff12f49ae9/raw/6f2f7f3709a0fe852d8a3a5bb125325e3ffbc7d8/gh-deploy-clone.sh > /usr/local/bin/gh-deploy-clone
chmod +x /usr/local/bin/gh-deploy-clone

gh-deploy-clone user/repo

# You can also give it a name, in case
# you have multiple deploy targets:

gh-deploy-clone user/repo staging
0
répondu blvz 2017-08-26 08:39:29

Je n'ai pas vu de bonne ou facile réponse ici, donc j'ai pensé que je jetterais dans ma solution. Je n'aime pas les réponses où vous avez besoin de changer le nom de domaine, utiliser des scripts wrapers, déconner avec keyring ou faire des bêtises .fichiers de configuration ssh. SSH est juste le transport pour git, donc je ne veux pas remplir mes dossiers importants ssh et configs avec des hacks et des paramètres pour utiliser plusieurs clés de déploiement qui une fois définies, Je ne me soucie pas et n'en aurai qu'une par mise à jour. Cela devrait être un git config - et il être.

de plus, pourquoi ne pas conserver les justificatifs d'identité dans la déclaration .dossier git donc si vous supprimez le dossier repos, vous supprimez la clé de déploiement?

supposons que /tmp / deploy_key est l'emplacement initial (temporaire) de votre clé privée deploy.

# Initial clone of repo    
GIT_SSH_COMMAND="ssh -i /tmp/deploy_key" git clone git@github.com:folder/reponame.git

# cd to the folder to assure we only change config for the repo instead of user/global.
cd reponame
# Could probably just mv instead of cp/chmod/rm the key but lets be precise
cp /tmp/deploy_key ./.git/deploy_key
chmod 600 ./.git/deploy_key
rm /tmp/deploy_key

# This is the magic - note the backslash escaping the $ as PWD is always the repo's
# folder when pulling or pushing etc... and at git (run) command time $PWD is the
# repo's root folder.
git config core.sshCommand "ssh -i $PWD/.git/deploy_key"

vous pouvez aussi bien sûr stocker la clé ailleurs et utiliser un chemin absolu sans $PWD pour la clé de déploiement: -

# Initial clone of repo    
GIT_SSH_COMMAND="ssh -i /path/to/a/deploy_key" git clone git@github.com:folder/reponame.git
# cd to repo to configure only for this repo
cd reponame
git config core.sshCommand "ssh -i /path/to/a/deploy_key"

Mais je préfère le garder dans le repo interne .dossiers git donc si je supprime le dossier repo je sais qu'il n'y a pas de justificatifs d'identité dans le coin, et après tout, vous ne pouvez avoir qu'une seule clé repo par déploiement.

0
répondu Jimmy 2018-09-26 02:46:27