Marvin Pascale

[B.Log]

12 Luglio 2023

Traefik e Apache httpd

La scorsa settimana, un cliente mi ha contatto perché aveva la necessità -e molta fretta- di pubblicare un sito rispettando delle indicazioni di sicurezza minime.

Parlando con dei colleghi, ho scoperto che richieste del genere sono quasi quotidiane e, quindi, ho pensato di proporvi una soluzione veloce e sufficientemente sicura.

Il nostro amico docker

Anche per questa volta utilizzeremo docker: nello specifico ho preparato un file docker compose che avvia un container httpd e usa come reverse proxy Traefik.

Come già detto più volte io preferisco NPM (Nginx proxy manager) ma oggi utilizzeremo Traefik perché non ci costringe a configurare nulla… e quando dico nulla intendo proprio NULLA.

Creiamo una cartella “/opt/sito” e al suo interno creiamo il file docker-compose.yml e un’altra cartella con il sito che dobbiamo pubblicare.

NB: Per semplicità vi mostrerò un sito solo html ma potete usare il container che vi serve

# tree
.
├── docker-compose.yml
├── html
    ├── img
    │   └── logo.png
    └── index.html

docker-compose.yml

version: "3"

services:
  public_apache:
    container_name: public_apache
    image: httpd:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.www-secure.rule=Host(`[DOMINIO]it`)"
      - "traefik.http.routers.www-secure.tls=true"
      - "traefik.http.routers.www-secure.tls.certresolver=lets"
    restart: always
    volumes:
      - ./html:/usr/local/apache2/htdocs/

  traefik:
    image: traefik:v2.10
    container_name: traefik
    command:
    #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--certificatesresolvers.lets.acme.httpchallenge=true"
      - "--certificatesresolvers.lets.acme.keytype=RSA4096"
      - "--certificatesresolvers.lets.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.lets.acme.email=[EMAIL]"
      - "--certificatesresolvers.lets.acme.storage=/letsencrypt/acme.json"
    restart: always
    ports:
      - "443:443"
      - "80:80"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

Prerequisiti e primo avvio

Arrivati a questo punto, dovremmo già avere installato docker,docker compose e avere il DNS configurato.

NB: Per “dns configurato” intendo che se volessimo pubblicare il sito test01.inmarvinwetrust.it dovremmo aver registrato un record dns che punti all’ip del nostro server. Nel mio caso ho creato un record di tipo A ma va bene anche un CNAME.

Non ci resta che avviare il tutto

# docker-compose up -d
[+] Running 3/3
 ⠿ Network site_default     Created                                                                                                                       0.1s
 ⠿ Container public_apache  Started                                                                                                                       0.4s
 ⠿ Container traefik        Started      

il gioco è fatto. Proviamo ad aprire il sito https://test01.inmarvinwetrust.it.

Home

Per vedere la dashboard di traefik dobbiamo puntare alla porta 8080 es: http://test01.inmarvinwetrust.it:8080

Home

Sicurezza

Lasciando tutto così possiamo avere già un accettabile livello di sicurezza e possiamo verificarlo facilmente

SSL_test

Da qui in poi si può solo migliorare. Non dimentichiamoci di esporre solo le porte necessarie (in questo caso la 80 e la 443) configurando il firewall e in installiamo CrowdSec.

Lavorando un po’ sulle configurazioni del reverse proxy si può raggiungere una valutazione di A+

Conclusioni doverose

Sebbene questo articolo voglia mostrare quanto sia rapido utilizzare Docker e Traefik come mezzo per la pubblicazione di un sito web, è doveroso dire che questa configurazione potrebbe non essere adatta a tutti i casi d’uso e che la sicurezza intesa come sicurezza a 360° richiede un approccio più olistico.

Ci sono molte dimensioni della sicurezza online, tra cui la sicurezza della connessione (che è ciò che è stato affrontato), ma anche la sicurezza del server, la sicurezza dell’applicazione web, la sicurezza dei dati, ecc.


Le opinioni in quanto tali sono opinabili e nulla ti vieta di approfondire l’argomento.

Risorse: