generate from existing create ssh vagrant public-key

ssh - from - ¿Cómo agrego mi propia clave pública a Vagrant VM?



vagrant save box (11)

Esta excelente respuesta fue agregada por el user76329 en una Edición sugerida rechazada

Ampliando el ejemplo de Meow , podemos copiar las claves locales pub / ssh privadas, establecer permisos y hacer que el script en línea sea idempotente (se ejecuta una vez y solo se repetirá si la condición de prueba falla, por lo que necesita aprovisionamiento):

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

Tengo un problema al agregar una clave ssh a una máquina virtual Vagrant. Básicamente, la configuración que tengo aquí funciona bien. Una vez que se crean las máquinas virtuales, puedo acceder a ellas a través de vagrant ssh , el usuario "vagabundo" existe y hay una clave ssh para este usuario en el archivo authorized_keys .

Lo que me gustaría hacer ahora es: poder conectarme a esas máquinas virtuales a través de ssh o usar scp . Por lo tanto, solo necesitaría agregar mi clave pública de id_rsa.pub a la authorized_keys , tal como lo haría con ssh-copy-id .

¿Hay alguna manera de decirle a Vagrant durante la configuración que se debe incluir mi clave pública? Si no es así (lo que es probable, según mis resultados de Google), ¿hay alguna manera de agregar fácilmente mi clave pública durante la configuración vagabunda?


Copiar la clave pública deseada caería directamente en la fase de provisioning . La respuesta exacta depende del aprovisionamiento que desee utilizar (shell, Chef, Puppet, etc.). Lo más trivial sería un aprovisionador de file para la clave, algo a lo largo de esto:

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

Bueno, en realidad necesita agregar a claves_autorizadas, usar un verdadero aprovisionador, como Puppet . Por ejemplo, consulte Gestión de claves autorizadas SSH con Puppet .


Este es un excelente hilo que me ayudó a resolver una situación similar a la que describe el póster original.

Si bien finalmente utilicé la configuración / lógica presentada en smartwjw’s respuesta smartwjw’s , me encontré con un problema ya que uso la variable de entorno VAGRANT_HOME para guardar el vagrant.d directorio core vagrant.d en un disco duro externo en uno de mis sistemas de desarrollo.

Así que aquí está el código ajustado que estoy usando en mi Vagrantfile para acomodar una variable de entorno VAGRANT_HOME que se está configurando; la "magia" ocurre en esta línea 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


Genere un par de claves rsa para la autenticación vagabunda ssh-keygen -f ~/.ssh/vagrant

También es posible que desee agregar los archivos de identidad vagabundos a su ~/.ssh/config

IdentityFile ~/.ssh/vagrant IdentityFile ~/.vagrant.d/insecure_private_key

Por alguna razón, no podemos simplemente especificar la clave que queremos insertar, así que tomamos algunos pasos adicionales para generar una clave nosotros mismos. De esta manera obtenemos seguridad y conocimiento de exactamente qué clave necesitamos (+ todas las cajas vagabundas obtendrán la misma clave)

No puedo enviar ssh a máquinas virtuales vagabundas usando la clave privada insegura (vagabundo 1.7.2) ¿Cómo agrego mi propia clave pública a la máquina virtual vagabunda?

config.ssh.insert_key = false config.ssh.private_key_path = [''~/.ssh/vagrant'', ''~/.vagrant.d/insecure_private_key''] config.vm.provision "file", source: "~/.ssh/vagrant.pub", destination: "/home/vagrant/.ssh/vagrant.pub" config.vm.provision "shell", inline: <<-SHELL cat /home/vagrant/.ssh/vagrant.pub >> /home/vagrant/.ssh/authorized_keys mkdir -p /root/.ssh cat /home/vagrant/.ssh/authorized_keys >> /root/.ssh/authorized_keys

CÁSCARA


Hay una forma más "elegante" de lograr lo que quieres hacer. Puede encontrar la clave privada existente y usarla en lugar de pasar por la molestia de agregar su clave pública.

Proceda de esta manera para ver la ruta a la clave privada existente (mire abajo para IdentityFile ):

correr

vagrant ssh-config

resultado:

$ vagrant ssh-config Host magento2.vagrant150 HostName 127.0.0.1 User vagrant Port 3150 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key" IdentitiesOnly yes LogLevel FATAL

Luego puede usar la clave privada como esta, tenga en cuenta también el interruptor para desactivar la autenticación de contraseña

ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key -o PasswordAuthentication=no [email protected] -p 3150


La respuesta de Madis Maenni es la más cercana a la mejor solución:

solo haz:

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

entonces puedes simplemente ssh a través del nombre de host.

Para obtener la lista de nombres de host configurados en ~ / .ssh / config

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

Mi ejemplo:

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


Ninguna de las publicaciones más antiguas funcionó para mí, aunque algunas se acercaron. Tuve que hacer claves rsa con keygen en la terminal e ir con claves personalizadas. En otras palabras, derrotado por usar las llaves de Vagrant.

Estoy en Mac OS Mojave a partir de la fecha de esta publicación. He configurado dos cajas Vagrant en un archivo Vagrant. Estoy mostrando todos los primeros cuadros para que los novatos puedan ver el contexto. Puse la carpeta .ssh en la misma carpeta que el archivo Vagrant; de lo contrario, use la configuración user9091383.

El crédito por esta solución va para este codificador.

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


Para los proveedores de shell en línea: es común que una clave pública contenga espacios, comentarios, etc. Por lo tanto, asegúrese de poner comillas (escapadas) alrededor de la variable que se expande a la clave pública:

config.vm.provision ''shell'', inline: "echo /"#{ssh_pub_key}/" >> /home/vagrant/.ssh/authorized_keys", privileged: false


Puede usar el módulo de archivo principal de Ruby, así:

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

Este ejemplo de trabajo agrega ~/.ssh/id_rsa.pub a las ~/.ssh/authorized_keys de los usuarios vagabundo y root, lo que le permitirá utilizar su clave SSH existente.


Termino usando código como:

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

Tenga en cuenta que no debemos codificar la ruta de acceso a /home/vagrant/.ssh/authorized_keys ya que algunos cuadros vagabundos no utilizan el nombre de usuario vagrant .


Un código más corto y más correcto debería ser:

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

De lo contrario, las .ssh/authorized_keys del usuario pertenecerán al usuario raíz.

Aún así, agregará una línea en cada ejecución de suministro, pero Vagrant se usa para pruebas y una VM generalmente tiene una vida útil corta, por lo que no es un gran problema.