caddy web server hardening (security header & fail2ban)

caddy hardening

Το παρον ειναι επαναδιατυπωση του channel post μου εδω

Θα χρειαστούμε αρχεία log του web server για τις υπηρεσίες που τρεχουμε, το fail2ban, ενα φίλτρο regex για τα 404 failed attempts και ενα security headers conf

Δημιουργουμε τα αρχεία στα οποία θα γράφει το caddy τα log

sudo touch /var/log/caddy/service1.log

sudo touch /var/log/caddy/service2.log

κτλ

Αν δεν προϋπάρχει, δημιουργούμε το directory
Και δίνουμε ownership στο caddy

sudo chown caddy:caddy /var/log/caddy

Δημιουργουμε το security header config

sudo nano /etc/caddy/caddy_security.conf

Paste

header {
    Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    X-Xss-Protection "1; mode=block"
    X-Content-Type-Options "nosniff"
    X-Frame-Options "DENY"
    Permissions-Policy "interest-cohort=()"
    Content-Security-Policy "upgrade-insecure-requests"
    Referrer-Policy "strict-origin-when-cross-origin"
    Cache-Control "public, max-age=15, must-revalidate"
    Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; auto>
}

Έτσι ενεργοποιουμε τα κάτωθι
λιγα λογια για την κάθε λειτουργια στα λινκ
Προσωπικά δεν έχω το τεχνικό υπόβαθρο να αναλυσω

HSTS support link

XSS filtering. link

Προστασια απο MIME Sniffing.link

clickjacking IFRAME.link

IΠροατασια απο FLOC tracking trials.link

Προσθηκη Content security policy στο πως οι user agents διαχειριζοντε insecure URLs.link

referrer cross-origin request link

Προσθετουμε log directive στο Caddyfile για να ενεργοποιησουμε το logging
Απενεργοποιουμε το log rolling, επιλεγουμε log type και εισάγουμε το security config
Υποθέτω οτι κάνουμε και reverse proxy ενα dynamic DNS domain στο localhost μας

sudo nano /etc/caddy/Caddyfile

Προσθετω

my.ddns.net {
    reverse_proxy localhost:xxxx
import /etc/caddy/caddy_security.conf
log {
    output file /var/log/caddy/prism.log {
        roll_disabled
    }
    format single_field common_log
}
}

Κάνουμε εγκατάσταση το fail2ban

sudo apt install fail2ban

Η

sudo pacman -S fail2ban

κτλ

Ανάλογα το distro και τον package manager

Εκινουμε

sudo systemctl start fail2ban

Ενεργοποιουμε το service

sudo systemctl enable fail2ban

Δημιουργούμε το regex filter

sudo nano /etc/fail2ban/filter.d/caddy-4xx.conf

Paste

[Definition]
failregex = ^<HOST>.*"(GET|POST).*" (404|444|403|400) .*$
ignoreregex =

Καθορίζουμε τα όρια για το IP blocking

sudo nano /etc/fail2ban/jail.local

Αν το αρχείο δεν υπάρχει αντιγράφουμε το jail.conf

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Προσθέτουμε

[caddy-4xx]
enabled  = true
port     = https
filter   = caddy-4xx
logpath  = /var/log/caddy/log1.log
                   /var/log/caddy/log2.log
backend  = auto
bantime  = 360m
maxretry = 50
findtime = 30

Επαληθευουμε το φίλτρο βάζοντας το να ελέγξει ενα logfile

fail2ban-regex /var/log/caddy/log1.log caddy-4xx.conf

Reload Fail2ban για να εφαρμόσει το νεο configuration

fail2ban-client reload

Check status

sudo fail2ban-client status caddy-4xx

Το Caddy χρησημοποιεί rolling logs και διουργει πολλαπλά ζημπιεαμενα log γιου ορίζουμε τον μέγιστο αριθμο και μεγεθος .επίσης έχει το json format ως default

Χρησιμοποιησαμε comon log format στο Caddyfile στο log section επίσης απενεργοποιησαμε το rolling και χρησιμοποιήσαμε single log καθως αυτή τη μορφή χρειάζεται το fail2ban

Ακόμη όμως χρειαζόμαστε ενα τροπο να ελέγξουμε το μέγεθος τον log
Θα χρησιμοποιησουμε ενα cronjob που θα τα διαγράφει και έπειτα θα επανεκινει το caddy ώστε να ξαναδημιουργησει κενά log

crontab -e

Προσθέτουμε

@daily sudo find /var/log/caddy  -name "*.log" -type 'f' -size +10M -delete && sudo systemctl restart caddy
1 «Μου αρέσει»