Το παρόν ειναι αναδιατύπωση του ποστ μου εδώ
Τι θα επιτύχουμε
Ένα 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 εδώ