- यह एक सिंगल Linux VM पर Keycloak को rootless Docker में अलग-थलग चलाने और सिस्टम nginx को TLS termination तथा reverse proxy के लिए उपयोग करने वाली SSO deployment प्रक्रिया है
- पूर्वापेक्षाएँ हैं: SSH access, Keycloak के लिए domain या subdomain,
A record, बिना पासवर्ड वाला keycloak user, /srv/keycloak home directory, और Docker rootless installation
docker-compose.yml में postgres:16 और quay.io/keycloak/keycloak:25.0.1 का उपयोग होता है, और Keycloak को केवल 127.0.0.1:8080 पर bind किया जाता है, जबकि passwords और KC_HOSTNAME को .env में मैनेज किया जाता है
- nginx,
your.tld.com पर आने वाले HTTP requests को HTTPS पर redirect करता है और proxy_pass से आगे भेजता है; Certbot certificate जारी होने के बाद KC_PROXY_HEADERS: xforwarded सक्रिय किया जाता है
- अगर custom theme या
--optimized रन की ज़रूरत हो, तो multi-stage Dockerfile से अपनी image बनाई जा सकती है, और production में JGroups buffer size तथा Quarkus transaction recovery settings को अतिरिक्त रूप से ट्यून किया जा सकता है
डिप्लॉयमेंट संरचना और पूर्वापेक्षाएँ
- Keycloak एक open source IAM विकल्प है, जिसे तब उपयोग किया जा सकता है जब web application में user management और SSO को सीधे implement करना कठिन हो
- यह
OpenID Connect (OIDC), OAuth 2.0, SAML जैसे प्रमुख SSO protocols के साथ interoperable है
- यह कॉन्फ़िगरेशन Keycloak
23.0.6 के आधार पर लिखा गया था और 25.0.5 तक test किया गया है
- पूरी संरचना में nginx को केंद्रीय reverse proxy के रूप में रखा गया है, जो service-specific rootless Docker namespace में localhost ट्रैफ़िक forward करता है
- web traffic
0.0.0.0:80 और 0.0.0.0:443 पर आता है, और nginx उसे 127.0.0.1:8080 पर चल रहे Keycloak तक भेजता है
- लक्ष्य एक ऐसा किफायती सेटअप है जो single host resources साझा करते हुए भी service environments को अलग रखता है
तैयारी का काम
- बेस environment के रूप में Linux VM, SSH remote access, और Keycloak service के लिए domain या subdomain चाहिए
- domain में
A record होना चाहिए, और विकल्प के रूप में AAAA record जोड़ा जा सकता है
- Docker rootless की बेस setup एक अलग Mastodon पोस्ट की प्रक्रिया का पालन करती है
- बिना पासवर्ड वाला नया non-root user
keycloak बनाना
- home directory को
/srv/keycloak पर सेट करना
/etc/subuid और /etc/subgid में keycloak user range जोड़ना
dockerd-rootless-setuptool.sh से Docker rootless install करना
keycloak user के लिए automatic service startup सेट करना
Docker Compose से Keycloak चलाना
- नए बनाए गए
keycloak user में जाने के लिए machinectl shell keycloak@ का उपयोग किया जाता है
sudo -u keycloak -H bash तरीका इसलिए नहीं अपनाया जाता क्योंकि उसमें XDG_RUNTIME_DIR environment variable तैयार नहीं होता
- पहले persistent data और Docker files के लिए directories बनाई जाती हैं
- PostgreSQL data path:
/srv/keycloak/data/postgres16
- Docker files:
~/docker
docker-compose.yml आधिकारिक Keycloak image और PostgreSQL का सीधे उपयोग करता है
- PostgreSQL image:
postgres:16
- Keycloak image:
quay.io/keycloak/keycloak:25.0.1
- production environment में
:latest की जगह specific image tag उपयोग करने की सिफारिश है
- Keycloak container की मुख्य settings इस प्रकार हैं
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://postgres_db/keycloak
KC_HOSTNAME: ${KC_HOSTNAME:-your.tld.com}
KC_HTTP_ENABLED: true
HTTP_ADDRESS_FORWARDING: true
KEYCLOAK_ADMIN: admin
- port को
'127.0.0.1:8080:8080' के रूप में bind किया जाता है ताकि यह केवल localhost पर उपलब्ध रहे
.env में sensitive या environment-specific values रखी जाती हैं
POSTGRES_PASSWORD
KEYCLOAK_ADMIN_PASSWORD
KC_HOSTNAME
${KC_HOSTNAME:-your.tld.com} syntax का मतलब है कि अगर .env में KC_HOSTNAME मौजूद है तो वही value उपयोग होगी, नहीं तो default के रूप में your.tld.com लिया जाएगा
/srv/keycloak/data/postgres16 में PostgreSQL का persistent data रहता है, इसलिए इसे नियमित backup में शामिल करना चाहिए
- पूरी तरह reset करना हो तो संबंधित PostgreSQL folder को delete करके फिर से बनाया जा सकता है; अगली start पर यह फिर बन जाएगा
- अगर
~/docker को Git repository के रूप में manage किया जाता है, तो .env को .gitignore में जोड़कर सिर्फ docker-compose.yml commit किया जा सकता है
लोकल टेस्ट
- Docker Compose stack को start करें और logs देखें
docker compose up -d && docker compose logs --follow
- VM के Keycloak local port तक पहुँचने के लिए reverse SSH tunnel बनाएं
ssh you@111.11.11.11 -L :8080:127.0.0.1:8080 -p 22 -N -v
- browser में
127.0.0.1:8080 खोलकर Keycloak welcome screen की पुष्टि करें
nginx reverse proxy और TLS
keycloak user से logout करने के बाद system nginx configuration करें
your.tld.com को अपने वास्तविक domain से बदलें, और domain registrar में A record जोड़ें ताकि DNS queries VM IP तक जाएँ
- nginx site configuration file बनाकर उसे activate करें
nano /etc/nginx/sites-available/your.tld.com.conf
ln -s /etc/nginx/sites-available/your.tld.com.conf /etc/nginx/sites-enabled/
- nginx configuration HTTP requests को HTTPS पर redirect करती है, और HTTPS server block में Keycloak तक proxy करती है
proxy_set_header Host $host
proxy_set_header X-Real-IP $remote_addr
proxy_set_header X-Forwarded-For $remote_addr
proxy_set_header X-Forwarded-Proto $scheme
proxy_pass http://127.0.0.1:8080
- SSL settings के लिए Mozilla SSL configurator for nginx का उपयोग करके nginx version के अनुसार defaults generate करने की सिफारिश है
- configuration test करने के बाद nginx को reload करें
nginx -t
systemctl reload nginx
- Certbot से certificate जारी करने पर
your.tld.com.conf की ज़रूरी lines अपने-आप अपडेट हो जाती हैं
certbot --nginx -d your.tld.com
- इसके बाद
ssl_trusted_certificate /etc/letsencrypt/live/your.tld.com/chain.pem; को सक्रिय करें और nginx को फिर reload करें
- nginx के पीछे काम करने के लिए
docker-compose.yml में KC_PROXY_HEADERS: xforwarded सक्रिय करें, फिर Docker stack को restart करें
docker compose down && docker compose up -d && docker compose logs --follow
डिबगिंग पथ
- सेटअप के बाद
your.tld.com पर जाकर .env वाले password से admin user login की पुष्टि करें
- सबसे पहले Docker Compose logs देखें
docker compose logs --follow
- nginx access log और error log को इन files के जरिए follow करें
tail -f /var/log/nginx/your.tld.com-access.log
tail -f /var/log/nginx/your.tld.com-error.log
- अगर Keycloak database को सीधे देखना हो, तो
keycloak user में जाएँ और PostgreSQL container के अंदर psql चलाएँ
machinectl shell keycloak@
cd ~/docker
docker compose exec postgres_db /bin/bash
psql -h localhost -p 5432 -U keycloak keycloak
custom image और optimized रन
- बेस configuration
quay.io की prebuilt image का उपयोग करती है
- theme customization या
--optimized mode में run करने के लिए अपनी image build करें
- Dockerfile आधिकारिक Keycloak image पर आधारित multi-stage build का उपयोग करता है
- builder stage में
ENV KC_DB=postgres सेट करना
/opt/keycloak/bin/kc.sh build चलाना
- final image में
/opt/keycloak/ कॉपी करना
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] सेट करना
docker-compose.yml में इसे इस तरह बदलें
image: line हटाएँ या comment करें
build: . सक्रिय करें
command: start --optimized जोड़ें
- इसके बाद Docker stack को बंद करें, चाहें तो explicit build चलाएँ, फिर दोबारा start करें
docker compose down
docker compose build
docker compose up -d && docker compose logs --follow
production environment में अतिरिक्त tuning
- JGroups से जुड़ी
MulticastSocket receive buffer warning को host के /etc/sysctl.conf में buffer values जोड़कर हल किया गया
net.core.rmem_max = 26214400
net.core.wmem_max = 1048576
- setting लागू करने के लिए
sysctl -p चलाएँ
- Quarkus XA transaction recovery warning को Keycloak service में volume mount और environment variable जोड़कर ठीक किया गया
- volume:
/srv/keycloak/data/keycloak/ObjectStore/:/ObjectStore/
- environment variable:
QUARKUS_TRANSACTION_MANAGER_ENABLE_RECOVERY: true
- start से पहले host पर ObjectStore directory बनाएँ, और container के अंदर
/ObjectStore के owner को user ID 1000 में बदलें
कॉन्फ़िगरेशन के बाद के चरण
- अंतिम स्थिति यह है कि rootless Docker के अंदर चल रही Keycloak service, system nginx reverse proxy के पीछे चलती है, और nginx SSL termination संभालता है
- automatic container updates के लिए एक अलग Mastodon पोस्ट में दिए गए auto-update steps देखें
- अगला configuration step है Keycloak admin console में email जोड़ना
- इसके बाद realm जोड़ना और theme सेट करना किया जा सकता है
- themes के लिए keycloakify और keycloakify-starter का उपयोग किया जा सकता है
- Dockerfile में keycloakify theme JAR को
/opt/keycloak/providers/ में copy करने वाली एक commented line शामिल है
1 टिप्पणियां
Hacker News की राय
हाल ही में होमलैब में authentication जोड़ते समय Authelia चुना
Keycloak भी काम करता है, लेकिन बहुत भारी है, और traefik forward auth के साथ इस्तेमाल करने के लिए एक अतिरिक्त service और चाहिए
Authelia में user editing UI नहीं है और backend LDAP server के साथ two-way sync भी नहीं है, लेकिन इसे सिर्फ static files और environment variables से configure किया जा सकता है, इसलिए कई मामलों में यह अच्छे से फिट बैठता है
अगर कुछ services में authentication जोड़ना है और जहां संभव हो वहां SSO लगाना है, तो Authelia से शुरुआत करना अच्छा विकल्प हो सकता है
अगर SSO, आसान setup और admin UI चाहिए, तो FusionAuth भी देखने लायक है। UI/UX 2000 के दशक के मध्य जैसा महसूस होता है, लेकिन इसे सीधे download करके चला सकते हैं[0], यह Docker-friendly है[1], और OIDC या अन्य settings को Terraform[3] से manage करने जैसे कई configuration तरीके[2] देता है
इसे free में इस्तेमाल किया जा सकता है, लेकिन यह open source नहीं है[4]
0: https://fusionauth.io/download
1: https://fusionauth.io/docs/get-started/download-and-install/...
2: https://fusionauth.io/docs/operate/deploy/configuration-mana...
3: https://fusionauth.io/docs/operate/deploy/terraform
4: https://fusionauth.io/license-faq#28
Caddy को reverse proxy के रूप में इस्तेमाल करके Authelia के साथ integrate[1] किया है और यह अच्छे से काम करता है
सभी services में मजबूत two-factor authentication लगाया है, और self-hosted apps को VPN के बिना access करने पर भी काफी सुरक्षित महसूस होता है
हालांकि Authelia का 1 साल से ज्यादा समय से नया release नहीं आया है, इसलिए security को लेकर चिंता है
[0] https://github.com/lldap/lldap
[1] https://www.authelia.com/integration/proxies/caddy/
[1] https://github.com/greenpau/caddy-security
homelab environment के लिए यह बहुत अच्छा use case है, खासकर अगर बड़े solutions की features की जरूरत नहीं है या वे नहीं चाहिए
खोजने पर भी simple schema, JSON, HTTP जैसी कोई चीज नहीं मिली, और यह यकीन करना मुश्किल है कि लगभग हर चीज को नए सिरे से बनाने वाले लोगों ने LDAP को फिर से नहीं बनाया
मेरी जानकारी में, व्यावहारिक रूप से दूसरा standard सिर्फ Active Directory है
यह भी जानना चाहता/चाहती हूं कि access control को बाहर सौंपने के लिए कोई standard या protocol है या नहीं
Authelia URL patterns से access control कर सकता है, लेकिन उदाहरण के लिए file server के मामले में, authenticated user ID और database की key के आधार पर LDAP server से permissions check करने जैसा तरीका अपेक्षित लगता है
यह उस OAuth2 की उल्टी दिशा जैसा दिखता है जिसमें server किसी third-party service का access right हासिल करता है
हाल ही में homelab में अपेक्षाकृत सरल SSO सेटअप करने के लिए देखा, और मुख्य लक्ष्य Google या GitHub authentication से आसानी से login करना था
पिछली नौकरी में JetBrains Hub[1] और Keycloak दोनों इस्तेमाल किए थे, लेकिन दोनों की configuration काफी झंझटभरी थी
JetBrains Hub सच में बहुत आसानी से शुरू हो जाता था और मेरा पिछला अनुभव भी ऐसा ही था, लेकिन Docker registry में latest tag न होना असुविधाजनक था
मुझे पता है version pinning अच्छा होता है, लेकिन personal use में आम तौर पर सभी Docker containers को एक साथ update करना चाहता हूं
दूसरी ओर Keycloak शुरू करना बहुत झंझट वाला था; development mode में आसान था, लेकिन production configuration पर अटक गया
याद है कि यह wildcard Let's Encrypt certificate से जुड़ा था, और कुछ घंटों बाद हार मान ली
आखिरकार Dex[2] चुना। Documentation कम होने की वजह से इसे टाल रहा था, लेकिन असल setup बहुत आसान था; basic YAML, SQLite database और एक subdomain काफी था
Dex को शानदार OAuth2 Proxy[3] और custom Nginx Proxy Manager template के साथ मिलाकर हर internal service के लिए दो-line SSO configuration बना ली, और unRAID के लिए Dex Docker template[4] भी बनाया
इसके ऊपर घर के बाहर से access के लिए Cloudflare Access और WAF जोड़कर security मजबूत की, और थोड़ी ज्यादा insight पाने के लिए बस CrowdSec जोड़ना चाहता हूं
निजी तौर पर मुझे यही सबसे सरल विकल्प लगता है
https://github.com/lastlogin-io/obligator
मैंने self-host किए जा सकने वाले कई OpenID Connect servers की एक अधूरी comparison table बनाई है[0]
चौंकाने वाली बातों में से एक यह थी कि Keycloak codebase सच में बहुत विशाल है
[0]: https://github.com/lastlogin-io/obligator?tab=readme-ov-file...
यह सोचना मजाकिया है कि Keycloak security problems हल कर देता है
CVE list देखेंगे तो समझ जाएंगे मेरा मतलब क्या है
जिन closed, non-transparent solutions में कोई reported CVE नहीं है, उन्हें भी “secure” कहना हास्यास्पद होगा
और latest release 22.0.2 में सिर्फ 3 known vulnerabilities हैं
https://www.cvedetails.com/vulnerability-list/vendor_id-25/p...
कम से कम उस article में https://www.keycloakify.dev/ का जिक्र बहुत उपयोगी है
यह standard theme approach का शानदार alternative लगता है
2 साल से इस्तेमाल कर रहा हूं और इसके बारे में सिर्फ अच्छी बातें ही कह सकता हूं
maintainer बहुत तेजी से respond करता है, और हाल में Keycloak और keycloakify दोनों में theme approach की future compatibility बढ़ाने वाले changes भी आए हैं
फिलहाल officially सिर्फ create-react-app से बनी apps support होती हैं, लेकिन vite branch development में है और निजी तौर पर मैं इसे काफी समय से vite के साथ इस्तेमाल कर रहा हूं
authentik[1] और authelia[2] पर करीब से नज़र रख रहा हूँ
Authelia बहुत अच्छी लगती है, लेकिन Keycloak में Angular के लिए connector है, जबकि Authelia में, उदाहरण के लिए, OIDC Angular plugin को खुद configure करना पड़ता है, इसलिए थोड़ा सतर्क था
फिर भी अगर Keycloak के लिए setup मौजूद हो, तो शुरुआत आसान हो जाएगी
[1] https://goauthentik.io/
[2] https://www.authelia.com/
मैं Docker और Kubernetes में हमेशा 10 से ज़्यादा services को protect कर रहा हूँ, और अगर आपको हर service के लिए protection settings अलग-अलग करना पसंद नहीं है, तो authentik में आपको परेशानी होगी
authentik में एक गंभीर bug[0] है: कई subdomains (app1.example.com, app2.example.com आदि) को एक ही configuration से protect करते समय, session expire होने के बाद re-authentication करने पर user randomly किसी दूसरी service पर redirect हो जाता है
[0]: https://github.com/goauthentik/authentik/issues/6886
compatibility तोड़े बिना इसे ठीक नहीं किया जा सकता, और यह cc grant इस्तेमाल करने वाले कई tools के साथ काम नहीं करता
यह देखने के बाद मैंने इसे candidates से पूरी तरह हटा दिया
https://github.com/goauthentik/authentik/issues/6139
अगर Angular setup में किसी तरह मदद कर सकता हूँ, तो GitHub Discussions के जरिए खुशी से मदद करूँगा
Authentik बेहतर लग रहा था, लेकिन दूसरे replies में बताया गया bug काफी खराब लगता है
Keycloak की समस्या यह है कि यह पुराना project है, इसलिए इसमें बहुत ज्यादा बदलाव हुए हैं
यह JBOSS project के रूप में शुरू हुआ था, और IdP के तौर पर इसकी उपयोगिता on-premises cluster authentication में चमकती है, लेकिन मेरे हिसाब से बस वहीं तक
Fortune 500 की एक division में AWS ECS पर Keycloak को बड़े scale पर implement किया था, और इसे ठीक से cluster कराने की प्रक्रिया 1000 साल के युद्ध जैसी थी
DNS discovery ठीक से काम नहीं कर रही थी, और cluster discovery UDP-based थी, इसलिए cloud environment में नहीं चली
एक server पर stateful login दूसरे server पर मौजूद नहीं था, इसलिए simple load balancing असंभव थी, और sticky sessions ही एकमात्र विकल्प था
Keycloak को
docker runसे चलाकर Auth0 की तरह plug-and-play करना आसान है, लेकिन यह 2,50,000 मील चली 1996 Ford F-150 खरीदने जैसा लगता हैचलती है और काम करती है, लेकिन maintenance सचमुच भयानक है
जहाँ तक याद है, default discovery method multicast इस्तेमाल करता है, जो आम cloud networks या Swarm/Kubernetes overlay networks में enabled नहीं होता
RDBMS को एक तरह के quorum mechanism की तरह इस्तेमाल करने वाला database ping भी देखा, लेकिन वह बहुत fragile लगा और last resort जैसा महसूस हुआ
आखिरकार Swarm cluster के DNS से nodes discover करने वाला Kubernetes cluster driver इस्तेमाल कर पाया
इसे चलाने लायक बनाना काफी मुश्किल था, लेकिन उसके बाद से जहाँ तक मुझे पता है, stable है
आजकल शायद native EC2 networking driver भी है, लेकिन मैंने खुद explore नहीं किया
ECS deployment आपने कब किया था, यह जानने की उत्सुकता है
हमारे यहाँ UDP सिर्फ DNS के लिए allowed है
Keycloak शानदार है, लेकिन beginners के लिए काफी confusing हो सकता है
इसमें features बहुत हैं और documentation सबसे अच्छी नहीं है
हाल में Zitadel इस्तेमाल किया, और वह कहीं ज्यादा easy to use लगा
हालांकि built-in database के साथ run नहीं कर सकते, इसलिए self-hosting थोड़ी ज्यादा मुश्किल है
आगे चलकर Postgres को database के तौर पर इस्तेमाल करने की दिशा है, इसलिए उम्मीद है कि दूसरे tools के साथ deploy करना आसान होगा
मेरे boss ने हाल ही में Keycloak को “ऐसी चीज़ जो लगातार gift देती रहती है” कहा, लेकिन असल में मतलब यह था कि कुछ कैसे करना है, यह पता लगाने के लिए नए Jira tickets लगातार बनते रहते हैं
फिर भी हमारे पास Terraform है जो EKS cluster बनाता है, Keycloak deploy करता है, SAML/OIDC clients बनाता है, external ID providers जोड़ता है, और AWS IAM Identity Provider तक configure करता है
जब आप यह पता लगा लें कि क्या किया जा सकता है, UI में कैसे किया जाता है, और mrparkers Terraform provider से उसे कैसे automate करना है, तो इसे इस्तेमाल करना खुद में बहुत आसान हो जाता है
एक दोस्त को इसकी ज़रूरत है :)
कई साल Keycloak इस्तेमाल करने के बाद सच कहूँ तो उसकी हर तरह की अजीब behaviours से तंग आकर alternatives ढूँढने शुरू किए
Authentik आदि कई candidates ठीक लग रहे थे, लेकिन Zitadel[1] ने ध्यान खींचा, और उसके बाद पीछे मुड़कर नहीं देखा
[1] https://zitadel.com/blog/zitadel-vs-keycloak
जानना चाहूँगा कि निर्णायक रूप से किस चीज़ ने आपको attract किया