Tutorial de Vagrant (con anécdota incluida)

Vagrant es una herramienta para “crear y configurar entornos de desarrollo livianos, reproducibles y portables”. En otras palabras puedes crear máquinas virtuales con los programas que necesites con la configuración que necesites de forma rápida con unos pocos archivos de texto.

En lo que respecta a la seguridad de la información es muy útil ya que podemos probar infinidad de técnicas sin tener que arriesgar la seguridad de nuestras propias máquinas, podemos hacer muchas pruebas del mismo ataque en diferentes distribuciones, podemos reproducir un ataque desde 0 para fines educativos, podemos hacer todo lo que queramos en la máquina sin miedo a dañarla ya que es muy fácil volver a crearla, además de muchas otras ventajas.

En este tutorial les enseñaremos a usar Vagrant en su primer proyecto lo que les dará acceso a la gran mayoría de sus ventajas.

Terminología

Cualquier máquina virtual manejada por vagrant es conocida como una vagrant box, puedes incluso crear tus propias vagrant boxes (el link esta un poco desactualizado pero no se gana mucho valor siguiendo ese camino). Para buscar muchas otras vagrant boxes que te sirvan de base para otras cosas ir a este enlace, pero yo recomiendo usar solo boxes básicas y relativamente limpias como las encontradas en este enlace (algunas demasiado básicas tienen problemas al montar carpetas compartidas y haciendo conexiones ssh por eso usamos las de boxcutter).

Instalación

En este tutorial vamos a utilizar Vagrant con virtualbox, pero vagrant puede manejar máquinas virtuales en aws, docker, vmware, etc.

Primero procedemos a Instalar virtualbox. En debian o ubuntu descargas el instalador desde este link y luego lo instalas desde la consola ejecutando $ sudo dpkg -i <instaladorVirtualbox.deb>

Para instalar las dependencias ejecuta: $ sudo apt-get install -f, cualquier otro problema lo puedes poner en los comentarios.

Para descargar vagrant ir a este enlace y descargar lo que necesitan.

Para ubuntu o debian se descarga un archivo .deb y para instalarlo se ejecuta $ sudo dpkg -i <instaladorVagrant.deb>

Por último y como pequeño truco extra vamos a instalar vagrant-vbguest este plugin se encarga de mantener los guest additions actualizados con respecto a la box que se maneje, no necesitas saber que es un guest addition ni siquiera que es un plugin de vagrant lo que sí podrías saber es que esto evita algunos otros errores y te permite usar la gui de las boxes con menos problemas si alguna vez la necesitas. En debian (y ubuntu y windows) $ vagrant plugin install vagrant-vbguest

En windows para instalar virtualbox o vagrant se utiliza un .exe o instalador por lo que solo es necesario seguir las instrucciones; siguiente, siguiente, etc. Para poder instalar vagrant-vbguest hay que asegurarse que vagrant este en la variable PATH de windows.

Para más información

Vagrant tiene un sinfín de aplicaciones; se pueden manejar más de una máquina virtual o se puede compartir la maquina en internet o como ya había mencionado se puede ejecutar en docker, aws, etc. Para conocer sobre estas funciones puedes ir a este link. Por lo general lo que se usa de Vagrant siempre es el mismo subset por lo que no es necesario aprenderlo todo y lo útil se cubre (teniendo muy en cuenta maximizar la efectividad del tiempo del lector) en este post. Para las partes más interesantes y más funciones Vagrant es mezclado con otras herramientas -ansible- que explicaremos en nuestros post subsecuentes.

“Up and Running”

Vagrant se encarga de descargar las boxes y ponerlas en tu equipo para que cuando necesitas ese misma box no tengas que usar el internet y puedas crear una nueva box de forma más rápida. El comando $ vagrant init BoxNombre se encarga de descargar el box si es necesario y crear el archivo Vagrantfile para manejar la Vagrant box.

