fix: KC_HOSTNAME_STRICT=false for NodePort access #176

Merged
claude merged 1 commits from fix/keycloak-hostname-strict into main 2026-02-19 17:03:43 +01:00
Owner

Keycloak forces redirects to public hostname when accessed via NodePort, breaking OAuth flow from localhost browser.

Keycloak forces redirects to public hostname when accessed via NodePort, breaking OAuth flow from localhost browser.
claude added 1 commit 2026-02-19 17:01:18 +01:00
fix: set KC_HOSTNAME_STRICT=false for NodePort access
All checks were successful
AI Review / AI Code Review (pull_request) Successful in 1s
PR Checks / Validate & Security Scan (pull_request) Successful in 8s
0eeae350cf
When accessing Keycloak via NodePort (127.0.0.1:30880), strict hostname
forces redirects to keycloak.georgepet.duckdns.org which is unreachable
from local browser. With strict=false, Keycloak uses the request's host
header for redirects when accessed via NodePort, while still using the
configured hostname for ingress access.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author
Owner

AI Code Review

K8s Manifest Review: Keycloak KC_HOSTNAME_STRICT fix

Анализ изменения

Суть: KC_HOSTNAME_STRICT=false — отключение строгой проверки хоста при доступе через NodePort.


⚠️ Проблемы безопасности

  1. КРИТИЧНО: Уязвимость для атак Host Header Injection

    • KC_HOSTNAME_STRICT=false позволяет Keycloak принимать любой Host header
    • Attacker может отправить Host: attacker.com, и Keycloak вернёт redirect на https://attacker.com/auth
    • Угроза: OAuth phishing, credential theft, session fixation
    • Рекомендация: Вместо полного отключения, использовать KC_HOSTNAME_STRICT_HTTPS=false (отключить только проверку протокола, оставить проверку хоста)
  2. KC_PROXY_HEADERS=xforwarded

    • С отключённой strict проверкой это усиливает риск — Keycloak доверяет X-Forwarded-Host из любого источника
    • Убедиться, что ingress-nginx очищает user-supplied X-Forwarded-* headers перед Keycloak

📋 Другие замечания

  1. Недостаёт environment переменные для NodePort сценария

    • Нужно добавить:
      - name: KC_HOSTNAME_STRICT_HTTPS
        value: "false"  # (вместо STRICT=false)
      - name: KC_PROXY
        value: "edge"    # для X-Forwarded-Proto обработки
      
  2. Архитектурная проблема — NodePort доступ от localhost browser:

    • Это anti-pattern для production OAuth
    • Нормальный flow: browser → ingress (HTTPS public) → Keycloak
    • NodePort 32432 — это для admin/automated access, не для browser OAuth

Что хорошо

  • Остальные параметры (KC_HOSTNAME, KC_PROXY_HEADERS) уместны
  • Resources/labels/PSS в порядке (не видны в diff, предполагаю уже были)

🔧 Рекомендация

Отменить этот PR и сделать правильно:

- name: KC_HOSTNAME_STRICT_HTTPS
  value: "false"
- name: KC_HOSTNAME
  value: "keycloak.georgepet.duckdns.org"
- name: KC_PROXY
  value: "edge"
- name: KC_PROXY_HEADERS
  value: "xforwarded"

Если NodePort — это именно для локального browser access: использовать separate ingress/DNS на localhost вместо стандартного host.

Status: BLOCK — опасно для production. Переделать.


Automated review by Claude Haiku | advisory, does not block merge

## AI Code Review ## K8s Manifest Review: Keycloak KC_HOSTNAME_STRICT fix ### ✅ Анализ изменения **Суть:** `KC_HOSTNAME_STRICT=false` — отключение строгой проверки хоста при доступе через NodePort. --- ### ⚠️ Проблемы безопасности 1. **КРИТИЧНО: Уязвимость для атак Host Header Injection** - `KC_HOSTNAME_STRICT=false` позволяет Keycloak принимать любой Host header - Attacker может отправить `Host: attacker.com`, и Keycloak вернёт redirect на `https://attacker.com/auth` - **Угроза:** OAuth phishing, credential theft, session fixation - **Рекомендация:** Вместо полного отключения, использовать `KC_HOSTNAME_STRICT_HTTPS=false` (отключить только проверку протокола, оставить проверку хоста) 2. **KC_PROXY_HEADERS=xforwarded** - С отключённой strict проверкой это усиливает риск — Keycloak доверяет X-Forwarded-Host из любого источника - Убедиться, что ingress-nginx **очищает** user-supplied X-Forwarded-* headers перед Keycloak --- ### 📋 Другие замечания 3. **Недостаёт environment переменные для NodePort сценария** - Нужно добавить: ```yaml - name: KC_HOSTNAME_STRICT_HTTPS value: "false" # (вместо STRICT=false) - name: KC_PROXY value: "edge" # для X-Forwarded-Proto обработки ``` 4. **Архитектурная проблема** — NodePort доступ от localhost browser: - Это anti-pattern для production OAuth - Нормальный flow: browser → ingress (HTTPS public) → Keycloak - NodePort 32432 — это для admin/automated access, не для browser OAuth --- ### ✅ Что хорошо - Остальные параметры (KC_HOSTNAME, KC_PROXY_HEADERS) уместны - Resources/labels/PSS в порядке (не видны в diff, предполагаю уже были) --- ### 🔧 Рекомендация **Отменить этот PR и сделать правильно:** ```yaml - name: KC_HOSTNAME_STRICT_HTTPS value: "false" - name: KC_HOSTNAME value: "keycloak.georgepet.duckdns.org" - name: KC_PROXY value: "edge" - name: KC_PROXY_HEADERS value: "xforwarded" ``` Если NodePort — это именно для локального browser access: использовать separate ingress/DNS на localhost вместо стандартного host. **Status:** ❌ **BLOCK** — опасно для production. Переделать. --- _Automated review by Claude Haiku | advisory, does not block merge_
claude merged commit ed1b2d6004 into main 2026-02-19 17:03:43 +01:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: claude/k8s-apps#176
No description provided.