LIBRO - DevOps y Seguridad Cloud. Caparrós, Cubero, Guijarro (2017)
LIBRO - DevOps y Seguridad Cloud. Caparrós, Cubero, Guijarro (2017)
LIBRO - DevOps y Seguridad Cloud. Caparrós, Cubero, Guijarro (2017)
seguridad cloud
PID_00241996
Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio, sea éste eléctrico,
químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
de los titulares del copyright.
© FUOC • PID_00241996 3 DevOps y seguridad cloud
Contenidos
Módulo didáctico 1
Infraestructura DevOps
Joan Caparrós Ramírez, Lorenzo Cubero Luque y Jordi Guijarro Olivares
1. Introducción a DevOps
2. Fundamentos avanzados de DevOps
3. Infraestructura PaaS privada basada en contenedores: el caso Docker
4. Infraestructura PaaS pública: Cloud9, Heroku
Módulo didáctico 2
Casos de uso PaaS y de automatización completa
Joan Caparrós Ramírez, Lorenzo Cubero Luque y Jordi Guijarro Olivares
1. Caso de uso 1: Docker Machine y OpenNebula
2. Caso de uso 2: Docker Swarm Cluster con Consul sobre OpenNebula
3. Caso de uso 3: Balanceo transparente con Docker Swarm, Compose y
Consul
4. Herramientas de automatización completa y testing: Jenkins
Módulo didáctico 3
Introducción a la seguridad en cloud computing
Joan Caparrós Ramírez, Lorenzo Cubero Luque y Jordi Guijarro Olivares
1. Principales riesgos, patrones y mitigación proactiva de amenazas
2. Gestión de riesgos e incidentes de seguridad en cloud
3. Caso de Uso I: Seguridad en entornos IaaS públicos
4. Caso de uso II: Seguridad en entornos PaaS privados basados en Docker
5. Herramientas de seguridad
Infraestructura
DevOps
PID_00241997
Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio, sea éste eléctrico,
químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
de los titulares del copyright.
© FUOC • PID_00241997 Infraestructura DevOps
Índice
Objetivos....................................................................................................... 5
1. Introducción a DevOps..................................................................... 7
1.1. El origen de la cultura DevOps ................................................... 7
1.2. Metodologías sobre las que trabaja DevOps ............................... 8
Bibliografía................................................................................................. 85
© FUOC • PID_00241997 5 Infraestructura DevOps
Objetivos
1. Introducción a DevOps
Hoy en día las organizaciones que adoptan los principios y prácticas DevOps Enlace de interés
son capaces de realizar a diario centenares e incluso miles de cambios en sus
Si queréis saber más sobre
sistemas de producción. La ventaja competitiva de las empresas aumenta pro- Lean, podéis consultar el
porcionalmente a su time to market o capacidad de adaptar su producto al mer- siguiente enlace: <http://
www.lean.org/WhatsLean>.
cado lo antes posible; las organizaciones que no se preparen para acometer un
gran volumen de cambios diarios en su producto están condenadas a perder
en el mercado en el que compiten, incluso a quedarse fuera de este a largo
plazo, como ya ocurrió en el sector industrial con las empresas que no adop-
taron los principios Lean[1].
Del movimiento Lean, DevOps toma las técnicas Value Stream Mapping, los
Kanban Board y el Total Productive Maintenance.
Típicamente, se miden los tiempos que añaden valor al producto y los tiempos
que no añaden ningún valor; estos últimos se denominan pérdida o muda.
Figura 1. Tablero Kanban donde una tarea ha sido testada y espera a ser desplegada
Fuente: http://kanbanblog.com/explained/.
Permite visualizar las tareas y su estado actual dentro del flujo de trabajo, lo
que ayuda a entender cómo avanza el flujo de trabajo. La utilización de un
Kanban Board va asociada a una reducción de las tareas actualmente en proce-
so, focalizando así los esfuerzos en finalizar tareas en vez de empezar nuevas, lo
que aumentaría el número de tareas pendientes. Permite dirigir y gestionar el
flujo por medio de la supervisión, medición y realización de informes de tra-
bajo a nivel de estado. Por último, cabe comentar que esta es una herramienta
excelente para promover mejoras, puesto que al restringir el número de tareas
en circulación se destacan las áreas con problemas y esto facilita su resolución.
El Manifiesto� para� el� desarrollo� ágil de software fue firmado en 2001 por
los principales pensadores de desarrollo de software de la época. Estos querían
crear un conjunto ligero de valores y principios en contra de los procesos de
desarrollo tradicionales, como por ejemplo el método de desarrollo en cascada
o metodologías como el Proceso Racional Unificado.
© FUOC • PID_00241997 10 Infraestructura DevOps
Uno de los principios principales es entregar con frecuencia software que fun-
cione, desde un par de semanas hasta un par de meses, con preferencia por la
escala de tiempo más corta, haciendo clara alusión a su inclinación a desarro-
llar pequeños cambios o, dicho de otro modo, a entregar al cliente versiones
incrementales de manera frecuente.
2.1. Introducción
Una vez vistos los conceptos básicos sobre DevOps, entramos en esta sección
en la materia necesaria para tener una visión más avanzada sobre el enfoque
del rol de DevOps.
Cabe mencionar también que durante este capítulo está en el ánimo de los
autores que se vayan examinando herramientas específicas y ejemplos donde
el lector pueda ir viendo aplicaciones directas de los conceptos vistos.
Algunas poseen máquinas físicas donde estas ejecutan el rol de servidor y ofre-
cen acceso a las aplicaciones desarrolladas. Esta forma de disposición de servi-
dores es una visión clásica y simple, muy utilizada durante años, con obvias
dificultades durante procesos habituales de migraciones de entorno y cambios
o ampliaciones exigidos en el hardware utilizado.
Una visión más moderna, con una perspectiva más amplia sobre los sistemas,
intentaría desvincular las máquinas físicas de los entornos de despliegue de
servidores, haciendo que estos sistemas sean más flexibles mediante la utili-
zación de herramientas de virtualización, como VMware, Xen, KVM, Virtual-
Box, entre otras.
2.2.1. Ansible
Ansible es una plataforma de software libre (GPLv3) desarrollada en python Enlace de interés
y ofrecida comercialmente por AnsibleWorks. Brinda una forma simple de au-
Para saber más sobre Ansi-
tomatización de procesos TI. Puede configurar sistemas, realizar despliegues ble, podéis consultar el si-
de software y efectuar tareas avanzadas de despliegues continuos. guiente enlace: <https://
www.ansible.com/how-ansi-
ble-works>.
Estas son quizá sus características más importantes:
Los playbooks son ficheros escritos en formato YAML, que pueden presentarse
en forma de un solo fichero o siguiendo un modelo estructurado, y contienen
todos los parámetros necesarios para realizar una determinada tarea sobre un
grupo de servidores.
© FUOC • PID_00241997 14 Infraestructura DevOps
Fuente: <https://terry.im/wiki/terry/Ansible.html>.
«La integración continua es una práctica de desarrollo de software en la cual los miem-
bros de un equipo integran su trabajo frecuentemente, como mínimo de forma diaria.
Cada integración se verifica mediante una herramienta de construcción automática para
detectar los errores de integración tan pronto como sea posible. Muchos equipos creen
que este enfoque lleva a una reducción significativa de los problemas de integración y
permite a un equipo desarrollar software cohesivo de forma más rápida».
Las nuevas aportaciones serán dispuestas dentro del control de versiones (CVS,
Git, Subversion, Mercurial o Microsoft Visual SourceSafe) donde se guardarán
en el respectivo repositorio. El propósito de la integración continua será el de
© FUOC • PID_00241997 15 Infraestructura DevOps
Una vez que los cambios superan todas las pruebas, estos como tales pueden
ser integrados en el control de versiones de manera definitiva. La forma más
sencilla de ver reflejado este proceso se encontraría en la ejecución de estos test
donde el repositorio utilizado es el local y hasta no haber superado todas las
fases de comprobaciones estos no serán subidos al repositorio remoto. Estos
procesos pueden abstraerse a los repositorios remotos; ya existen métodos para
ejecutar el código durante el llamado pull-request antes de asimilarlos dentro
de la rama principal del proyecto.
Fuente: <http://www.retrieverconsulting.com/Continuous%20Integration%20Workflow.jpg>.
© FUOC • PID_00241997 16 Infraestructura DevOps
1)�Mantener�un�único�repositorio�de�código�fuente
Dentro del repositorio habrá que incluir todos aquellos ficheros necesarios
para poder construir nuestro proyecto. Hay que dar la posibilidad de que, una
vez descargada la última versión, cualquier usuario pueda compilar, desplegar
y ejecutar el proyecto de forma íntegra.
2)�Automatizar�la�construcción�del�proyecto
3)�Elaboración�y�ejecución�de�los�test�dentro�de�la�construcción�del�pro-
yecto
4)�Integrar�como�mínimo�una�vez�al�día�los�cambios�en�la�línea�principal
5)�Construir�la�línea�principal�en�la�máquina�de�integración
Las construcciones podrán realizarse de forma manual (en este caso el desa-
rrollador construirá el proyecto y quedará pendiente del resultado de este) o
mediante la utilización de un servidor de integración continua en el que se
construirán todas las aportaciones integradas a la línea principal de proyecto
y que reportará automáticamente a los desarrolladores cualquier error que du-
rante el proceso de construcción haya detectado.
6)�Mantener�una�ejecución�rápida�de�la�construcción�del�proyecto
7)�Mantener�las�pruebas�de�integración�en�máquinas�réplicas�del�entorno
de�producción
8)�Almacenar�los�ejecutables�de�las�versiones�del�proyecto
Será importante mantener almacenados estos binarios para que todo el equipo
involucrado en el desarrollo del software pueda ejecutar la última versión,
facilitando las demostraciones y revisiones de los últimos cambios en la línea
principal del proyecto.
9)�Percepción�rápida�del�estado�y�cambios�del�sistema
Todos los miembros del equipo deben saber el estado en el que se encuentra la
línea principal del proyecto, Las herramientas web de los actuales servidores
de integración continua también tienen como misión la de informar en qué
estado se encuentra el proyecto, si se han aplicado cambios y si se han encon-
trado errores durante el proceso.
La comunicación del estado del proyecto es una de las partes más importantes,
y para ello existen soluciones elaboradas y creativas pero igual de efectivas
usando luces, lámparas de lava verdes y rojas totalmente integradas dentro del
sistema, semáforos de estado del servidor y una multitud de ideas para hacer
de este un proceso visible para todo el equipo.
© FUOC • PID_00241997 19 Infraestructura DevOps
Fuente: <https://en.wikipedia.org/wiki/Build_light_indicator>.
10)�Automatizar�el�despliegue
Vistas las ventajas de la integración continua, cabe señalar que existen distin-
tas herramientas que nos permitirán efectuar esta tarea. En este módulo co-
mentaremos una de las más usadas: Jenkins, que permite la elaboración com-
pleta del pipeline, desde la incorporación de código hasta el despliegue en los
distintos entornos.
• CruiseControl.
• CruiseControl.NET.
• CruiseControl.rb.
• Cruise.
• CI Factory.
• Drumbeat CI.
• Tinderbox & Tinderbox2.
• BuildBot.
• Anthill Professional.
• Anthill.
• Bamboo.
• Luntbuild professional.
• LuntBuild.
• Gump.
• Continuum.
• Sin.
• OpenMake Meister.
• OpenMake Mojo.
• Parabuild.
• Tinderbox3.
• Pulse.
• TeamCity(EAP).
• Jenkins.
• FinalBuilder Server.
• Zed.
© FUOC • PID_00241997 21 Infraestructura DevOps
• easyCIS.
• RedJack.
Por otro lado, Jenkins es fácilmente clusterizable, lo que implica que se pueden
tener varios esclavos configurados en el mismo servidor maestro. La ventaja
más obvia es que se puede balancear la carga de los diferentes proyectos en
varios servidores; otra ventaja es que los esclavos pueden basarse en diferentes
arquitecturas, con lo cual se pueden compilar aplicaciones basadas en Linux
y otras en Windows bajo el mismo servidor maestro.
Otra característica de Jenkins son sus integraciones con Git, JMeter, SOAP-UI,
JUnit, Sonar, Nexus, etc. Esto permite ejecutar, por ejemplo, una batería de
test antes de proceder a la compilación del código con el objetivo de asegurar
un cierto grado de calidad, llegando incluso a abortar la compilación si los
resultados de los test no son satisfactorios.
Por último, Jenkins está diseñado para estar en constante comunicación con
los desarrolladores, y para ello consta de un potente sistema de notificaciones
para seguir el estado de los diferentes proyectos. Jenkins es capaz de enviar
correos, tuitear, activar señales luminosas o incluso sonoras, y mucho más
gracias a su amplia API.
© FUOC • PID_00241997 22 Infraestructura DevOps
Fuente: <https://code2read.files.wordpress.com/2015/11/jenkins.png>.
Hemos visto que la integración continua va unida a una filosofía de agilización Enlace de interés
de los métodos adoptados por todos los miembros involucrados en el proyecto,
Para saber más sobre
pero ¿qué hay de la calidad del software? Es obvio que la calidad del producto estrategias de testing,
desarrollado tendrá que cumplir con los requerimientos funcionales acordados podéis consultar el si-
guiente enlace: <http://
en todas las fases de entrega. www.carlescliment.com/pu-
blications/calidad-e-integra-
cion-continua-enero-2012>.
En muchas ocasiones habremos escuchado «la fase de pruebas del proyecto se
ejecutará al final» o «no hay tiempo para poder aplicarlos de forma correcta»,
dando a entender que el proceso de QA demora el tiempo de desarrollo; este
modo de pensar no existe dentro de la metodología de integración continua.
1) Fast (rápido). Cuanto más rápidos se ejecuten los test, mayor será la fre-
cuencia con la que se ejecutarán. Los desarrolladores –mediante la ejecución
de subconjuntos de pruebas– pueden agilizar la fase de pruebas. Cabe remarcar
que antes de que el proyecto pase a producción se tendrán que haber pasado
el total de las pruebas; de lo contrario, no se podrá verificar que el software
desarrollado esté perfectamente acoplado, ya que se habrán testado sus partes
pero no en su totalidad.
2) Isolated (aislado). Cada test debe tener una sola razón para fallar. El diseño
de cada prueba tiene que ser independiente de los factores externos e indepen-
diente de los resultados de test anteriores. La ordenación de pruebas unitarias
para mejorar el tiempo de ejecución es una señal de falta de aislamiento.
3) Repeatable (repetible). Los test deben devolver información sobre si han te-
nido éxito o no, y deben obtener los mismos resultados cada vez que se eje-
cutan. Ocasionalmente, las pruebas pueden fallar intermitentemente, debido
a razones de sobre-especificación en la fase de test, lentitud en la carga de de-
pendencias, uso de threads y procesos no deterministas, volatilidad de datos,
etc. En cualquier caso, los fallos ocasionales o intermitentes serán difíciles de
definir.
Las pruebas escritas a posteriori requieren un esfuerzo adicional para los desa-
rrolladores, que deberán refactorizar el código hasta tener una batería de test
que cumplan con los principios mencionados (FIRST). Este modo de trabajar
da una sensación de invertir demasiado tiempo en el «pulido» de código y
puede desembocar en un abandono del desarrollo de pruebas.
Brian Marick en el 2003 expuso por primera vez en su blog la idea de clasificar
los diferentes tipos de pruebas ejecutadas durante el desarrollo del producto en
cuatro cuadrantes. Posteriormente, esta idea fue mejorada hasta resultar en la
imagen actual de los cuadrantes del Agile Testing. La misión fundamental de
la clasificación de las pruebas es ayudar a contextualizar y guiar a los equipos
durante la integración de las pruebas para garantizar la calidad del producto
desarrollado.
Así pues, se presenta una matriz 2 x 2 donde los ejes definirán las pruebas
desde los diferentes puntos de vista posibles:
Fuente: <http://www.pmoinformatica.com/2015/03/que-es-el-agile-testing.html>.
Esta forma de pensar fue diseñada para encontrar errores, dentro de una men-
talidad tradicional por etapas en las que se codifica y se corrige. Los desarrolla-
dores parten de la idea de que su código es perfecto, y a continuación el equipo
de test prueba a conciencia el producto para reportar cualquier problema en
caso de ser detectado, lo que alarga considerablemente la fase de codificación
y prueba.
Desde el punto de vista del Agile Testing, la pirámide aparece de forma inver-
tida (lado derecho de la figura 7). Esta nueva manera de enfocar las pruebas
presenta una base sólida, donde la automatización adquirirá un peso impor-
tante y con ello una mayor contribución por parte de los desarrolladores para
evitar errores. La parte superior de la pirámide es muy pequeña, la interfaz del
usuario es un elemento cambiante, cualquier modificación significa un cam-
© FUOC • PID_00241997 27 Infraestructura DevOps
La automatización de los procesos de test implica una visión clara del sistema
y cómo este debe ejecutarse, asegurando que cada vez que se pasan los test, el
código desarrollado cumpla las especificaciones funcionales de forma correcta.
La esencia del nivel medio de la pirámide recaerá en la capa lógica de nuestro
software (reglas de negocio, servicios...), que encontraremos inmediatamente
por debajo de la interfaz gráfica; así, en esta capa las pruebas automatizadas
pueden ser ejecutadas asegurando que estas funcionan correctamente sin tener
que utilizar la interfaz de usuario con herramientas tipo Selenium.
En esta fase aparecen diferentes enfoques sobre cómo realizar las pruebas, ba-
sándose en distintas prácticas relacionadas con el Agile Testing.
• No se deberá escribir más código que el suficiente para hacer pasar el test
actual.
© FUOC • PID_00241997 28 Infraestructura DevOps
Ejecutando estas tres leyes se entrará en un ciclo rápido, en el que será nece-
sario iterar varias docenas de veces antes de finalizar una unidad de test com-
pleta.
Red�-�Green�-�Refactor
Este método se interpreta como un microciclo dentro del desarrollo dirigido Cita
por pruebas, y es ejecutado en cada comprobación total de los test o cada n
«Make it work. Make it right.
ciclos de estos. El proceso empezará con la definición de una prueba que falle, Make it fast». Ken Beckt
fase que es conocida como Red por el color en el que se suelen mostrar los «Getting software to work is
only half of the job». Robert C.
resultados fallidos en las herramientas de testing. Martin
Dado un test fallido, el segundo paso será implementar el código mínimo para
hacer que este lo pase; en este momento nos encontraremos en fase Green.
El último paso dentro del ciclo Red - Green - Refactor se centra en la limpieza
de código, eliminando duplicidades y refactorizando el código.
Esta filosofía está basada en la idea de que nuestra mente está limitada y no es
capaz de llevar a cabo dos objetivos simultáneamente: hacer que el software
funcione correctamente y que el software posea una estructura correcta.
La ejecución de las fases del TDD define una continua modificación del códi-
go, donde en cualquier momento del desarrollo pueden surgir carencias de
funcionalidades o comportamientos no esperados del software. Las pruebas
de regresión intentan descubrir los errores producidos por cambios dentro del
proyecto. Estos errores normalmente son producidos por errores en la contex-
tualización, que exponen fragilidades del rediseño de nuestra aplicación.
Gracias a este proceso, podemos evitar largas puestas en producción, las sor-
presas de última hora y los cambios muy grandes y costosos, evitando que
haya demasiada incertidumbre a la hora de la entrega y teniendo un mayor
control sobre todo el proceso.
© FUOC • PID_00241997 30 Infraestructura DevOps
Esta metodología es usada por grandes compañías, como Flickr, con varios
despliegues diarios; Amazon, liberando en producción una versión cada 11,6
segundos de media; y Facebook, desplegando la compilación de código en
producción al menos una vez al día con cambios menores o una vez a la se-
mana con cambios mayores.
Fuente: <https://s3.amazonaws.com/media-p.slid.es/uploads/stevenmaguire/images/723464/chart-continuous-delivery.png>.
En este caso, Jenkins nos ofrece la flexibilidad tanto de acceder a los servidores
de producción para hacer la transferencia de la nueva versión del software, por
ejemplo en el caso de desplegar código php en una aplicación basada en web,
como de utilizar uno de los muchos plugins que ofrece Jenkins.
Cabe destacar que dicha pipeline puede ser generada mediante código, lo que
permite hacer cambios muy fácilmente y usar control de versiones sobre las
pipelines.
Fuente: <https://jenkins.io/doc/book/pipeline/overview/>.
Como podemos ver, tendríamos una clase test donde definimos que queremos
instalar siempre la última versión del paquete ejemplo. Esta clase la aplicare-
mos a tantos nodos como queramos (en la anterior figura se ha aplicado al
nodo servidor-test).
Fuente: <https://www.infoq.com/articles/Continous-Delivery-Patterns>.
1)�Desarrollo�local
2)�Entorno�de�integración
3)�Entorno�de�test
© FUOC • PID_00241997 37 Infraestructura DevOps
4)�Entorno�de�preproducción
5)�Entorno�de�producción
Una vez vistos los diferentes entornos, veamos cómo se gestiona mediante
código la infraestructura sobre la que corren dichos entornos.
Las herramientas CCA incluyen: Ansible, CFEngine, Chef, Puppet, Otter o Sal-
tstack.
En el siguiente ejemplo vemos cómo todos los minions tienen definidas unas
fórmulas por defecto y luego, dependiendo del rol del minion en cuestión, se
le aplican unas fórmulas u otras. En concreto, a todos los minions se les aplican
las fórmulas: vim, scripts y users; a los minions con rol web: apache, python y
django; y a los minions con rol db: mysql.
Veamos un ejemplo del uso de los scripts de migración por los que pasamos de
la versión base de base de datos FW hasta la versión 0.3 actual de desarrollo.
© FUOC • PID_00241997 41 Infraestructura DevOps
Fuente: <http://comunidad.iebschool.com/perezmvictoria/2014/05/01/proceso-del-versionado-para-bases-de-datos/>.
1)�Sobre�los�datos�para�los�test�de�commit
Son datos más bien livianos para que los test sean rápidos. Esto se consigue
no sobreelaborando la definición de entradas y salidas para mantener la inde-
pendencia sobre implementaciones concretas.
2)�Sobre�los�datos�para�los�test�de�aceptación
Cabe indicar que los test de aceptación requieren un gran volumen de datos
de entrada y datos referenciados, y estos deben obtenerse a partir de datos y
proporciones reales.
© FUOC • PID_00241997 43 Infraestructura DevOps
Otra manera es con un instalador «todo en uno» para MAC y Windows. Este
instalador contiene un cliente para Windows, la imagen de una máquina vir-
tual Linux, Virtualbox y msys-git unix tools.
© FUOC • PID_00241997 44 Infraestructura DevOps
3.1.3. Características
• Ligereza: los contenedores Docker solo contienen lo que los diferencia del
sistema operativo en el que se ejecutan, no se virtualiza un SO completo.
Por todo esto, Docker ha entrado con mucha fuerza en el mundo del desarro-
llo, ya que permite desplegar las aplicaciones en el mismo entorno que tienen
en producción o viceversa, permite desarrollarlas en el mismo entorno que
tendrán en producción.
• Solo puede usarse de forma nativa en entornos Unix con kernel igual o
superior a 3.8.
3.1.6. Arquitectura
Fuente: <https://en.wikipedia.org/wiki/Docker_(software)>.
3.1.7. Componentes
propia configuración de red. Ejemplos de esto son las jaulas de FreeBSD, Ope-
nSolaris o Linux Vservers. Otra diferencia es el tamaño: una máquina virtual
convencional puede ocupar bastante, sin embargo, los contenedores Docker
solo contienen lo que las diferencia del sistema operativo en el que se ejecu-
tan, y ocupan una media de 150-250 Mb. En cuanto a recursos, el consumo
de procesador y memoria RAM es mucho menor al no estar todo el sistema
operativo virtualizado.
root@cloud-jguijarro:~# uname -a
Linux cloud-jguijarro 3.13.0-44-generic #73-Ubuntu SMP Tue Dec 16 00:22:43 UTC 2014 x86_64
x86_64 x86_64 GNU/Linux
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com
Por defecto, el socket Unix es propiedad del usuario root, por lo que el demonio
Docker siempre corre como el usuario root.
Para evitar tener que usar sudo cuando se utilice el comando docker, se crea un
grupo llamado Docker y se añaden usuarios a él. Cuando el demonio Docker se
inicie con un usuario perteneciente al grupo Docker, lo hará con los permisos
de lectura y escritura equivalentes a root:
Y lo dejamos:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
root@cloud-jguijarro:/home/ubuntu# update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.13.0-65-generic
Found initrd image: /boot/initrd.img-3.13.0-65-generic
done
© FUOC • PID_00241997 53 Infraestructura DevOps
Docker usa un bridge para gestionar las redes de contenedores, por lo que si
tenemos un firewall (UFW) que por defecto elimine el tráfico de forwarding,
habrá que configurarlo adecuadamente.
En este caso está inactivo. Si estuviera activo, los pasos que deberíamos seguir
serían los siguientes:
DEFAULT_FORWARD_POLICY="ACCEPT"
Sistemas como Ubuntu generalmente usan la 127.0.0.1 como servidor DNS por
defecto en el fichero /etc/resolv.conf. El NetworkManager también configura
el dnsmasq para que use el servidor local. Al iniciar contenedores en máquinas
con esta configuración, Docker nos mostrará la siguiente advertencia:
Esto ocurre porque los contenedores Docker no usan el DNS local, sino que
usan uno externo. Para evitar esta advertencia, podemos especificar un servi-
dor DNS para que lo usen los contenedores. Esto se hace editando el fiche-
ro /etc/default/docker y especificando uno o más servidores DNS públicos de
Google en la siguiente línea:
DOCKER_OPTS="--dns 8.8.8.8"
# dns=dnsmasq
root@cloud-jguijarro:#docker version
Client:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built: Wed Oct 26 21:44:32 2016
OS/Arch: linux/amd64
Server:
Version: 1.12.3
API version: 1.24
Go version: go1.6.3
Git commit: 6b644ec
Built: Wed Oct 26 21:44:32 2016
OS/Arch: linux/amd64
root@cloud-jguijarro:~# docker -v
Docker version 1.12.3, build 6b644ec
© FUOC • PID_00241997 55 Infraestructura DevOps
• import: crea una nueva imagen del sistema de archivos vacío e importa el
contenido de un fichero .tar.
• network create: crea una nueva red con un nombre especificado por el
usuario.
3.3.2. Imágenes
Las imágenes son plantillas de solo lectura que usamos como base para lanzar
un contenedor. Una imagen Docker se compone de un sistema de archivos en
capas una sobre la otra. En la base tenemos un sistema de archivos de arran-
que, bootfs (parecido al sistema de archivos de Linux), sobre el que arranca la
imagen base. Cada imagen, también conocida como repositorio, es una suce-
sión de capas. Es decir, al arrancar un contenedor lo hacemos sobre una ima-
gen, a la que llamamos imagen base. Con el contenedor corriendo, cada vez
que realizamos un cambio en el contenedor Docker añade una capa encima de
la anterior con los cambios, pero dichas modificaciones no serán persistentes,
los cambios no los hacemos en la imagen (recordemos que es de solo lectura),
por lo que deberemos guardarlos creando una nueva imagen con los cambios.
© FUOC • PID_00241997 58 Infraestructura DevOps
docker images
Para descargar una imagen, debemos hacerlo con el comando pull (también
podemos hacerlo con el comando run, como veremos más adelante, pero esta
es la forma correcta).
Sintaxis:
Si nos fijamos en la descarga, vemos 5 líneas que ponen «pull complete». Esto
es que la imagen está formada por 5 capas o layers. Estas capas pueden ser re-
utilizadas por otras imágenes, que evitan así el tener que volver a descargarlas,
por ejemplo si descargamos otra imagen de Ubuntu. En la descarga también
vemos una línea que pone Digest. Este código sirve si queremos asegurarnos
© FUOC • PID_00241997 60 Infraestructura DevOps
Una vez que tenemos disponible una imagen, podemos ejecutar cualquier con-
tenedor.
Comando run
Sintaxis:
El comando run primero crea una capa del contenedor sobre la que se puede
escribir y, a continuación, ejecuta el comando especificado. Con este comando
hemos ejecutado un contenedor, sobre la imagen Ubuntu, que ha ejecutado el
comando echo. Cuando ha terminado de ejecutar el comando que le hemos
pedido se ha detenido. Los contenedores están diseñados para correr un único
servicio, aunque podemos correr más si hiciera falta. Cuando ejecutamos un
contenedor con run, debemos especificarle un comando que ejecutar en él, y
dicho contenedor solo se ejecuta durante el tiempo que dura el comando que
especifiquemos, funciona como un proceso.
Algo que hemos de tener en cuenta es que si la imagen que estamos poniendo
en el comando run no la tuviéramos en local, Docker primero la descargaría
y la guardaría en local y luego seguiría con la construcción capa por capa del
contenedor. Vamos a ver los contenedores que tenemos en nuestro host con
el comando ps.
Figura 25. Consulta de todos los detalles de los contenedores Docker en nuestro host
Con «docker ps –a» veremos el contenedor con el nombre que hemos puesto.
Modo interactivo
Como hemos visto, cuando creamos un contenedor con run, debemos espe-
cificar un comando que se va a ejecutar, y cuando se acabe su ejecución el
contenedor se detendrá.
Las imágenes, como hemos visto, son plantillas de solo lectura, que usamos de
base para lanzar contenedores. Por tanto, lo que hagamos en el contenedor so-
lo persiste en ese contenedor, las modificaciones no las hacemos en la imagen.
Si queremos que dichos cambios sean permanentes, debemos crear una nueva
imagen con el contenedor personalizado. Veamos las imágenes que tenemos
disponibles:
Ahora vamos a guardar los cambios realizados en la imagen. Tenemos que salir
del contenedor y ejecutar el comando «commit». Cuando salimos de un con-
tenedor interactivo este se detiene. Lo vemos con docker ps –a. Ahora mismo
este contenedor está formado por la capa con la imagen base y la capa en la
que hemos instalado git.
Para poder utilizar esta imagen con los cambios, hemos de crear una nueva
imagen, con el comando:
A partir de aquí podemos crear un contenedor con esta nueva imagen como
base y ya tendrá instalado git. Lo comprobamos:
Ahora creamos una nueva imagen del contenedor con Apache instalado:
root@cloud-jguijarro:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
9bb15ff58f5d apache/ubuntu:v1 "/usr/sbin/apache2ctl" 24
seconds ago Up 24 seconds server
Podemos ver los procesos que se están ejecutando en un contenedor con «top»:
/usr/sbin/apache2 -DFOREGROUND
root@5659f2d7e356:/# exit
exit
root@docker:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
5659f2d7e356 apache/ubuntu:v1 "/usr/sbin/apache2ctl" 4
minutes ago Up 4 minutes server
Para que la aplicación que nos está sirviendo nuestro contenedor, por ejemplo
el servidor web instalado en el contenedor anterior, es necesario mapear los
puertos. Es decir, al crear el contenedor, este no está disponible al exterior. Para
que lo esté, tenemos que redireccionar el puerto 22 del contenedor a uno de
nuestra máquina. Usamos para ello el flag -p.
• -P: le dice a Docker que si expone algún tipo de puerto haga el fordwarding
a un puerto aleatorio.
Lanzamos el contenedor:
Comprobamos su estado:
root@cloud-jguijarro:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED
© FUOC • PID_00241997 67 Infraestructura DevOps
Aquí vamos a hablar un poco de la plataforma Docker Hub, que sirve como
repositorio de imágenes oficiales y de terceros.
Ya hemos visto cómo usar los repositorios desde la línea de comandos, ahora
lo vemos desde el sitio web.
Creamos una cuenta y al acceder vemos que podemos crear nuestro propio
repositorio, organización o buscar en los repositorios.
© FUOC • PID_00241997 68 Infraestructura DevOps
3.3.9. Links
Para que dos contenedores colaboren entre ellos, podemos abrir puertos y que
se comuniquen por ahí, pero Docker nos ofrece la posibilidad de crear links
entre contenedores.
Ahora creamos otro con la opción --link para que Docker cree un túnel entre
los dos contenedores:
Comprobamos los contenedores activos con el comando «docker ps». Este tú-
nel es unidireccional y solo podremos acceder a él desde el que se ha ejecutado
con --link al otro:
HOME=/root
Vemos que aparecen variables del contenedor links01. Podemos modificar des-
de links02 las variables de entorno del otro contenedor. Docker internamente
gestiona las Ips de los contenedores, añadiéndolas al fichero /etc/hosts de los
contenedores.
3.3.10. Volúmenes
Figura 30
Por defecto, los contenedores tienen las conexiones de redes habilitadas. Po-
demos deshabilitarlas pasando la opción --net none.
Para eliminar un contenedor podemos hacerlo por el nombre o por el ID. Real-
mente solo necesitamos los tres primeros dígitos del ID. Para poder eliminarlo
debe estar parado. Si no lo estuviera, tendríamos que pararlo con «stop».
3.3.14. Dockerfile
Construir el contenedor
El comando docker build irá siguiendo las instrucciones del Dockerfile y ar-
mando la imagen. El Dockerfile puede encontrarse en el directorio en el que
estemos o en un repositorio.
Dockerfile comandos
1)�FROM
Lo que hace docker al leer esto es buscar en la máquina local una imagen que
se llama; si no la encuentra, la descargará de los repositorios.
Sintaxis:
FROM <imagen>
FROM <imagen>:<tag>
2)�MAINTAINER
Sintaxis:
3)�RUN
Sintaxis:
RUN <comando> -> modo shell, /bin/sh -c RUN ["ejecutable","parámetro1","parámetro2"] -> modo
ejecución, que permite correr comandos en imágenes base que no tengan /bin/sh o hacer uso
de otra shell.
4)�ENV
Sintaxis:
5)�ADD
© FUOC • PID_00241997 73 Infraestructura DevOps
Sintaxis:
ADD <fuente>..<destino>
ADD ["fuente",..."destino"]
El parámetro <fuente> acepta caracteres comodín tipo ?,*, etc. Una de las co-
sas que debemos tener en cuenta (entre otras → https://docs.docker.com/engi-
ne/reference/builder/#add) es que el <origen> debe estar donde esté el Docker-
file, no se pueden añadir archivos desde fuera del directorio de construcción.
6)�COPY
Es igual que ADD, solo que NO admite URL remotas y archivos comprimidos
como lo hace ADD.
7)�WORKDIR
Puede ser usada varias veces dentro de un Dockerfile. Si se da una ruta relativa,
esta será la ruta relativa de la instrucción WORKDIR anterior.
8)�USER
© FUOC • PID_00241997 74 Infraestructura DevOps
9)�VOLUME
Esto se hace para que cuando usemos el contenedor podamos tener acceso
externo a un determinado directorio del contenedor.
VOLUME ["/var/tmp"]
VOLUME /var/tmp
10)�LABEL
LABEL version="1.0"
LABEL localizacion="Barbate" tipo="BBDD"
© FUOC • PID_00241997 75 Infraestructura DevOps
11)�STOPSIGNAL
Le indica al sistema una señal que será enviada al contenedor para salir. Puede
ser un número válido permitido por el kernel (por ejemplo, 9) o un nombre de
señal en el formato SIGNAME (por ejemplo, SIGKILL).
12)�ARG
El autor del Dockerfile puede definir una o más variables. Y también puede
definir un valor por defecto para una variable, que se usará si en la construc-
ción no se especifica otro.
ARG user1
ARG user1=someuser ARG user2
HTTP_PROXY http_proxy
HTTPS_PROXY https_proxy
FTP_PROXY ftp_proxy
NO_PROXY no_proxy
13)�ONBUILD
Añade triggers a las imágenes. Un disparador se utiliza cuando se usa una ima-
gen como base de otra imagen. El disparador inserta una nueva instrucción
en el proceso de construcción como si se especificara inmediatamente después
de la instrucción FROM.
Un ejemplo de uso:
FROM Ubuntu:14.04
MAINTAINER mcgomez
RUN apt-get update && apt-get install -y apache2
ONBUILD ADD ./var/www/
EXPOSE 80
CMD ["D","FOREGROUND"]
14)�EXPOSE
Por ejemplo:
EXPOSE 80 443
docker run centos:centos7 -p 8080:80
15)�CMD
Solo puede existir una única instrucción CMD por cada Dockerfile y puede
ser útil para ejecutar servicios que ya estén instalados o para correr archivos
ejecutables especificando su ubicación.
16)�ENTRYPOINT
© FUOC • PID_00241997 77 Infraestructura DevOps
Sintaxis:
17)�ARCHIVO�DOCKERIGNORE
Un ejemplo de .dockerignore:
*/prueba*
*/*/prueba
prueba?
Ejemplo de Dockerfile
Vamos a lanzar un contenedor haciendo uso del siguiente Dockerfile, que he-
mos colocado en una carpeta llamada /wordpress.
FROM debian #FROM nos indica la imagen base a partir de la cual crearemos la imagen con
"wordpress" que construirá el Dockerfile.
MAINTAINER UOC <[email protected]>
ENV HOME /root #ENV HOME: Establecerá nuestro directorio "HOME" donde relizaremos los comandos "RUN".
RUN apt-get update
RUN apt-get install -y nano wget curl unzip lynx apache2 php5 libapache2- mod-php5 php5-mysql
RUN echo "mysql-server mysql-server/root_password password root" | debconf-set-selections
RUN echo "mysql-server mysql-server/root_password_again password root" | debconf-set-selections
RUN apt-get install -y mysql-server
ADD https://es.wordpress.org/wordpress-4.2.2-es_ES.zip /var/www/wordpress.zip #ADD nos permite
añadir un archivo al contenedor, en este caso nos estamos bajando Wordpress
ENV HOME /var/www/html/
RUN rm /var/www/html/index.html
© FUOC • PID_00241997 78 Infraestructura DevOps
#!/bin/bash
#Iniciamos el servicio mysql
/etc/init.d/mysql start
#Guardamos en variables los datos de la base de datos
DB_ROOT="root" DB_ROOT_PASS="root" DB_NAME="wordpress" DB_USER="wordpress" DB_PASS="wordpress"
#Nos conectamos a la BBDD como root y creamos el usuario sql
mysql -u ${DB_ROOT} -p${DB_ROOT_PASS} -e "CREATE USER '${DB_USER}';"
#Creamos la base de datos
mysql -u ${DB_ROOT} -p${DB_ROOT_PASS} -e "CREATE DATABASE ${DB_NAME};"
#Le damos permisos al usuario sobre la base de datos y le ponemos contraseña
mysql -u ${DB_ROOT} -p${DB_ROOT_PASS} -e "GRANT ALL ON ${DB_NAME}.* TO $ {DB_USER} $
root@cloud-jguijarro:~#docker images
El siguiente paso es correr la imagen en nuestro puerto 80, para lo que usamos
el siguiente comando:
Limitación de recursos
Inicio automático
Ejemplo:
de la aplicación.
4.1. Cloud9
La interfaz web nos permitirá crear y editar en tiempo real nuestras aplicacio-
nes, al tiempo que nos dará acceso a un terminal que nos permitirá instalar
dependencias y servicios (servidor web, framework, base de datos, etc.) como
si de una VPS se tratara.
4.2. Heroku
– heroku open.
Bibliografía
1. Bibliografía utilizada (libros, revistas, capítulos de libros u otras fuentes de
interés)
Además de los enlaces proveídos dentro de los propios materiales como recursos adicionales,
añadimos las siguientes publicaciones:
2. Referencias
[1] James P. Womack; Daniel T. Jones; Daniel Roos (1990). «The Machine That Chan-
ged the World».
[2] Ward Cunningham (1992). «The WyCash Portfolio Management System» [en línea].
<http://c2.com/doc/oopsla92.html>.
[3] Kent Beck y otros (2001; febrero). Manifesto for Agile Software Development [en línea].
<http://agilemanifesto.org>.
[4] Brian Marick (2003, 22 de agosto). Agile testing directions: tests and examples [en línea].
<http://www.exampler.com/old-blog/2003/08/22/>.
Casos de uso PaaS
y de
automatización
completa
PID_00241998
Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio, sea éste eléctrico,
químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
de los titulares del copyright.
© FUOC • PID_00241998 Casos de uso PaaS y de automatización completa
Índice
Objetivos....................................................................................................... 5
Objetivos
Requerimientos:
Es una herramienta que nos permite instalar el demonio Docker en hosts vir-
tuales y administrar dichos hosts con el comando docker-machine. Además,
podemos hacerlo en distintos proveedores (VirtualBox, OpenStack, OpenNe-
bula, VmWare, etc.).
Una vez instalado, para comprobar que podéis ejecutar docker-machine, eje-
cutad desde vuestro usuario:
© FUOC • PID_00241998 8 Casos de uso PaaS y de automatización completa
docker-machine version
export PATH=$PATH:/usr/local/bin
Enlace de interés
1)�Paquete�GO
wget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz
tar -C /usr/local -xvzf go1.6.linux-amd64.tar.gz
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
mkdir $HOME/work
export GOPATH=$HOME/work
export PATH=$PATH:$GOPATH/bin
2)�Paquete�GIT,�BZR
3)�Paquete�GODEP
go get github.com/tools/godep
go get github.com/opennebula/docker-machine-opennebula
cd $GOPATH/src/github.com/opennebula/docker-machine-opennebula
© FUOC • PID_00241998 9 Casos de uso PaaS y de automatización completa
make build
make install
1)�ONE_AUTH�y�ONE_XMLRPC
mkdir -p $HOME/.one
echo usuario:password > $HOME/.one/one_auth
export ONE_AUTH=$HOME/.one/one_auth
export ONE_XMLRPC=http://iaas.csuc.cat:2633/RPC2
Enlace de interés
Más opciones:
Enlazamos la shell:
Variables de entorno
Para mantener las nuevas variables de entorno de manera persistente, añadidlas a vues-
tro .profile ($HOME/.profile).
Crear�un�contenedor�con�nginx�en�una�máquina�Docker�con�el�driver�de
Docker�Machine�en�el�OpenNebula
© FUOC • PID_00241998 11 Casos de uso PaaS y de automatización completa
docker-machine ls
Los siguientes comandos nos muestran las variables de entorno necesarias para
acceder a la shell:
Ahora podemos comenzar a usar docker sobre la máquina Docker Engine que
acabamos de crear:
• Consul.
• Docker Swarm.
• Swarm-master.
• Swarm-nodo.
• Conexión con el Swarm-master.
1)�Requerimientos�previos
2)�Instalar�los�requerimientos
2.1. Consul
Dispondremos de una máquina virtual con Docker Engine que nos proporcio-
nará el servicio de discovery con Consul.
• Swarm�Nodo: Esta o estas máquinas serán las que ejecutarán los contene-
dores Docker.
2.2.1. Swarm-master
2.2.2. Swarm-nodo
Creamos la máquina virtual con el driver de Docker Machine, por los diferentes
nodos de los clústeres:
Podemos crear tantos nodos como queramos. Solo tenemos que ir modifican-
do el nombre de la máquina virtual.
Una vez hemos creado las diferentes máquinas virtuales que componen el clús-
ter, podemos conectarnos al nodo máster con el siguiente comando:
2.4. Red
Una vez tenemos creado nuestro clúster con Swarm, también tenemos la op-
ción de poder crear redes privadas dentro del clúster:
docker network ls
Ejecutar�contenedores�Docker�en�el�clúster�creado
Ahora podemos empezar a usar Docker sobre el clúster que acabamos de crear.
Utilizaremos un contenedor con nginx, por ejemplo:
docker ps
Para acceder al servicio del contenedor, tenemos que poner la dirección IP del
nodo del clúster en el navegador.
© FUOC • PID_00241998 16 Casos de uso PaaS y de automatización completa
• Consul.
• Docker Swarm.
• Load Balancer.
• Docker Compose.
1)�Requerimientos�previos
• Docker�Compose.
2)�Instalar�los�requerimientos
sudo -y curl
-L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m`
> /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
exit
3.1. Consul
• Swarm-nodo: Esta o estas máquinas serán las que ejecutarán los contene-
dores docker.
3.2.1. Swarm-master
3.2.2. Swarm-nodo
Podemos crear los nodos que queramos. Solo tenemos que cambiar el nombre
de la máquina virtual.
Una vez hemos creado el máster y los diferentes nodos, instanciaremos los
contenedores con el registrator a todos ellos. Utilizaremos la imagen de gli-
derlabs/registrator.
1)�default.ctmpl
server {
listen 80 default;
location / {
proxy_pass http://{{printf $app}};
}
}
© FUOC • PID_00241998 20 Casos de uso PaaS y de automatización completa
Por cada instancia del servicio corriendo crearemos una línea con la dirección
del nodo donde se ejecuta ({{.Address}}) y el puerto por donde está escuchando
({{.Puerto}}).
2)�start.sh
Necesitamos un script que actúe como entry point para esta imagen de docker.
#!/bin/bash
service nginx start
consul-template -consul=$CONSUL_URL -template="/templates/default.ctmpl:/etc/nginx/conf.d/
default.conf:service nginx reload"
Este script pone en marcha primero el servicio nginx. Después pone en marcha
consul-template pasándole dos parámetros:
3.4. Dockerfile
FROM nginx:latest
© FUOC • PID_00241998 21 Casos de uso PaaS y de automatización completa
ADD https://releases.hashicorp.com/consul-template/0.12.2/consul-template_0.12.2_linux_amd64.zip
/usr/bin/
RUN unzip /usr/bin/consul-template_0.12.2_linux_amd64.zip -d /usr/local/bin
EXPONGO 80
ENTRYPOINT ["/bin/start.sh"]
Este fichero utiliza nginx como imagen base e instala consul-template encima.
Después copia el script start.sh y el template default.ctmpl (que antes hemos
creado) dentro del contenedor. Finalmente, expone el puerto 80 y define el
script start.sh como entry point de la imagen.
Docker Compose nos permite escribir la configuración que queremos que ten- Enlace de interés
gan los contenedores que desplegar. Utilizaremos Docker Compose File ver-
Para saber más sobre
sion 2, que nos permite definir la configuración en lo referente a la red, volú- la versión 2 del fiche-
menes, puertos, variables de entorno. ro de docker-compose,
podéis consultar el si-
guiente enlace: <https://
docs.docker.com/compo-
1)�docker-compose.yml
se/compose-file/compose-fi-
le-v2/>.
Ejemplo de docker-compose.yml:
version: '2'
services:
lb:
build: .
container_name: lb
puertos:
- "80:80"
environment:
- APP_NAME=[Nombre_de el_servicio]
- CONSUL_URL=${CONSUL_IP}:8500
depends_on:
- web
networks:
- frente-tier
web:
image: [imagen_docker]
© FUOC • PID_00241998 22 Casos de uso PaaS y de automatización completa
puertos:
- "[Puerto_de el_servicio]"
environment:
- SERVICE_NAME=[Nombre_de el_servicio]
networks:
- frente-tier
networks:
frente-tier:
driver: overlay
Para ver los detalles de los servicios corriendo podemos utilizar el comando:
docker-compose ps
Ahora mismo solo tenemos una instancia del servicio. Si queremos aumentar
o disminuir:
Enlace de interés
-bootstrap
export CONSUL_IP=$(docker-machine ip consul)
Nota
1)�files/default.ctmpl
server {
listen 80 default;
location / {
proxy_pass http://{{printf $app}};
}
}
2)�files/start.sh
#!/bin/bash
service nginx start
consul-template -consul=$CONSUL_URL -template="/templates/default.ctmpl:/etc/nginx/conf.d/
default.conf:service nginx reload"
3)�Dockerfile
FROM nginx:latest
ADD https://releases.hashicorp.com/consul-template/0.12.2/consul-template_0.12.2_linux_amd64.zip
/usr/bin/
RUN unzip /usr/bin/consul-template_0.12.2_linux_amd64.zip -d /usr/local/bin
EXPOXE 80
ENTRYPOINT ["/bin/start.sh"]
4)�docker-compose.yml
version: '2'
services:
lb:
build: .
container_name: lb
© FUOC • PID_00241998 25 Casos de uso PaaS y de automatización completa
puertos:
- "80:80"
environment:
- APP_NAME=web_nginx
- CONSUL_URL=${CONSUL_IP}:8500
depends_on:
- web
web:
image: nginx
puertos:
- "80"
environment:
- SERVICE_NAME=web_nginx
networks:
default:
driver: overlay
El nombre que indicamos tiene que ser el nombre que hemos indicado en
el fichero docker-compose.yml. Nosotros en el fichero docker-compose.yml
hemos indicado que el nombre del servicio era web.
Para finalizar, podemos optar por parar y/o borrar los servicios:
Requerimientos previos:
Figura 10. Diagrama relacional de Git, los diferentes componentes de Docker y OpenNebula
Para trabajar con el proyecto de forma individual se deberá hacer un «fork» del
repositorio, lo que permitirá a cada alumno poder tener una copia remota con
permisos para hacer cualquier cambio requerido.
Una vez disponemos del fork del repositorio en nuestra cuenta de GitHub,
procederemos al clonado en local mediante el comando:
El proyecto demo está basado en un servlet JSP con una clase principal User
junto con su controlador y los test JUnit, que verificarán el correcto funcio-
namiento de este.
• src/main: Contendrá los modelos y los controladores junto con los jsp
que construirán las páginas web de la aplicación.
$ mvn test
En el caso de superar los test, verificaremos que todos los test se han superado
y que el resultado completo de la ejecución de las pruebas unitarias ha sido
satisfactorio.
Existen otros tipos de test, llamados test� de� integración� continua, que se
diferencian de los unitarios en que no necesitan disponer de todo el entorno
de la aplicación para ejecutarse, sino que analizan las aplicaciones a partir de
sus contextos (partes independientes en las que se divide una aplicación).
© FUOC • PID_00241998 31 Casos de uso PaaS y de automatización completa
Para el uso del plugin Failsafe se deberá añadir al fichero pom.xml el siguiente
código:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<testFailureIgnore>false</testFailureIgnore>
<configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
Según convención, los test que queramos integrar en los test de integración
continua deberán incorporar «IT» o «IntegrationTest» como sufijo en el nom-
bre del fichero.
$ mvn package
Los archivos WAR (Web Application Archive) son ficheros utilizados para la
distribución de JavaServer Pages, servlets, clases Java, archivos XML, librerías
y otros ficheros necesarios para el despliegue de aplicaciones en contenedores
web como el proporcionado por Tomcat.
Una vez realizada la construcción del proyecto y para hacer el servlet accesible,
deberemos:
¿Cómo hacerla portable y que pueda ser ejecutada en cualquier máquina con
docker? La respuesta es la dockerización de la aplicación.
Docker nos permitirá introducir en una «caja» todas aquellas cosas que la apli-
cación necesita para ser ejecutada, sin tener que preocuparse por la versión de
software que la máquina host tiene instalada, por si tiene instalados todos los
módulos necesarios o por si son compatibles o no con nuestra aplicación.
Para construir una imagen docker podemos partir de cualquier contenedor Nota
disponible en el registro de imágenes de Docker (Docker Hub Registry), don-
Docker Hub dispone de más
de se encuentran disponibles aplicaciones funcionales, tales como bases de de cien mil imágenes disponi-
datos, servidores de aplicaciones, servidores web, etc.; lo único necesario se- bles de forma pública y listas
para ser usadas.
rá construir un archivo Dockerfile que contenga la composición de nuestro
contenedor.
El fichero Dockerfile pondrá por escrito todo aquello necesario para el desplie-
gue de nuestra aplicación, ejecutando todas aquellas instrucciones para pre-
parar el entorno encapsulado. Este fichero puede construirse en cualquier di-
rectorio de nuestra máquina.
© FUOC • PID_00241998 34 Casos de uso PaaS y de automatización completa
#Definición de la versión específica de la imagen a utilizar mediante el uso del código sha256
generado durante la construcción de la imagen.
FROM <imagen>@<digest>
MAINTAINER <autor>
3)�ENV: establece variables de entorno que podrán ser interpretadas por las
instrucciones mediante el formato $variable o ${variable}.
#Ejecución del comando en una shell, por defecto /bin/sh -c en Linux y cmd /S /C em Windows
RUN <command>
#Copia ficheros con origen local o remoto en un destino dentro del contenedor
ADD <origen>... <destino>
VOLUME ["/data"]
8)�EXPOSE: permite exponer los puertos TCP/IP por los que se pueden acceder
a los servicios del contenedor. Por ejemplo: puerto 22 para SSH, 80 para HTTP
o 3306 para MySQL. Esta instrucción expone los puertos para ser usados por
el propio contenedor. En el caso de querer hacerlos accesibles desde fuera del
contenedor, se deberá utilizar el flag -p (publish) durante la ejecución.
#Formato shell
CMD comando param1 param2
#Formato shell
ENTRYPOINT comando param1 param2
© FUOC • PID_00241998 36 Casos de uso PaaS y de automatización completa
Para crear una imagen a partir del fichero Dockerfile, nos situaremos en el
directorio donde se encuentra el dichero y ejecutaremos:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hellodevops v1 94af2f7c9151 4 minutes ago 332.8 MB
tomcat 8.5-jre8 fd9c13f14ae6 11 hours ago 332.6 MB
© FUOC • PID_00241998 37 Casos de uso PaaS y de automatización completa
Dentro del resultado deberíamos encontrar la imagen creada junto con la de-
pendencia de la imagen del Apache Tomcat 8.5, que podremos incluir en fu-
turos proyectos sin la necesidad de volver a descargarlo.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
f37315e8cf14 hellodevops:v1 "catalina.sh run" 9 minutes ago Up 9 minutes
PORTS NAMES
0.0.0.0:8080->8080/tcp pensive_jennings
4.5. Jenkins
• -v�<ubicación_fichero_docker.sock>:/var/run/docker.sock�-v�$(which
docker):/usr/bin/docker: Dado que este contenedor requiere el uso de los
comandos docker, mapearemos el socket y el propio binario docker para
que este pueda ser usado por el contenedor.
Nota
El servidor utilizado puede ser local o hacer referencia a un servidor smtp ofre-
cido por terceros. A continuación mostramos un ejemplo de configuración de
la plataforma Jenkins para la utilización de Gmail como plataforma de envío
de correos.
Debido a que Jenkins utilizará los comandos mvn para la compilación y cons-
trucción de nuevas imágenes, será un requisito que Maven esté instalado den-
tro de nuestro contenedor Jenkins.
Para poder realizar las acciones propuestas en este caso de uso, se requerirá la
instalación de distintos plugins de Jenkins.
Jenkins pone a disposición la capacidad de instalar los plugins más usados por
la comunidad durante la fase de configuración de la aplicación.
Así pues, podremos adquirir la mayoría de los plugins necesarios clicando sobre
«Install suggested plugins» dentro de la página de bienvenida de Jenkins.
© FUOC • PID_00241998 42 Casos de uso PaaS y de automatización completa
• Git� Plugin: Permite la interacción con Git, por tanto, con plataformas
como GitHub.
Construir una imagen docker en Jenkins requiere el uso de los binarios de doc-
ker. Hemos aprendido cómo construir la imagen durante la dockerización de
la aplicación, y estos podrían ser perfectamente incluidos en una de las dife-
rentes etapas que podríamos definir en un pipeline de nuestro proceso comple-
to de automatización, pero Jenkins ofrece herramientas para facilitar la cons-
trucción y publicación de imágenes docker en un Registry Docker Hub, sin
tener que escribir ninguna línea de código. En este caso de uso utilizaremos el
plugin CloudBees Docker Build and Publish.
Para instalar el plugin nos dirigiremos utilizando los diferentes menús a Admi-
nistrar Jenkins -> Administrar Plugins.
© FUOC • PID_00241998 43 Casos de uso PaaS y de automatización completa
Figura 20. Detalle de la instalación y configuración del plugin CloudBees Docker Build and
Publish
Para que nuestra imagen local pueda ser subida a otro registro de imágenes,
deberemos etiquetarla.
Para asegurar que la imagen se encuentra dentro del registro de imágenes crea-
do, verificaremos que esta se encuentre en el registro y procederemos a des-
cargarla.
#Existen distintos comandos para hacer llamadas a la API del registro de imágenes Docker,
dependiendo de la versión de este estarán o no disponibles, es por eso que mostraremos dos
métodos para recuperar las imágenes remotas:
#Mediante instrucciones docker
$ docker search <my.registry.host>:[PUERTO]/library
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID,
head over to https://hub.docker.com to create one.
Username: <usuario>
Password: <contraseña>
Login Succeeded
En este momento nuestra imagen ya estará disponible para todos los usuarios
de la comunidad Docker simplemente con ejecutar la respectiva instrucción
docker pull.
Vale la pena pararse e investigar todas las opciones que la plataforma Docker
Hub nos ofrece, ya que no se limita solo a albergar sino que permite la creación
de organizaciones con sus respectivos equipos de trabajo y derivar la automa-
tización de construcción de imágenes mediante cuentas GitHub o Bitbucket
relacionadas.
Para iniciar nuestro proyecto en Jenkins, se deberá crear una Nueva� Tarea,
disponible en el menú lateral derecho de la plataforma. En el caso de no dis-
poner de ninguna tarea anterior, Jenkins indicará en su parte central un enlace
directo para empezar con la creación de la primera tarea.
Dado que nuestro proyecto debe generar una nueva imagen cada vez que se
incorporen cambios a la rama principal (master) de nuestro proyecto, debere-
mos establecer nuestro repositorio Git como fuente de origen.
• Seleccionar Git.
Existen diferentes acciones que pueden hacer que nuestro proyecto Jenkins se
ejecute de manera automática. Estos representan los Disparadores�de�ejecu-
ciones, y son los siguientes:
Ejecutar:
• Goals: test.
© FUOC • PID_00241998 51 Casos de uso PaaS y de automatización completa
Ejecutar:
• Goals: package
• Docker� Host� URI: Puede dejarse en blanco para utilizar los valores de
entorno docker por defecto (normalmente unix:///var/run/docker.sock o
tcp://127.0.0.1:2375).
• Docker�registry�URL: http://<my.registry.host>:5000/.
• Se deberá especificar qué usuarios deberán recibir los errores, o todos los
desarrolladores o aquellos que hayan realizado el último commit.
© FUOC • PID_00241998 54 Casos de uso PaaS y de automatización completa
Para ejecutar por primera vez nuestro proceso de integración continua, podre-
mos o bien introducir algún cambio en nuestro código y hacer push en el repo-
sitorio de versiones, o bien clicar en la opción del menú lateral Construir ahora.
Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio, sea éste eléctrico,
químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
de los titulares del copyright.
© FUOC • PID_00241999 Introducción a la seguridad en cloud computing
Índice
Introducción............................................................................................... 5
5. Herramientas de seguridad............................................................. 51
5.1. Herramientas de control de acceso ............................................. 51
5.2. Herramientas contra la fuga de información ............................. 51
5.2.1. MyDLP Community ...................................................... 51
5.2.2. Ossec .............................................................................. 52
5.3. Herramientas de gestión de vulnerabilidades ............................. 52
5.3.1. BDD-Security .................................................................. 52
5.3.2. OWASP ZAP ................................................................... 52
5.3.3. Nessus ............................................................................. 52
5.4. Beneficios del uso de los estándares abiertos .............................. 53
© FUOC • PID_00241999 5 Introducción a la seguridad en cloud computing
Introducción
• La localización de la información.
• El proveedor y modelo del servicio cloud.
• Las niveles de servicio respecto a la integridad y la disponibilidad de los
datos.
En la capa de plataforma debemos usar todas las medidas necesarias para man-
tener nuestros servidores, bases de datos y copias de seguridad accesibles solo
a personal autorizado; usando el principio de menor privilegio, otorgaremos
a cada uno el mínimo privilegio necesario para realizar su trabajo.
1)�Amenaza�n.º�1:�Fuga�de�información
Cuando se produce una fuga de datos, las empresas pueden incurrir en multas
o pueden enfrentarse a demandas o incluso a cargos criminales. También se
han de considerar las investigaciones de la infracción y las propias notifica-
ciones hacia los clientes, que por daños de imagen pueden añadir costes muy
significativos. Efectos indirectos, como daños a la marca y la pérdida de nego-
cio, pueden afectar a las organizaciones durante varios años.
2)�Amenaza�n.º�2:�Credenciales�comprometidas�y�suplantación�en�la�au-
tenticación
3)�Amenaza�n.º�3:�Interfaces�y�API�hackeadas
Las API y las interfaces tienden a ser la parte más expuesta de un sistema
porque normalmente son accesibles desde internet. Se recomiendan controles
adecuados como la primera línea de defensa y detección. Las aplicaciones y los
sistemas de modelado de amenazas, incluidos los flujos de datos y la arquitec-
tura/diseño, se convierten en partes importantes del ciclo de vida del desarro-
llo. También se recomiendan revisiones de código enfocadas en la seguridad
y rigurosas pruebas de penetración.
4)�Amenaza�n.º�4:�Vulnerabilidades
Es importante considerar que los costes de mitigar las vulnerabilidades del sis-
tema «son relativamente pequeños en comparación con otros gastos de TI». El
coste de poner los procesos de TI en el lugar que les correspondes con el obje-
tivo de controlar, detectar y reparar vulnerabilidades es pequeño en compara-
© FUOC • PID_00241999 12 Introducción a la seguridad en cloud computing
ción con el daño potencial. Las organizaciones necesitan parchear lo más rá-
pido posible, preferiblemente como parte de un proceso automatizado y recu-
rrente. Los procesos de control de cambios que tratan los parches de emergen-
cia aseguran que las actividades relacionadas con el mantenimiento del soft-
ware estén debidamente documentadas y revisadas por los equipos técnicos.
5)�Amenaza�n.º�5:�Secuestro�de�cuentas
6)�Amenaza�n.º�6:�Intrusos�maliciosos
Se recomienda que sean las propias organizaciones las que controlen el proceso
de cifrado y las claves, segregando las tareas y minimizando el acceso dado
a los usuarios. Las actividades de registro, monitorización y auditoría de los
propios administradores también son consideradas a día de hoy como críticas.
7)�Amenaza�n.º�7:�El�parásito�APT
Entre los puntos de entrada comunes se incluyen la pesca electrónica, los ata-
ques directos, unidades USB precargadas con malware y redes de terceros com-
prometidas. En particular, se recomienda entrenar a los usuarios para que re-
conozcan las técnicas de pesca electrónica o phishing.
8)�Amenaza�n.º�8:�Pérdida�permanente�de�datos
9)�Amenaza�n.º�9:�Inadecuada�diligencia
10)�Amenaza�n.º�10:�Abusos�de�los�servicios�en�la�nube
Los servicios en la nube pueden ser utilizados para apoyar actividades ilegales,
como el uso de recursos de computación en la nube para romper una clave
de cifrado para lanzar un ataque. Otros ejemplos incluyen el lanzamiento de
ataques DDoS, el envío de correos electrónicos de spam y phishing, y el aloja-
miento de contenido malicioso.
Los proveedores deben reconocer estos tipos de abuso –como el análisis del
tráfico para reconocer los ataques DDoS– y ofrecer herramientas para que los
clientes puedan supervisar la salud de sus entornos cloud. Los clientes deben
asegurarse de que los proveedores ofrezcan un mecanismo para notificar el
abuso. Aunque los clientes no pueden ser víctimas directas de acciones mali-
ciosas, el abuso en el servicio en la nube puede resultar en problemas de dis-
ponibilidad de servicios y pérdida de datos.
11)�Amenaza�n.º�11:�Ataques�DoS
© FUOC • PID_00241999 15 Introducción a la seguridad en cloud computing
Los ataques DoS han existido durante años, pero han ganado prominencia
gracias a la computación en la nube, ya que a menudo afectan de manera des-
tacada sobre la disponibilidad. Los sistemas pueden ralentizarse o estar fuera
de juego. «Experimentar un ataque de denegación de servicio es como estar
atrapado en un atasco de tráfico de hora punta; hay una manera de llegar a su
destino y no hay nada que pueda hacer al respecto, excepto sentarse y esperar».
La norma habitual es que los proveedores de nube tienden a estar mejor pre-
parados para manejar ataques de DoS que sus clientes. La clave es tener un
plan para mitigar el ataque antes de que ocurra, por lo que los administradores
tienen acceso a esos recursos cuando los necesitan.
12)�Amenaza�n.º�12:�Tecnología�compartida,�peligros�compartidos
Algunas operaciones del servicio deben ser realizadas de manera conjunta por
ambas partes, contratada y contratante, debiendo establecerse los roles, las
responsabilidades (capacidad de autorizar y obligación de rendir cuentas) y los
protocolos adecuados para llevarlas a cabo.
© FUOC • PID_00241999 16 Introducción a la seguridad en cloud computing
Cabe destacar las siguientes actividades, sin que sean las únicas que procedi-
mentar:
Otro aspecto que se debe tratar en la gestión diaria del servicio es el referente a
la gestión y coordinación del mantenimiento de los sistemas. En este sentido,
se deberá establecer contractualmente de acuerdo con los requisitos mínimos
de normativas como el Esquema Nacional de Seguridad (ENS) la obligación de
mantener actualizados los sistemas para garantizar su correcto funcionamien-
to, así como eliminar las posibles vulnerabilidades que pueden afectar a los
sistemas.
© FUOC • PID_00241999 18 Introducción a la seguridad en cloud computing
De acuerdo con normativas como el ENS o normas como la ISO27001, los sis-
temas afectados deberán disponer de medidas para la continuidad del servicio.
Si bien los niveles de disponibilidad, así como los tiempos de recuperación en
la prestación de servicios, se encuentran recogidos contractualmente a través
de los SLA, se deberá solicitar al proveedor evidencia de que existe un plan
de continuidad de negocio que garantice la restauración de los servicios. El
proveedor deberá informar a la organización cliente de:
1.1.6. Finalización
Figura 3. Control de medidas de seguridad sobre la base de la norma ISO 27001 y Cloud
Control Matrix (CSA)
© FUOC • PID_00241999 22 Introducción a la seguridad en cloud computing
Las preguntas críticas que las organizaciones deben hacerse a sí mismas y a sus
proveedores de la nube durante cada paso son las siguientes:
• De acuerdo con los requerimientos del cliente, ¿el proveedor tiene proce-
sos apropiados de gobernanza y notificación?
5) Políticas de privacidad:
• ¿Los servicios del proveedor cuentan con controles apropiados para ma-
nejar datos personales?
• Basado en el modelo que aplique (IaaS, PaaS, SaaS), ¿está claro quién tiene
la responsabilidad de la seguridad de las aplicaciones (cliente o proveedor)?
7) Asegurar la red:
• ¿Qué capacidad tiene el proveedor para hacer frente a los ataques de de-
negación de servicio?
• ¿Está el acceso a la red del cliente separado del acceso a la red del provee-
dor?
• ¿El acuerdo de servicio requiere que todos los términos de seguridad tam-
bién deben aplicar a cualquier proveedor de servicios utilizado por el pro-
veedor?
• ¿Está claro que todos los datos de los clientes del servicio en la nube se
borran en el momento de finalizar el proceso de migración o salida?
Los ataques contra los sistemas de información son, cada día, no solo más nu-
merosos y diversos, sino también más peligrosos o potencialmente dañinos.
Aunque las acciones y medidas preventivas, adoptadas en función de los re-
sultados obtenidos de los preceptivos análisis de riesgos a los que deben so-
meterse todos los sistemas públicos, contribuyen sin lugar a dudas a reducir el
número de ciberincidentes, la realidad nos muestra que, desafortunadamente,
no todos pueden prevenirse.
• Normativa de seguridad.
Los organismos del ámbito de aplicación del ENS deben poseer un Plan de
respuesta a ciberincidentes que dé adecuada respuesta a sus requisititos espe-
cíficos, atendiendo a la misión, el tamaño, la estructura y las funciones de la
organización. El Plan debe, asimismo, determinar y asegurar que se dispone
de los recursos humanos y materiales necesarios, y debe contar con el impres-
cindible apoyo por parte de la Dirección.
AWS ofrece la posibilidad de añadir una capa de seguridad adicional a los datos
en reposo en la nube, proporcionando características de cifrado en los servicios
de base de datos y almacenamiento, como EBS, S3, Glacier, Oracle RDS, SQL
Server RDS y Redshift.
AWS también proporciona diversas API para que pueda integrar el cifrado y
la protección de los datos con cualquiera de los servicios desarrollados en un
entorno de AWS.
© FUOC • PID_00241999 30 Introducción a la seguridad en cloud computing
Se recomienda crear cuentas separadas para los usuarios de Amazon con el fin
de no compartir contraseñas. Hay que asegurar también que no se utilicen
cuentas root y que las cuentas solo tengan los privilegios necesarios, por ejem-
plo las cuentas de desarrollador. AWS Identity and Access Management (IAM)
permite definir cuentas de usuarios individuales con permisos en los recursos
de AWS.
1)�Tamaño�de�instancia
2)�Elección�de�región
3)�Balanceo�de�carga
Los ataques DDoS más grandes pueden superar el tamaño de una única ins-
tancia de Amazon EC2. Al mitigar estos ataques, hay que considerar opciones
para balancear la carga. Con Elastic Load Balancing (ELB) se puede reducir el
riesgo de sobrecarga de la aplicación mediante la distribución de tráfico entre
muchas instancias de backend. ELB puede balancear automáticamente, lo que
le permite gestionar grandes volúmenes de tráfico, como los volúmenes resul-
tantes de los ataques DDoS.
ELB solo acepta conexiones TCP bien formadas. Esto significa que muchos de
los ataques DDoS, como inundaciones SYN o ataques de reflexión UDP, no
serán aceptados por ELB. Cuando ELB detecta estos tipos de ataques, escala
automáticamente para absorber el tráfico adicional.
4)�Entrega�a�escala�mediante�AWS�Edge�Locations
© FUOC • PID_00241999 32 Introducción a la seguridad en cloud computing
Con estos servicios, el contenido se sirve y las consultas DNS se resuelven des-
de ubicaciones que a menudo están más cerca de sus usuarios finales. Ama-
zon CloudFront es un servicio de red de distribución de contenido (CDN) que
se puede utilizar para entregar todo el sitio web, incluido contenido estático,
dinámico, de transmisión e interactivo. Las conexiones TCP persistentes y el
tiempo de vida variable (TTL) se pueden utilizar para acelerar la entrega de
contenido, incluso si no se puede almacenar en caché. Esto permite usar Ama-
zon CloudFront para proteger una aplicación web, incluso si no se está sirvien-
do contenido estático. Amazon CloudFront solo acepta conexiones bien for-
madas para evitar que muchos ataques DDoS comunes –como inundaciones
SYN y ataques de reflexión UDP– lleguen a tu origen. Los ataques DDoS están
geográficamente aislados cerca de la fuente, lo que evita que el tráfico afecte
a otras ubicaciones. Estas capacidades pueden mejorar considerablemente la
capacidad para seguir sirviendo tráfico a los usuarios finales durante ataques
DDoS mayores. Se puede utilizar Amazon CloudFront para proteger un origen
en AWS o en cualquier otro lugar de internet.
5)�Resolución�de�nombres�de�dominio
1)�Detectar�y�filtrar�peticiones�web�malintencionadas
En AWS, se puede utilizar Amazon CloudFront y AWS WAF para defender una
aplicación contra estos ataques. Amazon CloudFront permite almacenar en ca-
ché estática el contenido y servirlo desde AWS Edge Locations. Además, Ama-
zon CloudFront puede cerrar automáticamente conexiones de lectura lenta o
ataques de escritura lenta. Se puede utilizar la restricción geográfica Amazon
CloudFront para bloquear ataques que se originen desde ubicaciones geográ-
ficas donde no se espera servir a los usuarios finales.
Puede ser difícil identificar la firma de un ataque DDoS o identificar las di-
recciones IP que están participando en el ataque. Se puede utilizar la consola
AWS WAF para ver una muestra de las peticiones que Amazon CloudFront ha
enviado a AWS WAF. Algunos ataques consisten en tráfico web que se disfraza
para parecer tráfico procedente de un usuario final. Para mitigar este tipo de
ataque, se puede utilizar una función AWS Lambda para implementar listas
negras basadas en una tasa. Si un bot o crawler excede este límite, se puede
utilizar AWS WAF para bloquear automáticamente futuras peticiones.
2)�Escala�para�absorber
Del mismo modo, si no se espera que los usuarios finales o las aplicaciones
externas se comuniquen con la aplicación en ciertos puertos o protocolos,
ese tipo de tráfico debería no ser aceptado. Este concepto se conoce como
reducción de la superficie de ataque.
Los grupos de seguridad y las ACL de red son similares, ya que permiten con-
trolar el acceso a los recursos de AWS dentro de una VPC. Los grupos de segu-
ridad permiten controlar tráfico entrante y saliente a nivel de instancia, y la
ACL de red ofrece capacidades similares, pero a nivel de subred VPC.
1)�Grupos�de�seguridad
2)�Listas�de�control�de�acceso�a�la�red
3)�Protección�basada�en�el�origen�de�las�peticiones
4)�Protección�de�los�puntos�finales�de�API
Con Amazon API Gateway, no es necesario que ejecute sus propios servidores
para la API, y se pueden ocultar otros componentes de la aplicación al acceso
público. Esto ayuda a evitar que los recursos de AWS sean atacados mediante
un DDoS. Amazon API Gateway está integrado con Amazon CloudFront, lo
que permite beneficiarse de la capacidad adicional de DDoS que es inherente
a ese servicio. También se puede proteger el backend del exceso de tráfico con-
figurando límites de velocidad estándar o de ráfaga para cada método para las
API de tipo REST.
Las claves SSH son un par de claves criptográficas con las que se puede au-
tenticar contra un servidor SSH como una alternativa a los logins basados en
contraseña. Con anterioridad a la autentificación se han creado un par de cla-
ves, una privada y una clave pública. La clave privada se mantiene secreta y
asegurada por el usuario, mientras que la clave pública puede ser compartida
con cualquiera.
© FUOC • PID_00241999 36 Introducción a la seguridad en cloud computing
Para configurar la autenticación SSH, hay que colocar la clave pública del usua-
rio en el servidor en un directorio específico. Cuando el usuario conecta al
servidor, el servidor comprobará que el cliente tiene la clave privada asociada.
El cliente SSH utilizará la clave privada para responder en una manera que
pruebe la propiedad de la clave privada. Entonces, el servidor permite al clien-
te conectar sin el uso de una contraseña.
Las claves SSH son muy fáciles de instalar y es la forma recomendable de re-
gistrarse en cualquier entorno de servidor Linux o Unix de modo remoto. Un
par de claves SSH se pueden generar en la máquina del usuario y puede trans-
ferirse la clave pública a sus servidores en unos minutos mediante un gestor
de configuración.
3.2.2. Cortafuegos
• Servicios privados que solo tendrían que ser accedidos por un grupo de
cuentas autorizadas o sitios seguros. Un ejemplo de esto puede ser un panel
de base de datos.
• Servicios internos que tendrían que ser accesibles solo desde dentro del
propio servidor, sin exponer el servicio al mundo exterior. Por ejemplo,
puede tratarse de una base de datos que solo acepta conexiones locales.
Hay muchos cortafuegos disponibles para sistemas Linux, algunos de los cua-
les tienen una curva de aprendizaje más pronunciada que otros. Por lo gene-
ral, la instalación del cortafuegos solo tardaría unos minutos y solo tendrá que
pasar por un servidor de configuración inicial o cuando realice cambios en los
servicios.
Las redes privadas son redes que solo son visibles dentro de la red que forman
nuestros servidores.
Para conectar equipos remotos a una red privada, se utiliza una VPN, o red
privada virtual, que es una forma de crear conexiones seguras entre equipos
remotos y presentar la conexión como una red privada local. Esto proporciona
una forma de configurar los servicios como en una red privada y de conectar
servidores remotos a través de conexiones seguras.
El uso de una VPN es efectivamente una forma de mapear una red privada
que solo los usuarios pueden ver. La comunicación será totalmente privada y
segura. Otras aplicaciones se pueden configurar para pasar el tráfico a través
© FUOC • PID_00241999 38 Introducción a la seguridad en cloud computing
de la interfaz virtual expuesta por el software VPN. De esta manera, los únicos
servicios se exponen públicamente son los servicios que están destinados a ser
accedidos por los usuarios a través de internet.
También hace que las operaciones diarias sean más complicadas. Complica los
procedimientos de actualización cuando sea necesario para volver a compro-
bar el sistema antes de ejecutar actualizaciones y reconstruir la baseline des-
pués de ejecutar la actualización. También es necesario descargar los informes
a otra ubicación para que un atacante no pueda alterar la auditoría.
Dependiendo del tipo de aislamiento, aislar una aplicación puede ser una tarea
relativamente sencilla. Paquetizar los componentes individuales en contene-
dores es una manera, pero curiosamente Docker no considera su aislamiento
una medida de seguridad.
Instalar un chroot en el entorno para cada pieza software también puede pro-
porcionar un cierto nivel de aislamiento, pero cabe recordar que hay maneras
de romper el chroot incluso para aplicaciones que se encuentra dentro de este
tipo de aislamiento.
© FUOC • PID_00241999 41 Introducción a la seguridad en cloud computing
Docker ofrece seguridad basada en capas; por defecto estos ya incorporan mé-
todos de aislamiento, pero debemos recordar que Docker es una plataforma
que puede ejecutarse en máquinas virtuales y añadir una capa suplementaria
en el caso de requerir un aislamiento extra.
Entre los ataques más comunes con los que deberemos tener especial atención
encontraremos:
1)�Uso�de�imágenes�validadas
© FUOC • PID_00241999 42 Introducción a la seguridad en cloud computing
2)�Securización�del�kernel�de�Linux
3)�Recursos�del�sistema�con�ulimit
docker run --name <nombre container> --ulimit nofile=<soft limit>:<hard limit> ...
docker run --name <nombre container> --ulimit nproc=<soft limit>:<hard limit> ...
O en el fichero /etc/systemd/system/docker.service.d:
[Service]
Environment="OPTIONS=$OPTIONS \"--default-ulimit nofile=<soft limit>:<hard limit>\""
Environment="OPTIONS=$OPTIONS \"--default-ulimit nproc=<soft limit>:<hard limit>\""
Los espacios de nombres son una característica del kernel de Linux que aísla y
virtualiza los recursos del sistema de una colección de procesos.
Los contenedores Docker son muy similares a los contenedores LXC y tie-
nen características de seguridad similares. Cuando se inicia un contenedor con
Docker se crean un conjunto de espacios de nombres y grupos de control para
el contenedor.
Para remapear nuestro usuario con otro usuario con su propio identificador
dentro del contenedor, ejecutaremos:
Esta instrucción tomará el identificador del <usuario> dentro del host y lo re-
mapeará dentro del contenedor siguiendo la fórmula:
© FUOC • PID_00241999 44 Introducción a la seguridad en cloud computing
5)�Capabilities
Docker utiliza esta granulación de privilegios para restringir los accesos a re-
cursos, definiendo a qué capas podrá tener acceso el contenedor.
Por defecto, el contenedor podrá leer (read), escribir (write) y mknod sobre es-
tos dispositivos. Estos privilegios pueden ser sobreescritos mediante las opcio-
nes :rwm para cada etiqueta device:
6)�Módulos�de�seguridad�(AppArmor)
© FUOC • PID_00241999 45 Introducción a la seguridad en cloud computing
7)�Computación�segura�o�Seccomp
{
"defaultAction": "SCMP_ACT_ERRNO",
"architectures": [
"SCMP_ARCH_X86_64",
"SCMP_ARCH_X86",
"SCMP_ARCH_X32"
],
"syscalls": [
{
"name": "accept",
"action": "SCMP_ACT_ALLOW",
"args": []
},
© FUOC • PID_00241999 46 Introducción a la seguridad en cloud computing
{
"name": "accept4",
"action": "SCMP_ACT_ALLOW",
"args": []
},
...
]
}
8)�Limitación�de�CPU
En algunos entornos nos interesará la limitación del uso de la CPU del host
para protegerlo frente a ataques que intenten vulnerar las capacidades del pro-
cesador anfitrión; para ello, Docker dispone de opciones de configuración es-
pecíficas:
a)�--cpu-shares <int>
b)�--cpu-quota <int>
c)�--cpu-period <int>
d)�--cpuset-cpus <string>
© FUOC • PID_00241999 47 Introducción a la seguridad en cloud computing
9)�Limitación�de�RAM
Los contenedores pueden hacer uso de la memoria SWAP, que amplía los lími-
tes de la memoria RAM establecida por el parámetro –memory. Se establece así
el uso total de memoria como memoria + memoria SWAP asignada.
d)�--memory-swappiness <int>
10)�Redes
Cada contenedor Docker tiene su propia pila de red, lo que significa que un
contenedor no obtiene acceso privilegiado a los sockets o interfaces de otro
contenedor, aunque esto es posible si el sistema host está configurado para
ello, e incluso interactuar con hosts externos.
La seguridad de los sistemas es una cuestión bien tratada por los propios con-
tenedores, y es el propio Docker el que está centrando cada vez más esfuerzos
en mejorar los sistemas integrados de seguridad de estos. No obstante, para
comprobar que nada quede en el descuido, incluimos un listado de noventa
buenas prácticas desarrolladas por el Center for Internet Security (CIS) para
Docker, que se podrán seguir a modo de checklist.
3.1 Comprobar que la propiedad del archivo docker.service está establecida en root:root
3.2. Comprobar que los permisos de archivo docker.service están establecidos en 644 o más restrictivos
3.3. Comprobar que la propiedad del archivo docker-registry.service está establecida en root:root
3.4 Comprobar que los permisos de archivo docker-registry.service están establecidos en 644 o más restrictivos
3.5. Comprobar que la propiedad del archivo docker.socket está establecida en root:root
3.6. Comprobar que los permisos de archivo docker.socket se establecen en 644 o más restrictivos
3.7. Comprobar que la propiedad del archivo de entorno Docker está establecida en root:root
3.8. Comprobar que los permisos de archivo de entorno de Docker se establecen en 644 o más restrictivos
3.9. Comprobar que la propiedad del archivo del entorno docker-network está establecida en root:root
3.10. Comprobar que los permisos de archivos de entorno de red Docker están configurados en 644 o más restrictivos
3.11. Comprobar que la propiedad del archivo del entorno docker-registry está establecida en root:root
3.12. Comprobar que los permisos de archivo del entorno de registro de base de datos se establecen en 644 o más restrictivos
3.13. Comprobar que la propiedad del archivo del entorno de almacenamiento acoplador está establecida en root:root
3.14 Comprobar que los permisos de archivo del entorno de almacenamiento acoplador se establecen en 644 o más restrictivos
3.15. Verificar que la propiedad del directorio /etc/docker está establecida en root:root
3.16. Verificar que los permisos del directorio /etc/docker están configurados como 755 o más restrictivos
3.17. Comprobar que la propiedad del archivo del certificado del registry se establece en root:root
3.18. Comprobar que los permisos de los archivos del certificados del registry se establecen en 444 o más restrictivos
3.19. Comprobar que la propiedad del archivo del certificado de la CA de TLS está establecida en root:root
3.20. Comprobar que los permisos de archivo del certificados de CA de TLS se establecen en 444 o más restrictivos
3.21. Verificar que la propiedad del archivo del certificado del servidor Docker está establecida en root:root
3.22. Verificar que los permisos de los archivos de certificados del servidor Docker están establecidos en 444 o más restrictivos
3.23. Comprobar que la propiedad del archivo de clave de certificado del servidor Docker se establece en root:root
3.24. Verificar que los permisos de archivo de clave de certificado del servidor Docker están establecidos en 400
3.25. Verificar que la propiedad del archivo de socket Docker está establecida en root:docker
3.26. Comprobar que los permisos de archivo de zócalo de Docker están establecidos en 660 o más restrictivos
6.1. Realizar auditorías regulares de seguridad del sistema anfitrión y de los contenedores
6.2. Monitorizar el uso, el rendimiento y la métricas de los contenedores de Docker
6.3. Uso Endpoint protection platform (EPP) para contenedores
6.4. Hacer copias de respaldo de los contenedores
6.5. Utilizar un servicio de recolegida de registros centralizado y remoto
6.6. Evitar el almacenamiento de imágenes obsoletas o sin etiquetas correctas
6.7. Evitar el almacenamiento de contenedores obsoletos o sin etiquetas correctas
© FUOC • PID_00241999 51 Introducción a la seguridad en cloud computing
5. Herramientas de seguridad
• Netskope.
• Paloalto Aperture.
• Cloudlock.
5.2.2. Ossec
5.3.1. BDD-Security
5.3.3. Nessus
• Fomentar las innovaciones entre nubes: con las API de Cloud Security
Open, los desarrolladores ahora tienen una forma de escribir funciones de
nube cruzada sin tener que integrarse a la perfección con cada nube que
toque. Esto puede abrir innovaciones en nuevos escenarios económicos,
nuevas formas de hacer negocios tanto para los usuarios como para los
proveedores de la nube.
Entre todas las iniciativas destaca la Open API de la Cloud Security Alliance. Enlace de interés