What’s everyones recommendations for a self-hosted authentication system?
My requirements are basically something lightweight that can handle logins for both regular users and google. I only have 4-5 total users.
So far, I’ve looked at and tested:
- Authentik - Seems okay, but also really slow for some reason. I’m also not a fan of the username on one page, password on the next screen flow
- Keycloak - Looks like it might be lighter in resources these days, but definitely complicated to use
- LLDAP - I’d be happy to use it for the ldap backend, but it doesn’t solve the whole problem
- Authelia - No web ui, which is fine, but also doesn’t support social logins as far as I can tell. I think it would be my choice if it did support oidc
- Zitadel - Sounds promising, but I spent a couple hours troubleshooting it just to get it working. I might go back to it, but I’ve had the most trouble with it so far and can’t even compare the actual config yet
Keycloak seems complicated, but it’s actually not that complicated if you use it for simple OIDC provider.
Just create a new realm, then go to client -> create. Enter your client-id, with openid-connect as protocol. Then, set access type to “confidential”, set valid redirect uri to “https://<your app>” (or even “https://*” if you’re lazy and want to use it on multiple apps). Then hit save and go to the credential tab to copy your client secret. Then head to “users” menu to start adding users to your realm.
That’s the basic setup which should be good for home use. The good thing about keycloak is, as you grow your homelab, whatever stuff you may need later can be provided by keycloak. Want some users to have access to app A, but not app B? 2 factor auth? Allow users to login with google account? Heck, allow users to login with another sso provider (chaining)? You can do pretty much anything.
That doesn’t sound too bad, thanks for the instructions. I’ll probably give keycloak another try too.
Do you know what kind of cpu memory usage it has? I saw the newer versions are supposed to be lighter, but haven’t tested it yet.
Currently it’s using ~511MB of memory, which is comparable to typical web apps. CPU usage is almost zero because it’s idle most of the time (you’re practically only using it on login only).
I’m still on keycloak v19 and haven’t had a change to upgrade to the latest version yet and have no idea how much memory the latest version will use, but I remember testing keycloak before they migrated to quarkus and it was sitting at ~2GB memory and was immediately turned off by it. I gave it a try again after I heard the memory usage got better and stick around since then.
I’ve had one realm with 5 clients and nothing crazy setup running for about 3 years across 3 major versions and haven’t had many problems
I use kanidm with oauth2-proxy. No issues so far, it was pretty easy to set up.
Note that the connection to kanidm needs to be TLS even if you have a reverse proxy!
EDIT: currently using 80MB RAM for two users and three Service Providers.
Thanks (grazie?)! I was looking for something similar and kanidm looks great feature wise and simple to deploy!
Thanks, kanidm looks promising. I’ll try it out this weekend
Does this do it all? It seems that it holds all your users like LDAP and can auth that way too. But it can also do simple oidc integrations too? Basically just want to see if it is the all in one. Looks like it does which is why i wonder why you use oauth2-proxy in addition.
I’ve otherwise been trailing keycloak/authelia as the oidc portion and lldap/freeipa as the ldap Backend that actually holds the users. Would love to simplify if possible.
Yes, it should cover all the use cases you mention!
I use oauth2-proxy as ForwardAuth on Traefik so I can protect apps that do not support OAuth/OIDC login/
Awesome. Thank you.
Now to see how i make this work in k8s since they evidently mandate the cert inside instead of just allowing the ingress to have it.
Yeah, sounds like a security feature… I was able to configure Traefik to connect with TLS, verifying the peer certificate.
I could do this but sadly even just the trial did not work. I’m using podman but it gives me “invalid state” just trying to login with a user per the quickstart, etc. Can’t reset the password cleanly, can’t add a passkey via bitwarden, etc.
Unsure if I’m doing something wrong or if it’s very alpha/beta.
I didn’t have any issues, do you see anything in the logs?
0e2475ba-882a-4f61-8938-2642ca80193b WARN │ ┝━ 🚧 [warn]: WARNING: index "displayname" Equality was not found. YOU MUST REINDEX YOUR DATABASE 0e2475ba-882a-4f61-8938-2642ca80193b WARN │ ┝━ 🚧 [warn]: WARNING: index "name_history" Equality was not found. YOU MUST REINDEX YOUR DATABASE 0e2475ba-882a-4f61-8938-2642ca80193b WARN │ ┝━ 🚧 [warn]: WARNING: index "jws_es256_private_key" Equality was not found. YOU MUST REINDEX YOUR DATABASE
I had to drop it for a few days. I got that at some point though. It’s all brand new so I wouldn’t know why. Seems a bit rough around the edges so far. I’ll try to reindex and attempt again. I really want this to be the product I use since it’s a nice AIO solution but we’ll see.
Edit:
[~]$ podman run --rm -i -t -v kanidm:/data \ kanidm/server:latest /sbin/kanidmd reindex -c /data/server.toml error: unrecognized subcommand 'reindex'
Phew boy. Straight from the docs. Same with the vacuum command.
Looks like the docs need updated to specify the command is
kanidm database reindex -c /data/server.toml
And further upon trying to login…
300e55b7-e30a-42a5-ac3e-ec0e69285605 INFO handle_request [ 188µs | 0.00% / 100.00% ] 300e55b7-e30a-42a5-ac3e-ec0e69285605 INFO ┕━ request [ 188µs | 72.94% / 100.00% ] method: GET | uri: /v1/auth/valid | version: HTTP/1.1 300e55b7-e30a-42a5-ac3e-ec0e69285605 INFO ┝━ handle_auth_valid [ 50.8µs | 25.54% / 27.06% ] 300e55b7-e30a-42a5-ac3e-ec0e69285605 INFO │ ┝━ validate_client_auth_info_to_ident [ 2.85µs | 1.51% ] 300e55b7-e30a-42a5-ac3e-ec0e69285605 WARN │ │ ┕━ 🚧 [warn]: No client certificate or bearer tokens were supplied 300e55b7-e30a-42a5-ac3e-ec0e69285605 ERROR │ ┕━ 🚨 [error]: Invalid identity: NotAuthenticated | event_tag_id: 1 300e55b7-e30a-42a5-ac3e-ec0e69285605 WARN ┕━ 🚧 [warn]: | latency: 204.504µs | status_code: 401 | kopid: "300e55b7-e30a-42a5-ac3e-ec0e69285605" | msg: "client error"
I think I’m gonna have to just nuke it and start fresh but yeah, this is not a great first impression at all.
I use authentik. The login flow is a little weird I agree, my password manager doesn’t like it too. Besides that, from the ones I used it’s definitely the most stable and developed (I was using authelia before).
I can’t quite figure out how to use it with proxy auth.
Depending on what you are trying to do, Authelia does have OIDC in beta https://www.authelia.com/roadmap/active/openid-connect/
I use Authelia again since in beta it now supports multiple Pass/FIDO keys via the web interface, and it does work reasonably well.
OIDC does indeed work fine too.
I use it on nextcloud and immich and a few others.
You will be much more hard pressed to find apps that support SSO and oidc than oidc that authelia is broken on.
Hmm I thought authelia could only act as an oidc provider, I didn’t think it could allow logging in through a Google account for example?
I’ll take a look at the docs again, thanks!
After looking deeper into the docs they do not support and do not plan to support the Relying Party role. So it probably won’t fit for this use case.
Thanks for confirming, I just saw that as well.
I’m going to try some of the other solutions in this thread, but I might still come back to authelia and just ignore my requirement for having social login. I like the idea of sending someone a link and saying “Hey just log in with your google account” instead of having to create an actual user for them, but maybe I can use something else specifically for those cases.
Authentik works very well and has the most flexibility if you have the resources to run it (not an rpi)
You can change the logon flow to make the username and password on the same page
Another user mention issues with password managers auto filling. There is a comparability button as well on the login flow that allows bitwarden and other to auto fill correctly.
Authentik has LDAP built in along with every SSO method that exists. Makes it super nice to integrate into as many services as possible.
I use it with oAuth, LDAP and reverse proxy authentication.
This. 100%
You can change the logon flow to make the username and password on the same page There is a comparability button as well on the login flow that allows bitwarden and other to auto fill correctly.
Thanks for the tips, I found the compatibility button and will try it out. I’m not sure I see how to change the username/password to be on the same page though. Do you have to create a whole new login flow?
https://www.youtube.com/@cooptonian His Authentik videos are top notch and they (Authentik) have also had him make some for them. One of those videos, I can’t recall shows you how to do this, I think it may be the 2FA/MFA one. I use Authentik and can login with fingerprint login without using my UN/PW first. It’s pretty slick.
Here is an alternative Piped link(s):
https://www.piped.video/@cooptonian
Piped is a privacy-respecting open-source alternative frontend to YouTube.
I’m open-source; check me out at GitHub.
Thanks for the recommendation, I’ll take a look at some of his videos. I managed to get the un/pw on one page, but haven’t done much with webauthn/passwordless stuff yet so that might be useful too.
I think I saw a tutorial on YouTube for how to do it but this page describes it as well. I edited the default login flow to include the password box
https://docs.goauthentik.io/docs/flow/stages/identification/
Thanks! I managed to get user/pass on the same page and it works great with the compatibility mode
I’m pretty happy with Authentik. Bitwarden at least has no issues with auto-filling the username and password fields when I want to log in.
It is also a very complete solution offering basically any current authentication protocol and integration with other providers.
I’ve been using Authelia for almost 2 years and I really like it. Never had any issues.
The latest update to authelia 4.38 was a little bit cumbersome, because you hat to manually adjust the configuration. But all in all I like authelia, too.
Why not keep everything in your LAN and setup a wire guard bastion ?
That’s essentially what I am doing. Everything is on the LAN by default. I have two instances of Traefik. One that runs only on internal VPN ips, and another on remote servers using public ips. So I can choose which services are accessible over lan/vpn or public (routed through a vpn to lan).
That doesn’t solve the authentication problem if I want to expose something to the internet though, or even sso inside the lan.
check out vouch proxy.
I was going to suggest Nginx with phpAuthRequest but your solution seems more inline with what the OP is asking for.
* just love the random downvote ahaha
Thanks, I’ll take a look! It might be helpful even if I use a different idp
I have been looking into this: https://gitlab.com/yaal/canaille to extend my LLDAP, but it can also work without an LDAP backend if you only need OIDC.
Canaille looks pretty interesting and simple too, thanks for the link!
I’ve been using Authelia with several OIDC integrations for a while now. Works great. They’ve released a huge update like a day ago too. Out of the ones you listed, it’s very lightweight too. The docs are a bit all over the place but it is quite comprehensive.
I did look at Zitadel and tried setting it up myself but I just couldn’t get it to work. The docs are a bit vague.
Authelia does support oidc and its amazing.
Authelia is a oidc provider, but does not support oidc as a provider, only local file and ldap. So it really depends on your use case
OIDC was a huge thing for me, I used FusionAuth for a bit and it worked great. Then I learned I could deploy my own WebAuthn / passkey password-less authentication, moved over to Authentik, and never looked back.
Do you have any issues with Authentik being slow? It might be my environment since I haven’t done much troubleshooting yet.
Do you mind elaborating a little on in what sense it is slow for you? It doesn’t “feel” slow for me, but as you’ve identified, it’s a multipage login process with some JavaScript driven content, so it’s not exactly the fastest compared to something more static. The pages generally loads in around/under 1 second for me; and once authenticated, the flow happens fairly quickly and infrequently that I don’t really notice or care for it.
Once I’m authenticated, it’s actually pretty okay. It goes through the redirections fast enough that I wouldn’t notice usually. But the login pages would take several seconds to load for me, and navigating around the admin ui also seemed to take several seconds for each page change. So not extremely slow, but slow enough to notice and get annoyed by it. Admittedly I probably could increase the session duration or something to help with that too.
Admin UI feels okay to me, at most 1/2 a second between page loads/repaints, definitely not several seconds kind of slow. I am running it on my oracle free tier VM and I’ve got only 3 users, so maybe I’m way over provisioned? Have you tried to measure where the latency is coming from? As in, it is the raw page load that’s slow, or if it is subsequent JavaScript triggered requests bottlenecking the performance?
Acronyms, initialisms, abbreviations, contractions, and other phrases which expand to something larger, that I’ve seen in this thread:
Fewer Letters More Letters HTTP Hypertext Transfer Protocol, the Web SSL Secure Sockets Layer, for transparent encryption SSO Single Sign-On TLS Transport Layer Security, supersedes SSL VPN Virtual Private Network k8s Kubernetes container management package nginx Popular HTTP server
6 acronyms in this thread; the most compressed thread commented on today has 18 acronyms.
[Thread #606 for this sub, first seen 16th Mar 2024, 12:15] [FAQ] [Full list] [Contact] [Source code]
I use nforwardauth . It is simple, but only supports username/password