Προστατεύουμε me 2fa , mfa τις υπηρεσίες που τρέχουμε στο rpi με το caddy-security plugin

fff

Το παρόν ειναι αναδιατύπωση του ποστ μου εδώ

Τι θα επιτύχουμε

Ένα portal με ανακατευθήνσεις προς τις selfhosted υπηρεσίες μας που θα προστατεύονται πίσω από reverse proxy , αυτοματοποιημένες ανακατευθύνσεις στο https ,αυτόματα tls cert για αυτές , απόκρυψή τους πίσω από ένα μοναδικό dynamic dns domain καθώς το πρόσθετο θα χειρίζεται τις ανακατευθύνσεις προς τις εσωτερικές σας τοπικές διευθύνσεις IP στις οποίες βρίσκονται οι υπηρεσίες σας και τέλος το hardening τους με multifactor authentication μέσω authenticator app η USB hardwhare κλειδί.

Τι θα χρειαστούμε

caddyserver
caddy-security plugin
xcaddy
GO language
bcrypt-cl (optional)

Το pluin δεν ειναι διαθέσιμο για arm64
θα πρεπει να κάνουμε compile το εκτελεσιμο του caddy με το plugin ενσωματωμένο με το εργαλείο xcaddy το οποιο για να το εγκαταστήσουμε και να το τρέξουμε θα χρειαστούμε τη go

εγκατάσταση της go

arch

sudo pacman -S go

debian

sudo apt install golang-go

η οποια αλλη μεθοδο επιλεξεις duckduckgo it

εγκατάσταση του xcaddy

go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

Build τον caddyserver με το caddy-security plugin

τα cloudflare και caddy-trace είναι του ίδιου dev και δεν τα χρησιμοποίησα αλλά μου φάνηκε καλή ιδέα να τα ενσωματώσω για αργότερα όταν εξοικειωθώ με αυτό

GOOS=linux GOARCH=arm64 go/bin/xcaddy build \
    --with github.com/greenpau/caddy-security \
    --with github.com/greenpau/caddy-trace \
    --with github.com/caddy-dns/cloudflare

Έτσι θα δημιουργήσουμε ένα εκτελέσιμο ονόματι caddy στο $HOME μας

το μεταφέρουμε στο /usr/bin

sudo cp caddy /usr/bin/

επαληθεύουμε οτι λειτουργεί

caddy version

θα πρέπει να μας κάνει print την έκδοση του caddyserver

δημιουργούμε το caddy config dir

sudo mkdir /etc/caddy/

και το caddy config

sudo nano /etc/caddy/Caddyfile

paste

{ 
        order authenticate first
        order trace before reverse_proxy
        order authorize before reverse_proxy
        security {
                        messaging email provider localhost-smtp-server {
                        address 192.168.1.24:1025 #your raspberry's ip
                        protocol smtp
                        passwordless
                        sender root@localhost "My Auth Portal"
                        bcc ippo@localhost 
        }

local identity store localdb {
    	realm local
	path /var/lib/caddy/users.json
  }

        authentication portal myportal {
            crypto default token lifetime 3600 
            crypto key sign-verify {env.JWT_SECRET}                    
            cookie domain ippocratis.duckdns.org
            ui {
                links {
                    "radicale" https://radicale.ippocratis.duckdns.org icon "las la-cloud"
                    "photoprism" https://photoprism.ippocratis.duckdns.org icon "las la-photo-video"
                    }
            }
            transform user {
                match origin local
                action add role authp/user
                require mfa    
                ui link "Portal Settings" /settings icon "las la-cog"
            }
        }
        authorization policy mypolicy {
            set auth url https://auth.ippocratis.duckdns.org/
            crypto key verify {env.JWT_SECRET}
            allow roles authp/admin authp/user
        }
    }
}
auth.ippocatis.duckdns.org {
    route {
        authenticate with myportal
    }
}

radicale.ippocratis.duckdns.org {
    authorize with mypolicy
    reverse_proxy localhost:5232
}

photoprism.ippocratis.duckdns.org {
    authorize with mypolicy
    reverse_proxy localhost:2342
}

Δημιουργούμε το group caddy

sudo groupadd --system caddy

Τον χρήστη caddy, with aμε ένα writeable home dir

sudo useradd --system \
    --gid caddy \
    --create-home \
    --home-dir /var/lib/caddy \
    --shell /usr/sbin/nologin \
    --comment "Caddy web server" \
    caddy

δημιουργούμε το systemd unit file

αντιγράφουμε απο
εδώ

το service file συνηθως βρίσκεται στο

/etc/systemd/system/caddy.service

στο manjaro arm ειναι στο

/etc/systemd/system/multi-user.target.wants/caddy.service

δημιουργούμε το service

