Herramientas de usuario

Herramientas del sitio


guias:traefikv2

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
guias:traefikv2 [2021/05/20 22:42] – [Configuración estática de Traefik] Sergio Alvariñoguias:traefikv2 [2021/10/29 10:35] (actual) – [Nuestro primer servicio: Portainer] Sergio Alvariño
Línea 35: Línea 35:
 ===== Ejemplo01: Uno facilito ===== ===== Ejemplo01: Uno facilito =====
  
-El siguiente fichero //docker-compose// contiene una configuración lo más sencilla posible con el %%__%%docker provider_.+El siguiente fichero //docker-compose// contiene una configuración lo más sencilla posible con el **//docker provider//**.
  
 Preparamos los ficheros y directorios de trabajo: Preparamos los ficheros y directorios de trabajo:
Línea 46: Línea 46:
 El contenido del fichero ''%%~/work/docker/ejemplo01/traefik/docker-compose.yml%%'' sería: El contenido del fichero ''%%~/work/docker/ejemplo01/traefik/docker-compose.yml%%'' sería:
  
-<code yml>+<code yaml>
 version: '3' version: '3'
  
Línea 99: Línea 99:
 Con este //Traefik// básico que hemos lanzado, ya prodríamos lanzar servicios que conectaran con el mismo. Vamos a añadir unas lineas a nuestro fichero //docker-compose//, que quedaría así: Con este //Traefik// básico que hemos lanzado, ya prodríamos lanzar servicios que conectaran con el mismo. Vamos a añadir unas lineas a nuestro fichero //docker-compose//, que quedaría así:
  
-<code yml>+<code yaml>
 version: '3' version: '3'
  
Línea 219: Línea 219:
 ==== Services ==== ==== Services ====
  
-Serían los componentes del //“backend”"//, en nuestro caso serán servicios implementados en contenedores Docker.+Serían los componentes del //“backend”//, en nuestro caso serán servicios implementados en contenedores Docker.
  
 **Los //services// son parte de la configuración dinámica.** **Los //services// son parte de la configuración dinámica.**
Línea 239: Línea 239:
 Vamos con un ejemplo un pelín más complejo. Vamos a definir un contenedor de //Traefik// que simplemente expone su //Dashboard//, de momento no vamos a definir más contenedores, pero podremos añadirlos a este escenario en el futuro. Vamos con un ejemplo un pelín más complejo. Vamos a definir un contenedor de //Traefik// que simplemente expone su //Dashboard//, de momento no vamos a definir más contenedores, pero podremos añadirlos a este escenario en el futuro.
  
-La gracia del ejemplo es que //Traefik// obtendrá los certificados SSL del dominio (p.ej. miDominio.com) automáticamente desde [[https://letsencrypt.org/|//Let’s Encrypt//]]. Y expondrá el //dashboard// en un subdominio, digamos en https://dashtraefik.miDominio.com.+La gracia del ejemplo es que //Traefik// obtendrá los certificados SSL del dominio (p.ej. miDominio.com) automáticamente desde //[[https://letsencrypt.org/|Let’s Encrypt]]//. Y expondrá el //dashboard// en un subdominio, digamos en https://dashtraefik.miDominio.com.
  
 Preparamos los directorios y los ficheros de trabajo. Preparamos los directorios y los ficheros de trabajo.
Línea 467: Línea 467:
 </code> </code>
  
-Una vez definido nuestro //middleware// de tipo //basicAuth// solo nos falta definir el [[https://doc.traefik.io/traefik/routing/routers/|//router//]] para nuestro //dashboard//. Lo llamaremos ''%%mydash%%'':+Una vez definido nuestro //middleware// de tipo //basicAuth// solo nos falta definir el //[[https://doc.traefik.io/traefik/routing/routers/|router]]// para nuestro //dashboard//. Lo llamaremos ''%%mydash%%'':
  
 <code yaml> <code yaml>
Línea 570: Línea 570:
 Definimos los //middlewares//: Definimos los //middlewares//:
  
