Building a Zero-Trust Homelab: My Journey to a More Secure Home Network
As someone who’s worked on designing Zero-Trust security architectures for banks and agencies, I thought it was time to bring that same level of security to my own homelab. In this post, I’ll share my journey to creating a more secure home network, using a combination of Cloudflare Access, Authentik, YubiKey, and Cloudflared.
Goals and Motivations
I wanted to achieve a few key goals with my homelab setup: first, I wanted to implement a zero-trust approach at the edge, where every public request must prove identity before it can touch an app. Second, I wanted to use hardware-backed authentication, such as WebAuthn with a YubiKey, to reduce the risk of phishing and credential theft. Finally, I wanted to keep my admin planes, such as my hypervisor and backup server, completely off the public internet.
Architecture Overview
To achieve these goals, I settled on an architecture that uses Cloudflare Access and Authentik as the identity provider, with YubiKey enforcement for hardware-backed authentication. I also use Cloudflared tunnels to keep my inbound ports closed, and Tailscale for admin-only access to my LAN. For internal TLS, I use step-ca as my private certificate authority, and Caddy as my reverse proxy.
Request Flows
So how does it all work? When a user requests access to a public app, such as Pi-hole, the request flows through Cloudflare’s edge, which evaluates the policy and challenges the user with an OIDC request. The user is then prompted for WebAuthn authentication with their YubiKey, and if successful, the token is returned to Cloudflare Access, which injects the session and forwards it to the Cloudflared tunnel. The tunnel then routes the request to the internal service, which responds back through the tunnel, and the browser never sees the LAN IP.
Admin Access and Tailscale
For admin access, I use Tailscale to connect to my LAN, which allows me to reach my admin planes, such as Proxmox VE and Proxmox Backup Server, without exposing them to the public internet. I’ve also configured Tailscale to use a separate subnet for my admin devices, which adds an extra layer of segmentation and security.
Internal TLS and Certificate Management
For internal TLS, I use step-ca as my private certificate authority, which issues certificates to my internal services. I’ve also configured Caddy to use ACME with step-ca, which automates the certificate renewal process. This ensures that my internal services always present valid, trusted certificates to my browser, which reduces the risk of self-signed certificate warnings.
Trade-Offs and Considerations
Of course, no security setup is perfect, and there are always trade-offs to consider. In my case, I’ve chosen to use Cloudflare Access and Authentik, which provides a robust identity and access management solution, but may introduce some additional complexity and cost. I’ve also chosen to use Tailscale for admin access, which provides a secure and convenient way to access my LAN, but may require some additional configuration and setup.
Conclusion
In conclusion, building a zero-trust homelab requires careful planning and consideration of various security trade-offs. By using a combination of Cloudflare Access, Authentik, YubiKey, and Cloudflared, I’ve been able to create a more secure home network that meets my needs for identity and access management, while also providing a robust and convenient way to access my internal services.
—
Budowanie zaufania zero-trust w laboratorium domowym: Moja podróż do bardziej bezpiecznej sieci domowej
Jako osoba, która pracowała nad projektowaniem architektur bezpieczeństwa zero-trust dla banków i agencji, uznałem, że czas przywieźć ten sam poziom bezpieczeństwa do mojego laboratorium domowego. W tym poście opowiem o swojej podróży do stworzenia bardziej bezpiecznej sieci domowej, korzystając z połączenia Cloudflare Access, Authentik, YubiKey i Cloudflared.
Cele i motywacje
Chciałem osiągnąć kilka kluczowych celów w swoim laboratorium domowym: po pierwsze, chciałem wdrożyć podejście zero-trust na krawędzi, gdzie każdy publiczny żądanie musi udowodnić tożsamość, zanim będzie mógł dotknąć aplikacji. Po drugie, chciałem używać uwierzytelniania opartego na sprzęcie, takiego jak WebAuthn z YubiKey, aby zmniejszyć ryzyko phishingu i kradzieży poświadczeń. Wreszcie, chciałem trzymać swoje płaszczyzny administracyjne, takie jak mój hypervisor i serwer kopii zapasowych, całkowicie poza publicznym internetem.
Przegląd architektury
Aby osiągnąć te cele, zdecydowałem się na architekturę, która wykorzystuje Cloudflare Access i Authentik jako dostawcę tożsamości, z wymuszeniem YubiKey do uwierzytelniania opartego na sprzęcie. Używam również tuneli Cloudflared, aby utrzymać moje porty wejściowe zamknięte, oraz Tailscale do dostępu administracyjnego do mojej sieci LAN. Do wewnętrznego TLS używam step-ca jako mojej prywatnej władzy certyfikacji, oraz Caddy jako mojego serwera proxy odwrotnego.
Przepływy żądań
Więc jak to wszystko działa? Gdy użytkownik wnosi o dostęp do publicznej aplikacji, takiej jak Pi-hole, żądanie przepływa przez krawędź Cloudflare, która ocenia politykę i wyzywa użytkownika do uwierzytelniania OIDC. Użytkownik jest następnie wyzwany do uwierzytelniania WebAuthn przy użyciu swojego YubiKey, a jeśli się powiedzie, token jest zwrócony do Cloudflare Access, który wstrzykuje sesję i przekazuje ją do tunelu Cloudflared. Tunel następnie kieruje żądanie do wewnętrznej usługi, która odpowiada z powrotem przez tunel, a przeglądarka nigdy nie widzi adresu IP sieci LAN.
Dostęp administracyjny i Tailscale
Dla dostępu administracyjnego używam Tailscale, aby połączyć się z moją siecią LAN, co pozwala mi dotrzeć do moich płaszczyzn administracyjnych, takich jak Proxmox VE i Proxmox Backup Server, bez narażania ich na publiczny internet. Ustawiam również Tailscale, aby używał oddzielnego podsieci dla moich urządzeń administracyjnych, co dodaje dodatkową warstwę segmentacji i bezpieczeństwa.
Wewnętrzne TLS i zarządzanie certyfikatami
Dla wewnętrznego TLS używam step-ca jako mojej prywatnej władzy certyfikacji, która wydaje certyfikaty moim wewnętrznym usługom. Ustawiam również Caddy, aby używał ACME z step-ca, co automatyzuje proces odnawiania certyfikatów. Zapewnia to, że moje wewnętrzne usługi zawsze prezentują ważne i zaufane certyfikaty mojej przeglądarce, co zmniejsza ryzyko ostrzeżeń o certyfikatach self-signed.
Kompromisy i rozważania
Oczywiście, żadne rozwiązanie bezpieczeństwa nie jest idealne, a zawsze istnieją kompromisy do rozważenia. W moim przypadku zdecydowałem się używać Cloudflare Access i Authentik, co zapewnia solidne rozwiązanie zarządzania tożsamości i dostępem, ale może wprowadzać pewną dodatkową złożoność i koszt. Zdecydowałem się również używać Tailscale do dostępu administracyjnego, co zapewnia bezpieczny i wygodny sposób dostępu do mojej sieci LAN, ale może wymagać pewnej dodatkowej konfiguracji i ustawień.
Wnioski
Podsumowując, budowanie zaufania zero-trust w laboratorium domowym wymaga starannego planowania i rozważenia różnych kompromisów bezpieczeństwa. Używając połączenia Cloudflare Access, Authentik, YubiKey i Cloudflared, udało mi się stworzyć bardziej bezpieczną sieć domową, która spełnia moje potrzeby w zakresie zarządzania tożsamości i dostępem, a jednocześnie zapewnia solidny i wygodny sposób dostępu do moich wewnętrznych usług.