web-dev-qa-db-fra.com

Comment ajouter ma propre clé publique à Vagrant VM?

J'ai eu un problème avec l'ajout d'une clé ssh à une machine virtuelle vagabonde. Fondamentalement, la configuration que j'ai ici fonctionne bien. Une fois que les ordinateurs virtuels sont créés, je peux y accéder via vagrant ssh, l'utilisateur "vagabond" existe et il existe une clé ssh pour cet utilisateur dans le fichier authorized_keys.

Ce que j'aimerais faire maintenant, c'est: pouvoir se connecter à ces machines virtuelles via ssh ou utiliser scp. Il me suffirait donc d'ajouter ma clé publique de id_rsa.pub au authorized_keys - comme je le ferais avec ssh-copy-id

Est-il possible de dire à Vagrant lors de l'installation que ma clé publique doit être incluse? Si ce n'est pas le cas (ce qui est probable, selon mes résultats Google), existe-t-il un moyen d'ajouter facilement ma clé publique lors de la configuration du vagabond?

56
tehK

Copier la clé publique souhaitée tomberait carrément dans la phase provisioning . La réponse exacte dépend du type de provisioning que vous souhaitez utiliser (Shell, Chef, Marionnette, etc.). Le plus trivial serait un provisioner file pour la clé, par exemple:

config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/me.pub"

Eh bien, en fait, vous devez ajouter à allowed_keys, utiliser un véritable provisioner, tel que Puppet . Par exemple, voir Gestion des clés autorisées SSH avec Puppet .

34
Remus Rusanu

Vous pouvez utiliser le module de base File de Ruby, comme suit:

  config.vm.provision "Shell" do |s|
    ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
    s.inline = <<-Shell
      echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
      echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
    Shell
  end

Cet exemple de travail ajoute ~/.ssh/id_rsa.pub au ~/.ssh/authorized_keys de l'utilisateur vagrant et root, ce qui vous permettra d'utiliser votre clé SSH existante.

59
Meow

Il existe un moyen plus "élégant" d'accomplir ce que vous voulez faire. Vous pouvez trouver la clé privée existante et l'utiliser au lieu de ne pas avoir à vous soucier de l'ajout de votre clé publique.

Procédez comme ceci pour voir le chemin de la clé privée existante (regardez ci-dessous pour IdentityFile ): 

courir 

  ssh-config vagabond 

résultat:

 $ vagrant ssh-config
Host magento2.vagrant150 
 Nom d'hôte 127.0.0.1 
 Utilisateur vagabond 
 Port 3150 
 UserKnownHostsFile /dev/null
 StrictHostKeyChecking no 
 PasswordAuthentication no 
 IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key"
 IdentitésSeulement oui 
 LogLevel FATAL 

Ensuite, vous pouvez utiliser la clé privée comme ceci, notez également le commutateur pour désactiver l'authentification par mot de passe

 ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.
31
Madis Maenni

Je finis par utiliser un code comme:

config.ssh.forward_agent    = true
config.ssh.insert_key       = false
config.ssh.private_key_path =  ["~/.vagrant.d/insecure_private_key","~/.ssh/id_rsa"]
config.vm.provision :Shell, privileged: false do |s|
  ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  s.inline = <<-Shell
     echo #{ssh_pub_key} >> /home/$USER/.ssh/authorized_keys
     Sudo bash -c "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys"
  Shell
end

Notez que nous ne devrions pas coder en dur le chemin vers /home/vagrant/.ssh/authorized_keys car certaines boîtes vagabondes n'utilisant pas le nom d'utilisateur vagrant.

8
smartwjw

Un code plus court et plus correct devrait être:

ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
config.vm.provision 'Shell', inline: 'mkdir -p /root/.ssh'
config.vm.provision 'Shell', inline: "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys"
config.vm.provision 'Shell', inline: "echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys", privileged: false

Sinon, l'utilisateur .ssh/authorized_keys appartiendra à l'utilisateur root.

Néanmoins, il ajoutera une ligne à chaque exécution de provision, mais Vagrant est utilisé pour les tests et une VM a généralement une durée de vie courte, ce qui ne pose pas de gros problème.

7
sekrett

Cette excellente réponse a été ajoutée par user76329 dans un rejeté Suggestion Modifier

En développant l'exemple de Meow , nous pouvons copier les clés ssh locales/privées de pub, définir les autorisations et rendre le script en ligne idempotent (s'exécute une fois et ne se répète que si la condition de test échoue, nécessitant ainsi un provisionnement):

config.vm.provision "Shell" do |s|
  ssh_prv_key = ""
  ssh_pub_key = ""
  if File.file?("#{Dir.home}/.ssh/id_rsa")
    ssh_prv_key = File.read("#{Dir.home}/.ssh/id_rsa")
    ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  else
    puts "No SSH key found. You will need to remedy this before pushing to the repository."
  end
  s.inline = <<-Shell
    if grep -sq "#{ssh_pub_key}" /home/vagrant/.ssh/authorized_keys; then
      echo "SSH keys already provisioned."
      exit 0;
    fi
    echo "SSH key provisioning."
    mkdir -p /home/vagrant/.ssh/
    touch /home/vagrant/.ssh/authorized_keys
    echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
    echo #{ssh_pub_key} > /home/vagrant/.ssh/id_rsa.pub
    chmod 644 /home/vagrant/.ssh/id_rsa.pub
    echo "#{ssh_prv_key}" > /home/vagrant/.ssh/id_rsa
    chmod 600 /home/vagrant/.ssh/id_rsa
    chown -R vagrant:vagrant /home/vagrant
    exit 0
  Shell
