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