sudo nano /etc/systemd/system/multi-user.target.wants/caddy.service

paste

reload daemon

sudo systemctl daemon-reload

enable unit

sudo systemctl enable --now caddy

o default χρήστης στο portal είναι ο webadmin
θα βρούμε το default password από τα log

journalctl -u caddy --no-pager | grep webadmin@localdomain.local

αντιγράφουμε το secret

ανοίγουμε την auth διεύθυνση
στο caddyfile που έβαλα πιο πάνω είναι η auth.ippocratis.duckdns.org

user = webadmin
pass = το secret που αντιγράψαμε από τα log

αλλαγή password

  • στο web interface
  • πάμε στο portal settings
  • και μετά στα passwords
  • εκεί μπορούμε να αλλάξουμε το password

τα password criteria (length,lower/upercase etc) αναφέρονται στο /var/lib/caddy/users.json και μπορούμε να τα τροποποιήσουμε σύμφωνα με τις ανάγκες μας
επίσης στο ίδιο αρχείο το οποίο είναι και το user/password database μάς
εναλλακτικά αν δε Θέλουμε να ακολουθήσουμε την διαδικασία με το default secret από τα log σε αυτό μπορούμε να καταχωρήσουμε κάποιο δικό μας hash για όποιο pass έχουμε
επιλέξει
επιλέγουμε το caddy $HOME dir (/var/lib/caddy) στο οποίο Έχει δικαιώματα write

μετατρέψουμε τα password σε hash με το εργαλείο bcrypt-cl

go install github.com/ryicoh/bcrypt-cli@latest

προσθέτουμε το ~/go/bin στο $PATH

export PATH=~/go/bin:$PATH

για τη μετατροπή

echo "mypassoword" | bcrypt-cli

μας κανει print το hash

προσθήκη multifactor authentication

  • στο caddyfile δηλώνετε με το require mfa
  • στο web interface
  • πάμε στο portal settings
  • στην κατηγορία mfa
  • προσθήκη mfa app
  • scan qr
  • ανοίγουμε το mfa app της επιλογής μας στο κινητό π.χ. aegis google/microsoft authenticator
  • και σκαναρουμε το qr
  • relogin to test it

επαληθεύουμε τα link redirections

  • στο web interface ανοίγουμε ένα link από κάποια υπηρεσία μας π.χ. radicale στο παράδειγμα μας

  • κάνουμε logout log out από το portal

  • αν ανοίξουμε κατευθείαν την διεύθυνσή ανακατεύθυνσης radicale.ippocratis.duckdns.org στο παράδειγμα μας , θα πρέπει να μας εμφανίσει να εισάγουμε τα login στοιχεία του portal καθώς και 2fa επαλήθευση

portal UI

το user interface είναι λιτό
υποστηρίζει ομως theming με custom css custom js και static assets
δεν ασχολήθηκα καθόλου
για τους πιο τολμηρούς το documentation
εδω

Λίγα λόγια για το Caddyfile config

το plugin έχει 2 κύριες λειτουργίες
authentication με το οποίο επαληθεύει και δίνει δικαίωμα σε χρήστες να αποκτήσουν πρόσβασή στο portal
και authorisation με το οποίο επιτρέπει τους authorised users να ασφαλίσουν τις υπηρεσίες τους με τα policy που έχουν ορίσει

στο παράδειγμά μας έχουμε 2 υπηρεσίες
photoprism και radicale

ορίζουμε τα λινκ τους στο

 ui {
                links {
                    "radicale" https://radicale.ippocratis.duckdns.org icon "las la-cloud"
                    "photoprism" https://photoprism.ippocratis.duckdns.org icon "las la-photo-video"

τα λινκ μπουν να είναι οτιδήποτε Θέλουμε ως “subdomain” του μοναδικού domain που έχουμε στην κατοχή μας (ippocratis.duckdns.org)

εικονίδια επιλέγουμε από εδώ

τα ασφαλίζουμε με το policy που έχουμε ορίσει και τα κάνουμε reverse proxy στην localhost

radicale.ippocratis.duckdns.org {
    authorize with mypolicy
    reverse_proxy localhost:5232
}

messaging email provider
τα authenticate και authorize sub-systems απαιτουν messaging capabilities

*edit
Συμφωνα με αυτο το config στο παραδειγμα μας θελει λιγο rework μιας και πλεον χρεισημοποιειτε identitystore αντι local backend και identityprovider για το OAuth config το οποιο δεν χρεισημοποιω στο παραδειγμα αλλα πρεπει να αναφερω

Θα ξαναστησω τις επομενες μερες και θα κανω τις οποιες διορθωσεις

Έκανα τις αλλαγές

plugin documentation
εδώ

caddy documentation εδώ

3 «Μου αρέσει»