end
7
Stevie Howard

Aucun des postes plus anciens n'a fonctionné pour moi, même si certains se sont approchés. Je devais faire des clés RSA avec keygen dans le terminal et aller avec des clés personnalisées. En d'autres termes, vaincu d'utiliser les clés de vagabond. 

Je suis sur Mac OS Mojave à compter de la date de ce post. J'ai configuré deux boîtes Vagrant dans un fichier Vagrant. Je montre toute la première boîte pour que les débutants puissent voir le contexte. Je mets le dossier .ssh dans le même dossier que le fichier Vagrant, sinon, utilisez le programme d’installation user9091383.

Le crédit pour cette solution va à ce codeur.

Vagrant.configure("2") do |config|
  config.vm.define "pfbox", primary: true do |pfbox|
        pfbox.vm.box = "ubuntu/xenial64"
        pfbox.vm.network "forwarded_port", Host: 8084, guest: 80
        pfbox.vm.network "forwarded_port", Host: 8080, guest: 8080
        pfbox.vm.network "forwarded_port", Host: 8079, guest: 8079
        pfbox.vm.network "forwarded_port", Host: 3000, guest: 3000
        pfbox.vm.provision :Shell, path: ".provision/bootstrap.sh"
        pfbox.vm.synced_folder "ubuntu", "/home/vagrant"
        pfbox.vm.provision "file", source: "~/.gitconfig", destination: "~/.gitconfig"
        pfbox.vm.network "private_network", type: "dhcp"
        pfbox.vm.network "public_network"
        pfbox.ssh.insert_key = false
        ssh_key_path = ".ssh/"  # This may not be necessary.  I may remove.
        pfbox.vm.provision "Shell", inline: "mkdir -p /home/vagrant/.ssh"
        pfbox.ssh.private_key_path = ["~/.vagrant.d/insecure_private_key", ".ssh/id_rsa"]
        pfbox.vm.provision "file", source: ".ssh/id_rsa.pub", destination: ".ssh/authorized_keys"
        pfbox.vm.box_check_update = "true"
        pfbox.vm.hostname = "pfbox"
        # VirtualBox
          config.vm.provider "virtualbox" do |vb|
            # vb.gui = true
            vb.name = "pfbox" # friendly name for Oracle VM VirtualBox Manager
            vb.memory = 2048 # memory in megabytes 2.0 GB
            vb.cpus = 1 # cpu cores, can't be more than the Host actually has.
          end
  end
  config.vm.define "dbbox" do |dbbox|
        ...
0
Preston

C’est un excellent sujet qui m’a aidé à résoudre une situation similaire à celle décrite dans l’affiche originale.

Bien que j'aie finalement utilisé les paramètres/la logique présentés dans smartwjw's answer, je me suis heurté à un accroc puisque j'utilise la variable VAGRANT_HOME environment pour enregistrer le contenu du répertoire vagrant.d sur un disque dur externe sur l'un de mes développements systèmes.

Voici donc le code ajusté que j'utilise dans mon fichier Vagrant pour prendre en charge le paramétrage d’une variable d’environnement VAGRANT_HOME; la “magie” se passe dans cette ligne vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d":

config.ssh.insert_key = false
config.ssh.forward_agent = true
vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d"
config.ssh.private_key_path = ["#{vagrant_home_path}/insecure_private_key", "~/.ssh/id_rsa"]
config.vm.provision :Shell, privileged: false do |Shell_action|
  ssh_public_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  Shell_action.inline = <<-Shell
    echo #{ssh_public_key} >> /home/$USER/.ssh/authorized_keys
  Shell
end
0
JakeGould

Pour les approvisionneurs de shell inline - il est courant qu'une clé publique contienne des espaces, des commentaires, etc. Assurez-vous donc de mettre des guillemets (échappés) autour de la variable qui s'étend à la clé publique: 

config.vm.provision 'Shell', inline: "echo \"#{ssh_pub_key}\" >> /home/vagrant/.ssh/authorized_keys", privileged: false
0
Dick Visser

Madis Maenni réponse est la plus proche de la meilleure solution:

il suffit de faire:

vagrant ssh-config >> ~/.ssh/config
chmod 600 ~/.ssh/config

alors vous pouvez simplement ssh via hostname.

Pour obtenir la liste des noms d’hôte configurés dans ~/.ssh/config

grep -E '^Host ' ~/.ssh/config

Mon exemple:

$ grep -E '^Host' ~/.ssh/config
Host web
Host db
$ ssh web
[vagrant@web ~]$
0
Gregory