Diferència entre revisions de la pàgina «Wiket:ProxyInversIETI»
Línia 3: | Línia 3: | ||
Reverse Proxy Web Interface | Reverse Proxy Web Interface | ||
+ | '''Dins el IETI Cloud tenim un frontend de proxy invers implementat amb HAProxy i Apache2. Volem una interfície web per gestionar-ho amb més facilitat i poder afegir nous dominis sense necessitat de tocar arxius de configuració directament. | ||
− | + | '''El projecte pot contemplar parts molt diferenciades: | |
− | |||
1. Fer una recerca i prova de diverses interfícies web per HAProxy (tipus Roxy-Wi) per veure si hi ha alguna que ens faciliti molt la feina, adaptant-se a les nostres necessitats, i que sigui segura. | 1. Fer una recerca i prova de diverses interfícies web per HAProxy (tipus Roxy-Wi) per veure si hi ha alguna que ens faciliti molt la feina, adaptant-se a les nostres necessitats, i que sigui segura. | ||
Línia 17: | Línia 17: | ||
pfSense | pfSense | ||
Traefik v2 | Traefik v2 | ||
− | Apache ( | + | Apache (no té mode TCP pel què no pot redirigir ) |
Nginx | Nginx | ||
− | |||
− | Para realizar todos estos pasos anteriores, primero deberemos preparar el entorno. | + | '''Para realizar todos estos pasos anteriores, primero deberemos preparar el entorno. |
Para ello se utilizará un fichero Vagrantfile en el cual a partir de una serie de parametros determinados nos permitira virtualizar varias maquinas a la vez. | Para ello se utilizará un fichero Vagrantfile en el cual a partir de una serie de parametros determinados nos permitira virtualizar varias maquinas a la vez. | ||
− | El fichero contendrá los parametros necesarios para generar 5 MV's de manera que habrán 3 servidores con apache instalado, 1 proxy inverso con Traefik, y 1 equipo cliente para realizar las comprobaciones. | + | '''El fichero contendrá los parametros necesarios para generar 5 MV's de manera que habrán 3 servidores con apache instalado, 1 proxy inverso con Traefik, y 1 equipo cliente para realizar las comprobaciones. |
− | A continuación se muestra un diagrama sobre el funcionamiento del sistema desde la petición del cliente, que a traves de uno de los dominios disponibles accede al proxy inverso configurado con TraefikV2, el cual segun la carga de procesamiento que tengan los servidores lo redirigirá al servidor con menor carga de datos. | + | * Los ficheros de configuración del servicio Traefik solo se crearán, pero hará falta rellenarlos segun la configuración que se quiera realizar |
+ | |||
+ | Contenido del fichero Vagrantfile: | ||
+ | |||
+ | |||
+ | '' | ||
+ | |||
+ | Vagrant.configure("2") do |config| | ||
+ | |||
+ | (1..3).each do |i| | ||
+ | config.vm.define "node-#{i}" do |node| | ||
+ | node.vm.box = "ubuntu/focal64" | ||
+ | node.vm.hostname = "srv#{i}.ieti.local" | ||
+ | node.vm.box_url = "ubuntu/focal64" | ||
+ | node.vm.network :private_network, ip: "192.168.2.1{i}" | ||
+ | node.vm.synced_folder ".", "/home/vagrant", type: "virtualbox" | ||
+ | |||
+ | node.vm.provider :virtualbox do |v| | ||
+ | v.customize ["modifyvm", :id, "--memory", "1024"] | ||
+ | v.customize ["modifyvm", :id, "--cableconnected1", "on"] | ||
+ | v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"] | ||
+ | v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL] | ||
+ | v.gui = true | ||
+ | |||
+ | end | ||
+ | |||
+ | config.vm.provision "shell", inline: <<-SHELL | ||
+ | apt-get update | ||
+ | apt-get install -y apache2 | ||
+ | sudo ufw allow 'Apache' | ||
+ | sudo systemctl start apache2 | ||
+ | sudo echo "<html><hI>SRV#{i}</hI></html>" > /var/www/html/index.html | ||
+ | sudo systemctl restart apache2 | ||
+ | SHELL | ||
+ | end | ||
+ | end | ||
+ | |||
+ | |||
+ | #Maquina Proxy Inverso Traefik | ||
+ | config.vm.define "prxy1" do |prxy1| | ||
+ | prxy1.vm.box = "ubuntu/focal64" | ||
+ | prxy1.vm.hostname = 'prxy1' | ||
+ | prxy1.vm.box_url = "ubuntu/focal64" | ||
+ | prxy1.vm.network :private_network, ip: "192.168.2.11" | ||
+ | prxy1.vm.network :private_network, ip: "192.168.1.11" | ||
+ | prxy1.vm.synced_folder ".", "/home/vagrant", type: "virtualbox" | ||
+ | |||
+ | prxy1.vm.provider :virtualbox do |v| | ||
+ | v.customize ["modifyvm", :id, "--memory", "1024"] | ||
+ | v.customize ["modifyvm", :id, "--cableconnected1", "on"] | ||
+ | v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"] | ||
+ | v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL] | ||
+ | v.gui = true | ||
+ | end | ||
+ | |||
+ | config.vm.provision "shell", inline: <<-SHELL | ||
+ | apt-get update | ||
+ | |||
+ | #Descargamos el source code de traefik, descomprimimos el archivo y damos permisos | ||
+ | #de ejecución | ||
+ | sudo wget | ||
+ | https://github.com/traefik/traefik/releases/download/v2.8.7/traefik_v2.8.7_linux_amd64.tar.gz | ||
+ | sudo tar -xzvf traefik_v2.8.7_linux_amd64.tar.gz | ||
+ | sudo chmod +x traefik | ||
+ | |||
+ | #Movemos el binario de traefik a la carpeta bin y le permitimos el "bind" de puertos | ||
+ | sudo mv traefik /usr/local/bin/traefik | ||
+ | sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/traefik | ||
+ | |||
+ | #Creamos el grupo y usuario traefik (especificado en traefik.service) | ||
+ | sudo groupadd -g 321 traefik | ||
+ | sudo useradd -g traefik --no-user-group --home-dir /var/www --no-create-home --shell | ||
+ | /usr/sbin/nologin --system --uid 321 traefik | ||
+ | |||
+ | #Creamos la carpeta donde estara la configuración de traefik | ||
+ | #(adjuntare un archivo de muestra) | ||
+ | #y otorgamos dueños y permisos de los archivos | ||
+ | sudo mkdir /etc/traefik | ||
+ | sudo mkdir /etc/traefik/acme | ||
+ | sudo chown -R root:root /etc/traefik | ||
+ | sudo chown -R traefik:traefik /etc/traefik/acme | ||
+ | #En este paso, deberemos crear un archivo de configuración en caso de que no lo tengamos | ||
+ | sudo touch /etc/traefik/trafik.toml | ||
+ | sudo chown root:root /etc/traefik/traefik.toml | ||
+ | sudo chmod 644 /etc/traefik/traefik.toml | ||
+ | |||
+ | #Aqui moveremos el archivo de configuración DEL SERVICIO, en caso de no tenerlo deberemos | ||
+ | #crearlo y copiar el texto que haya en el archivo de ejemplo que he adjuntado | ||
+ | sudo touch /etc/systemd/system/traefik.service | ||
+ | sudo chown root:root /etc/systemd/system/traefik.service | ||
+ | sudo chmod 644 /etc/systemd/system/traefik.service | ||
+ | |||
+ | #Recargamos el servicio y lo iniciamos | ||
+ | sudo systemctl daemon-reload | ||
+ | sudo systemctl start traefik.service | ||
+ | sudo systemctl enable traefik.service | ||
+ | |||
+ | #Añadimos los nombres de los servidores a /etc/hosts | ||
+ | sudo echo "192.168.2.10 srv1.ieti.local" >> /etc/hosts | ||
+ | sudo echo "192.168.2.11" srv2.ieti.local >> /etc/hosts | ||
+ | sudo echo "192.168.2.12" srv3.ieti.local >> /etc/hosts | ||
+ | |||
+ | SHELL | ||
+ | |||
+ | end | ||
+ | |||
+ | |||
+ | #Maquina cliente | ||
+ | config.vm.define "cli1" do |cli1| | ||
+ | cli1.vm.box = "ubuntu/focal64" | ||
+ | cli1.vm.hostname = 'cli1' | ||
+ | cli1.vm.box_url = "ubuntu/focal64" | ||
+ | cli1.vm.network :private_network, ip: "192.168.2.12" | ||
+ | cli1.vm.synced_folder ".", "/home/vagrant", type: "virtualbox" | ||
+ | |||
+ | cli1.vm.provider :virtualbox do |v| | ||
+ | v.customize ["modifyvm", :id, "--memory", "3072"] | ||
+ | v.customize ["modifyvm", :id, "--cableconnected1", "on"] | ||
+ | v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"] | ||
+ | v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL] | ||
+ | v.gui = true | ||
+ | end | ||
+ | |||
+ | config.vm.provision "shell", inline: <<-SHELL | ||
+ | sudo apt-get update | ||
+ | sudo apt install ubuntu-gnome-desktop | ||
+ | SHELL | ||
+ | end | ||
+ | end | ||
+ | '' | ||
+ | |||
+ | |||
+ | |||
+ | '''A continuación se muestra un diagrama sobre el funcionamiento del sistema desde la petición del cliente, que a traves de uno de los dominios disponibles accede al proxy inverso configurado con TraefikV2, el cual segun la carga de procesamiento que tengan los servidores lo redirigirá al servidor con menor carga de datos. ''' | ||
[[Fitxer:Blank diagram.png|900px|centre|]] | [[Fitxer:Blank diagram.png|900px|centre|]] | ||
Línia 59: | Línia 191: | ||
insecureSkipVerify = true | insecureSkipVerify = true | ||
− | + | Indicamos el fichero de logs | |
[log] | [log] | ||
filePath = "/var/log/traefik.log" | filePath = "/var/log/traefik.log" | ||
− | + | ||
+ | Habilitamos el acceso al dashboard | ||
+ | |||
[api] | [api] | ||
dashboard = true | dashboard = true |
Revisió del 15:26, 8 juny 2023
Projectes Ciberseguretat 2022-2023 - IETI Cloud
Reverse Proxy Web Interface
Dins el IETI Cloud tenim un frontend de proxy invers implementat amb HAProxy i Apache2. Volem una interfície web per gestionar-ho amb més facilitat i poder afegir nous dominis sense necessitat de tocar arxius de configuració directament.
El projecte pot contemplar parts molt diferenciades:
1. Fer una recerca i prova de diverses interfícies web per HAProxy (tipus Roxy-Wi) per veure si hi ha alguna que ens faciliti molt la feina, adaptant-se a les nostres necessitats, i que sigui segura.
2. Implementar una senzilla aplicació web de management de proxy invers (en qualsevol llenguatge de programació com PHP o Python) que carregui la configuració de HAProxy, ens la mostri, i ens permeti afegir dominis i subdominis a la nostra infraestructura.
3. Afegir funcionalitat de WAF (Web Application Firewall) com mod_security. Seria ideal implementar WAF Enteprise en el HAProxy. Cal analitzar casos d’ús (calen certificats HTTPS?)
4. Investigar la gestió de proxy invers amb softwares més avançats amb interfície web, i veure si ens serveix per als nostres propòsits: pfSense Traefik v2 Apache (no té mode TCP pel què no pot redirigir ) Nginx
Para realizar todos estos pasos anteriores, primero deberemos preparar el entorno. Para ello se utilizará un fichero Vagrantfile en el cual a partir de una serie de parametros determinados nos permitira virtualizar varias maquinas a la vez.
El fichero contendrá los parametros necesarios para generar 5 MV's de manera que habrán 3 servidores con apache instalado, 1 proxy inverso con Traefik, y 1 equipo cliente para realizar las comprobaciones.
- Los ficheros de configuración del servicio Traefik solo se crearán, pero hará falta rellenarlos segun la configuración que se quiera realizar
Contenido del fichero Vagrantfile:
Vagrant.configure("2") do |config|
(1..3).each do |i| config.vm.define "node-#{i}" do |node| node.vm.box = "ubuntu/focal64" node.vm.hostname = "srv#{i}.ieti.local" node.vm.box_url = "ubuntu/focal64" node.vm.network :private_network, ip: "192.168.2.1{i}" node.vm.synced_folder ".", "/home/vagrant", type: "virtualbox" node.vm.provider :virtualbox do |v| v.customize ["modifyvm", :id, "--memory", "1024"] v.customize ["modifyvm", :id, "--cableconnected1", "on"] v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"] v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL] v.gui = true end config.vm.provision "shell", inline: <<-SHELL apt-get update apt-get install -y apache2 sudo ufw allow 'Apache' sudo systemctl start apache2 sudo echo "<html><hI>SRV#{i}</hI></html>" > /var/www/html/index.html sudo systemctl restart apache2 SHELL end end
#Maquina Proxy Inverso Traefik config.vm.define "prxy1" do |prxy1| prxy1.vm.box = "ubuntu/focal64" prxy1.vm.hostname = 'prxy1' prxy1.vm.box_url = "ubuntu/focal64" prxy1.vm.network :private_network, ip: "192.168.2.11" prxy1.vm.network :private_network, ip: "192.168.1.11" prxy1.vm.synced_folder ".", "/home/vagrant", type: "virtualbox"
prxy1.vm.provider :virtualbox do |v| v.customize ["modifyvm", :id, "--memory", "1024"] v.customize ["modifyvm", :id, "--cableconnected1", "on"] v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"] v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL] v.gui = true end
config.vm.provision "shell", inline: <<-SHELL apt-get update
#Descargamos el source code de traefik, descomprimimos el archivo y damos permisos #de ejecución sudo wget https://github.com/traefik/traefik/releases/download/v2.8.7/traefik_v2.8.7_linux_amd64.tar.gz sudo tar -xzvf traefik_v2.8.7_linux_amd64.tar.gz sudo chmod +x traefik
#Movemos el binario de traefik a la carpeta bin y le permitimos el "bind" de puertos sudo mv traefik /usr/local/bin/traefik sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/traefik
#Creamos el grupo y usuario traefik (especificado en traefik.service) sudo groupadd -g 321 traefik sudo useradd -g traefik --no-user-group --home-dir /var/www --no-create-home --shell /usr/sbin/nologin --system --uid 321 traefik #Creamos la carpeta donde estara la configuración de traefik #(adjuntare un archivo de muestra) #y otorgamos dueños y permisos de los archivos sudo mkdir /etc/traefik sudo mkdir /etc/traefik/acme sudo chown -R root:root /etc/traefik sudo chown -R traefik:traefik /etc/traefik/acme #En este paso, deberemos crear un archivo de configuración en caso de que no lo tengamos sudo touch /etc/traefik/trafik.toml sudo chown root:root /etc/traefik/traefik.toml sudo chmod 644 /etc/traefik/traefik.toml
#Aqui moveremos el archivo de configuración DEL SERVICIO, en caso de no tenerlo deberemos #crearlo y copiar el texto que haya en el archivo de ejemplo que he adjuntado sudo touch /etc/systemd/system/traefik.service sudo chown root:root /etc/systemd/system/traefik.service sudo chmod 644 /etc/systemd/system/traefik.service
#Recargamos el servicio y lo iniciamos sudo systemctl daemon-reload sudo systemctl start traefik.service sudo systemctl enable traefik.service
#Añadimos los nombres de los servidores a /etc/hosts sudo echo "192.168.2.10 srv1.ieti.local" >> /etc/hosts sudo echo "192.168.2.11" srv2.ieti.local >> /etc/hosts sudo echo "192.168.2.12" srv3.ieti.local >> /etc/hosts
SHELL end
#Maquina cliente config.vm.define "cli1" do |cli1| cli1.vm.box = "ubuntu/focal64" cli1.vm.hostname = 'cli1' cli1.vm.box_url = "ubuntu/focal64" cli1.vm.network :private_network, ip: "192.168.2.12" cli1.vm.synced_folder ".", "/home/vagrant", type: "virtualbox"
cli1.vm.provider :virtualbox do |v| v.customize ["modifyvm", :id, "--memory", "3072"] v.customize ["modifyvm", :id, "--cableconnected1", "on"] v.customize ["modifyvm", :id, "--uart1", "0x3F8", "4"] v.customize ["modifyvm", :id, "--uartmode1", "file", File::NULL] v.gui = true end
config.vm.provision "shell", inline: <<-SHELL sudo apt-get update sudo apt install ubuntu-gnome-desktop SHELL end
end
A continuación se muestra un diagrama sobre el funcionamiento del sistema desde la petición del cliente, que a traves de uno de los dominios disponibles accede al proxy inverso configurado con TraefikV2, el cual segun la carga de procesamiento que tengan los servidores lo redirigirá al servidor con menor carga de datos.
A partir de las maquinas obtenidas a traves del Vagrantfile, hay unos aspectos a tener en cuenta de modificar para que haya un funcionamiento correcto.
1. Editar el fichero /etc/hosts en el Proxy y añadir la IP del servidor seguido de su dominio. (Ej: 192.168.1.10 srv1.ieti.local)
2. Editar i/o añadir el fichero de configuración de Traefik (traefik.toml/traefik.yaml). Se adjunta un ejemplo:
Definimos el entryPoint (puerto por donde escuchará el proxy)
[entryPoints]
[entryPoints.web] address = ":80"
[http]
//Indicamos el host que debe redirigir [http.routers] [http.routers.my-router] rule = "Host('srv1.ieti.local')" service = "traefik" entryPoints = ["web"] [http.services] [http.services.traefik.loadBalancer] http.services.traefik.loadBalancer.servers url = "dom1.ieti.cat"
[serversTransport]
insecureSkipVerify = true
Indicamos el fichero de logs [log]
filePath = "/var/log/traefik.log"
Habilitamos el acceso al dashboard
[api]
dashboard = true insecure = true
3. Editar i/o añadir el fichero de configuración del servicio de Traefik (traefik.service). Se adjunta ejemplo:
[Unit]
Description=traefik proxy After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Restart=on-abnormal
//User and group the process will run as. User=traefik Group=traefik
//Always set "-root" to something safe in case it gets forgotten in the traefikfile. ExecStart=/usr/local/bin/traefik --configfile=/etc/traefik/traefik.toml
//Limit the number of file descriptors; see `man systemd.exec` for more limit settings. LimitNOFILE=1048576
//Use private /tmp and /var/tmp, which are discarded after traefik stops.
PrivateTmp=true
//Use a minimal /dev (May bring additional security if switched to 'true', but it may not work on //Raspberry Pi's or other devices, so it has been disabled in this dist.)
PrivateDevices=false
//Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
ProtectHome=true
//Make /usr, /boot, /etc and possibly some more folders read-only.
ProtectSystem=full
//… except /etc/ssl/traefik, because we want Letsencrypt-certificates there. // This merely retains r/w access rights, it does not add any new. Must still be writable on the //host!
ReadWriteDirectories=/etc/traefik/acme
// The following additional security directives only work with systemd v229 or later. // They further restrict privileges that can be gained by traefik. Uncomment if you like. // Note that you may have to add capabilities required by any plugins in use.
CapabilityBoundingSet=CAP_NET_BIND_SERVICE AmbientCapabilities=CAP_NET_BIND_SERVICE NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
Paginas de referencia:
Instalación de Traefik:
https://gist.github.com/ubergesundheit/7c9d875befc2d7bfd0bf43d8b3862d85#file-traefik-service-L3 https://blog.emka.web.id/2022/09/how-to-install-traefik-in-debian.html
Documentación Oficial:
https://doc.traefik.io/traefik/getting-started/configuration-overview/#the-static-configuration https://doc.traefik.io/traefik/routing/overview/ https://doc.traefik.io/traefik/routing/entrypoints/