-  * ****//secureHeaders//**** Que define una serie de cabeceras que vamos a aplicar a todas las conexiones HTTP de nuestro //Traefik//. * **//frameDeny: true//** Para evitar ataques [[https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#click-jacking|//click-jacking//]] * **//sslRedirect: true//** Para permitir solo peticiones //https// * **//browserXssFilter//** Para paliar ataques de [[https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#cross-site_scripting_xss|//cross site scripting//]] * **//contentTypeNosniff: true//** Ver [[https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options|referencia]] * **//forceSTSHeader: true//**: fuerza cabeceras STS para todas las conexiones, con el flag //preload// y la directiva //includeSubdomains// y un //max-age// de un año. +  * **//secureHeaders//**\\ Que define una serie de cabeceras que vamos a aplicar a todas las conexiones HTTP de nuestro //Traefik//. 
-  * ****//local-whitelist//**** Los servicios a los que apliquemos este //middleware// sólo se podrán acceder desde IP en la //whitelist//. Este //middleware// es interesante si accedes a los servicios desde la intranet. +  * **//frameDeny: true//**\\ Para evitar ataques //[[https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#click-jacking|click-jacking]]// 
-  * ****//user-auth//**** Para definir credenciales de acceso a nuestros servicios con //basicAuth//. //Traefik// nos pedirá usuario y contraseña para los servicios a los que apliquemos este //middleware//+  * **//sslRedirect: true//**\\ Para permitir solo peticiones //https// 
-  * ****//localsec//**** Este es un ejemplo de “cadena de //middlewares//”, aplicar este //middleware// equivale a aplicar //secureHeaders// y //local-whitelist//. **//chain//** es muy interesante para organizar nuestros //middlewares// y aplicar la misma configuración a varios contenedores.+  * **//browserXssFilter//**\\ Para paliar ataques de //[[https://developer.mozilla.org/en-US/docs/Web/Security/Types_of_attacks#cross-site_scripting_xss|cross site scripting]]// 
 +  * **//contentTypeNosniff: true//**\\ Ver [[https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options|referencia]] 
 +  * **//forceSTSHeader: true//**:\\ fuerza cabeceras STS para todas las conexiones, con el flag //preload// y la directiva //includeSubdomains// y un //max-age// de un año. 
 +  * **//local-whitelist//**\\ Los servicios a los que apliquemos este //middleware// sólo se podrán acceder desde IP en la //whitelist//. Este //middleware// es interesante si accedes a los servicios desde la intranet. 
 +  * **//user-auth//**\\ Para definir credenciales de acceso a nuestros servicios con //basicAuth//. //Traefik// nos pedirá usuario y contraseña para los servicios a los que apliquemos este //middleware//
 +  * **//localsec//**\\ Este es un ejemplo de “cadena de //middlewares//”, aplicar este //middleware// equivale a aplicar //secureHeaders// y //local-whitelist//. **//chain//** es muy interesante para organizar nuestros //middlewares// y aplicar la misma configuración a varios contenedores.
  
 Contenido del fichero ''%%middlewares.yml%%'': Contenido del fichero ''%%middlewares.yml%%'':
Línea 663: Línea 668:
 ==== docker-compose.yml ==== ==== docker-compose.yml ====
  
