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.