Ejecutamos $ vagrant init boxcuter/debian8

Luego ejecutamos $ vagrant up

Esto crea la máquina como tal, y la pone a correr. Ahora para comunicarte con ella usas los comandos de Vagrant.

Por default todo lo que pongas en el directorio que contiene el archivo Vagrantfile se pondrá en un directorio compartido /vagrant/ para compartir otros directorios usamos la configuración en el archivo Vagrantfile que te explicamos brevemente más adelante.

Ya con la vagrant box corriendo nos conectamos a ella ejecutando $ vagrant ssh

Y entonces ya estamos en la máquina virtual y podemos ejecutar lo que queramos incluso una bomba lógica y ver que pasa:

Ahora vamos a intentar borrar el sistema:

!!PELIGRO / DANGER!! Tratar de borrar el sistema incluso de una máquina virtual tiene que ser realizado con mucha cautela y solo lo recomendamos para niveles intermedios y para personas que estén cómodas y entiendan lo que van a realizar y siento necesario recordar el disclaimer.

Si saben que pasa cuando uno ejecuta $ rm -rf / en debian cierto?, pide sudo? adivinen en los comentarios y luego revisen aquí.

Como pequeña anécdota (pueden saltar hasta Comandos de Vagrant si quieren) en el making off del post borre el home del usuario que genere para hacer las pruebas 2 veces xD, tienen que tener en cuenta que estos archivos no me importaban mucho y no eran un archivos críticos para hacer un backup o un plan de testing antes de hacer cualquier cosa peligrosa. La primera vez fue bastante obvia, algunos habrán notado que ejecute la Vagrant box desde el home del usuario.

