Seguridad

Riesgo #1

El primer riesgo potencial se inicia en la descarga de la imagen desde Internet. El uso de una ‘base box’ se traduce en el despliegue de un fichero empaquetado con un SO completo y que iniciaremos en nuestro equipo. Es decir, cuando se ejecuta el comando $ vagrant up, iniciamos un SO configurado por otra persona.

Por norma general, debemos usar ‘boxes’ con una fuente más o menos confiable, por ejemplo, hashicorp, ubuntu o chef.

Iniciando el SO invitado

Si ya hemos utilizado la ‘box’ ubuntu/trusty32 en alguno de nuestros proyectos anteriores, tendremos que eliminarla de nuestro sistema con el siguiente comando:

$ vagrant box remove ubuntu/trusty32

Verificamos que no está presente:

$ vagrant box list
$ vagrant box list | grep ubuntu

Ahora, si tenemos presente nuestro fichero ‘Vagrantfile’, e iniciamos el sistema invitado:

$ vagrant up

En la salida de este comando podemos observar la URL de descarga:

defautl: URL: https://atlas.hashicorp.com/ubuntu/trusty32

que la expande en la siguiente dirección:

default: Downloading: https://atlas.hashicorp.com/ubuntu/boxes/trusty32/versions/14.04/providers/virtualbox.box

Si intentamos descargar la URL anterior con el comando curl:

$ curl https://atlas.hashicorp.com/ubuntu/boxes/trusty32/versions/14.04/providers/virtualbox.box

obtenemos la siguiente respuesta:

<html>
   <body>
   You are being <a href="http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-i386-vagrant-disk1.box">redirected</a>.
   </body>
</html>

De este modo podemos descargar la imagen que se utilizará en nuestro equipo.

Configuración por defecto de una MV

La configuración por defecto de una MV tiene las siguientes propiedades:

  • Un puerto redirigido: El puerto 2222 del anfitrión está redirigido al puerto 22 del invitado.
  • Directorio compartido: El directorio donde está guardado el fichero ‘Vagrantfile’ es compartido entre el anfitrión y el invitado.

Se puede verificar el estado de las configuraciones anteriores a través de la interfaz de administración de VirtualBox.

> Siempre que hagamos uso de la redirección de puertos de un sistema invitado, debemos asegurarnos de que sólo son accesible por el equipo anfitrión, a no ser que estemos seguros de que queremos aplicar otra configuración diferente.

Riesgo #2

Como hemos visto, Vagrant sólo publica un puerto del sistema invitado. No importan los servicios que puedan estar ejecutandose en el sistema invitado, el único ‘daemon’ accesible es sshd. Y además, sólo se permiten conexiones que se inicien en el sistema anfitrión.

Cuando activemos otros puertos, debemos replicar esta configuración. Nuestro sistema invitado no debe exponer ningún servicio a toda la red. Una forma de aplicar esta restricción es hacer uso del parámetro host_ip, dentro de la regla :forwarded_port:

config.vm.network :forwarded_port, guest: 80, host: 8888, host_ip: "127.0.0.1"

Directorios compartidos

Cuando ejecutamos $ vagrant up, se comparte el directorio del proyecto, como se puede comprobar en la salida del comando:

==> default: Mounting shared folders...
default: /vagrant => /ejemplos/nuevo-proyecto

El directorio /ejemplos/nuevo-proyecto, es accesible desde el sistema invitado a través del directorio /vagrant.

Directorio anfitrión                                         Directorio invitado
/ejemplos/nuevo-proyecto             <===>                   /vagrant

La definición de un directorio compartido se refleja en Vagrant a través de la siguiente configuración:

config.vm.synced_folder [HOST-PATH], [GUEST-PATH]

Ejercicio:

Comprobar la configuración de directorios compartidos en el proyecto songs-angularjs-app.

Trabajando con SSH

El método más habitual de uso de SSH es a través de la línea de comandos, por ejemplo:

$ ssh bob@example.net

Cuando ejecutamos un sistema invitado, podemos iniciar una sesión SSH de una forma más simple $ vagrant ssh. Este proceso es muy simple porque hace uso de diferentes valores que ya están configurados. Estes valores pueden ser comprobados con el siguiente comando:

$ vagrant ssh-config

En el caso de que tengamos varias máquinas invitadas corriendo al mismo tiempo, Vagrant se encarga de evitar colisiones en los puertos utilizados para conectarnos con las mismas. Por ejemplo, una segunda máquina invitada tendrá acceso a través del puerto 2200, en lugar del 2222, que ya está ocupado.

De todas formas, siempre se puede utilizar el método clásico de SSH para conectarnos a nuestro sistema invitado:

$ ssh -p2222 vagrant@127.0.0.1

Las credenciales son las siguientes:

username: vagrant
password: vagrant

Gestionando diferentes sistemas invitados

Cuando trabajamos con sesiones SSH en diferentes máquinas invitadas, podemos llegar a un momento de confusión, y no saber exactamente en que máquina estamos conectados. Para ayudarnos en la tarea de reconocimiento de la máquina invitada, podemos ejecutar el siguiente comando (dentro del invitado):

$ guestvm

Riesgo #3

Como ya habremos advertido en las secciones anteriores, las credenciales usadas por defecto en los sistemas invitados, suponen otro riesgo para la seguridad de nuestros sistemas. Sobre todo, porque el usuario ‘vagrant’ posee permisos de sudo. La única restricción es que se debe iniciar la sesión desde la máquina anfitrión.

Para mitigar este riesgo, debemos modificar la contraseña del usuario ‘vagrant’:

$ passwd

Acceso SSH con llave privada

Aparte del método de acceso SSH a través de las credenciales anteriores, también podemos iniciar una sesión haciendo uso de llaves RSA: una pública y una privada, guardadas en diferentes ficheros.

~/.ssh/id_rsa     - private key
~/.ssh/id_rsa.pub - public key

Este es el método utilizado por $ vagrant ssh, con la siguiente configuración:

  • La llave privada se guarda en el sistema anfitrión en ~/.vagrant.d/insecure_private_key.
  • La llave pública se guarda en el sistema invitado en /home/vagrant/.ssh/authorized_keys.

Ejercicio:

Crear un nuevo par de llaves para reemplazar/añadir a las creadas por defecto.

Riesgo #4

Todas las imágenes que se descargan de Internet incorporan las mismas llaves, por lo que cualquier usuario tiene acceso a ese par de llaves. Las últimas versiones de Vagrant minimizan este riesgo creando un nuevo par durante la creación del sistema invitado $ vagrant up.

Recargar el sistema invitado

Cuando aplicamos algún cambio en el fichero ‘Vagrantfile’, para que tengan efecto en el sistema invitado debemos ejecutar el siguiente comando:

$ vagrant reload

Por ejemplo, podemos modificar el puerto de escucha del proyecto ‘Songs for kids’, hacia el 9876:

config.vm.network :forwarded_port, guest: 80, host: 9876, host_ip: "127.0.0.1"

Una vez que recarguemos nuestro sistema, la aplicación estará disponible en http://127.0.0.1:9876.