-Ahora que ya tenemos listos los ficheros de configuración de //Traefik// vamos a definir el fichero ''%%docker-compose.yml%%'': * Definimos siempre la versión de nuestras imágenes //Docker// explicitamente. Es muy mala idea usar ''%%:latest%%'' en producción, hay que saber que versión usamos y hacer las actualizaciones con conocimiento de causa. * Definimos un nombre (''%%traefik%%'') para nuestro contenedor, y definimos una política para ''%%restarts%%'' * Establecemos la opción ''%%security_opt: no-new-privileges%%'' para impedir escaladas de privilegios con ''%%setuid%%'' * Definimos los //volumes// del contenedor //Traefik// * Mapeamos ''%%/etc/localtime%%'' para que el contenedor sincronice la hora con el //host// * Mapeamos el //socket// de //Docker//, imprescindible para el //provider docker// * Mapeamos el fichero de configuración estática ''%%traefik,yml%%'', el directorio de configuraciones dinámicas ''%%/configurations%%'' y el fichero ''%%acme.json%%'' para el //certresolver// * Añadimos etiquetas (//labels//) para la configuración dinámica del contenedor //Traefik// (concretamente del //dashboard//): * El servicio (se refiere al //dashboard//)se proveerá a través de //Traefik// * El contenedor se conecta a la red //frontend// * Se configura el router ''%%traefik-secure%%'' * Para el servicio //Traefik dashboard//(''%%api@internal%%'') * Con //middleware// ''%%user-auth%%'' * Con la regla ''%%Host(`dashtraefik.yourdomain.com`)%%'' * Por último declaramos la red (//network//) //frontend// como ''%%external%%'' ya que la hemos creado previamente.+Ahora que ya tenemos listos los ficheros de configuración de //Traefik// vamos a definir el fichero ''%%docker-compose.yml%%'': 
 +  * Definimos siempre la versión de nuestras imágenes //Docker// explicitamente. Es muy mala idea usar ''%%:latest%%'' en producción, hay que saber que versión usamos y hacer las actualizaciones con conocimiento de causa. 
 +  * Definimos un nombre (''%%traefik%%'') para nuestro contenedor, y definimos una política para ''%%restarts%%'' 
 +  * Establecemos la opción ''%%security_opt: no-new-privileges%%'' para impedir escaladas de privilegios con ''%%setuid%%'' 
 +  * Definimos los //volumes// del contenedor //Traefik// 
 +  * Mapeamos ''%%/etc/localtime%%'' para que el contenedor sincronice la hora con el //host// 
 +  * Mapeamos el //socket// de //Docker//, imprescindible para el //provider docker// 
 +  * Mapeamos el fichero de configuración estática ''%%traefik,yml%%'', el directorio de configuraciones dinámicas ''%%/configurations%%'' y el fichero ''%%acme.json%%'' para el //certresolver// 
 +  * Añadimos etiquetas (//labels//) para la configuración dinámica del contenedor //Traefik// (concretamente del //dashboard//): 
 +    * El servicio (se refiere al //dashboard//) se proveerá a través de //Traefik// 
 +    * El contenedor se conecta a la red //frontend// 
 +    * Se configura el router ''%%traefik-secure%%'' 
 +      * Para el servicio //Traefik dashboard// (''%%api@internal%%'') 
 +      * Con //middleware// ''%%user-auth%%'' 
 +      * Con la regla ''%%Host(`dashtraefik.yourdomain.com`)%%'' 
 +  * Por último declaramos la red (//network//) //frontend// como ''%%external%%'' ya que la hemos creado previamente.
  
 <code yaml> <code yaml>
Línea 768: Línea 788:
 Añadimos un nuevo servicio ''%%portainer%%'', con las opciones de rearranque y de seguridad iguales a las de //Traefik//. Mapeamos también el fichero ''%%/etc/localtime%%'' para que el contenedor se ponga en hora con el //host//; y el //socket// ''%%docker.sock%%'' que //Portainer// necesita (//Portainer// es un //frontend// para //Docker//) Añadimos un nuevo servicio ''%%portainer%%'', con las opciones de rearranque y de seguridad iguales a las de //Traefik//. Mapeamos también el fichero ''%%/etc/localtime%%'' para que el contenedor se ponga en hora con el //host//; y el //socket// ''%%docker.sock%%'' que //Portainer// necesita (//Portainer// es un //frontend// para //Docker//)
  
-Añadimos también las etiquetas para informar a //Traefik// del nuevo servicio* El servicio se llama //portainer// * Acepta peticiones en el puerto 9000 * //Portainer// usará el //entry point// ''%%https%%'' de //Traefik// * Y la regla de enrutado será ''%%Host(`portainer.yourdomain.com`)%%''+Añadimos también las etiquetas para informar a //Traefik// del nuevo servicio
 +  * El servicio se llama //portainer// 
 +  * Acepta peticiones en el puerto 9000 
 +  * //Portainer// usará el //entry point// ''%%https%%'' de //Traefik// 
 +  * Y la regla de enrutado será ''%%Host(`portainer.yourdomain.com`)%%''
  
 Una vez completada la configuración del DNS, podemos levantar nuestro nuevo servicio con: Una vez completada la configuración del DNS, podemos levantar nuestro nuevo servicio con:
guias/traefikv2.1621550552.txt.gz · Última modificación: 2021/05/20 22:42 por Sergio Alvariño