Como les explico en este mismo post la carpeta en la que está Vagrantfile es compartida en la carpeta /vagrant de la Vagrant box la cual fue borrada por completo (borre el home :(, para ser sincero la primera vez se me ocurrió que podía pasar antes de ejecutarlo).

Entonces no sólo borró la Vagrantfile sino también el directorio .vagrant.d/ (el cual si se salió de mis cálculos) que contiene las boxes bases para los usuarios. Esto llevó a tener que ejecutar $vagrant init boxcutter/debian8 y que descargara todo lo necesario a las 3 am a lo cual obviamente le saque foto para quejarme públicamente xD.

Cuando finalmente descargo y pude ejecutar de nuevo $ vagrant up fue que se me ocurrió que necesitaría un directorio. Yo para “ahorrar” tiempo utilice un viejo truco y pase el directorio .vagrant/ con el Vagrantfile al nuevo directorio pero al no estar seguro copie también el archivo .vagrant.d/ del home y cuando ejecute el comando famoso no borro lo que correspondía a la carpeta en donde estaba (nombre ~/noBorrarElHome/ dulce ironía) sino la carpeta que estaba en la configuración anterior en el folder .vagrant/ original(/home/user/) y se volvió a borrar todo incluyendo unas capturas incluyendo mi foto para quejarme :’|.

Tuve que volver a hacer las capturas pero por la que gasté en vano más de media hora a las 4 am tratando de recuperar los archivos nunca nadie la verá. También me dejó un bonito error que me obligó a terminar la sesión del usuario y ejecutar muchas cosas de nuevo.

Por cierto esto es lo que pasa cuando el rm (quitando el failsafe) termina.

Comandos de Vagrant

Vagrant tiene muchos comandos estos son los básicos para usar cualquier vagrant box.

vagrant up

vagrant up Crea la Vagrant box y la primera vez que lo ejecutas hace las tareas de “provision”. También pone a correr la box justo después de crearla o cuando ha sido apagado o suspendida.

vagrant suspend

vagrant suspend Este comando “pausa” la máquina virtual. Guarda el estado actual(ram) de la box y la para (utiliza más disco para guardar la ram).

vagrant halt

vagrant halt Apaga la vagrant box como se apagaría cualquier máquina. No se conserva el estado de la ram.

vagrant destroy

vagrant destroy Permanentemente borra la máquina virtual de tu computador.

vagrant reload

vagrant reload Hace un reboot de la máquina y ejecuta cualquier cambio que se haya presentado en el Vagrantfile si se usa la flag –provision se ejecutan las tareas de provisión que te explicaremos más adelante.

vagrant ssh

vagrant ssh Este comando te conecta por ssh a la máquina virtual. Básicamente genera una consola en la máquina virtual que podemos usar para lo que queramos.

Vagrantfile

La sintaxis del archivo Vagrantfile es Ruby tanto así que se pueden utilizar condicionales y loops e incluso usar librerías de Ruby como yaml, esto sirve si quieres ingresar archivos de configuración que también utilice ansible o para manejar un cluster de máquinas virtuales.

Ahora te presentamos una versión simple de una Vagrantfile con las opciones más importantes:

Vagrant.configure("2") do |config|

  config.vm.box = "boxcutter/debian8"

  config.vm.network "forwarded_port", guest: 80, host: 8080

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.synced_folder "../data", "/vagrant_data"

  # GUI
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
  end

  # PROVISION
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y apache2
  SHELL
  
end

config.vm.box = “boxcutter/debian8” Indica la Vagrant box que se está usando.

config.vm.network “forwarded_port”, guest: 80, host: 8080 Crea un mapeo de puertos que permite acceso a un puerto en la máquina guest(vagrant box) desde un puerto en la máquina host(nuestra máquina). En el ejemplo al conectarse a localhost:8080 nos estaremos conectando al puerto 80 de la máquina guest.

config.vm.network “private_network”, ip: “192.168.33.10” Crea una red privada que permite que solo el host se puede conectar a la máquina con una ip específica.

config.vm.synced_folder “../data”, “/vagrant_data” Crea una carpeta compartida que se mantendrá actualizada entre las dos máquinas. El primer argumento es la dirección de la carpeta en la máquina del host y el segundo es la dirección de la carpeta en la máquina del guest.-Nunca pongan como segundo argumento “/home/vagrant” porque ahí es donde se guarda la configuración de ssh que se borrara, entonces $ vagrant ssh fallará-

Las líneas que tienen el comentario #GUI al principio sirven para habilitar la gui de la máquina guest que se inicia cuando se ejecuta $ vagrant up -Como otro tip, utilizar la gui sirve para debuggear incluso errores donde la máquina virtual no tiene conexión a la red

Las líneas que tiene el comentario #PROVISION al principio sirven para ejecutar tareas de provisión, osea instalan programas y crean configuraciones que son específicas de su proyecto, en el ejemplo simplemente se corre un comando inline que instala apache2.

Consideraciones de seguridad de Vagrant

El usuario default de Vagrant es vagrant y su contraseña es vagrant y cualquier comando ejecutado con sudo no requiere password. Además generalmente la llave privada para vagrant ssh es la misma para todas las maquinas; pero dado que generalmente es una maquina virtual local tiene cierto nivel de protección. Claro que estos hechos hay que tenerlos en cuenta cuando se quiera realizar funciones diferentes.

Comentarios finales

En el texto de pronto aparecen muchos tips para evitar bugs; por lo que ustedes pueden llegar a creer que Vagrant está plagado de los mismos. Pero los errores no son tan comunes solo que cuando se ha usado algo tan extensamente siempre se encuentran algunas dificultades que les queremos evitar a todos nuestros lectores.

Haciendo este post entendí porque la carpeta default para compartir de vagrant es /vagrant espero ustedes también hayan aprendido algo y que disfrutaran de este post. Recuerden compartir y unirte a nuestras redes sociales.

Facebook Twitter Instagram

0 comments on “Tutorial de Vagrant (con anécdota incluida)Add yours →

Leave a Reply

Your email address will not be published. Required fields are marked *