feat(astrololo): HTTPS + szyfrowanie łączy między warstwami (PRE-16) #4

Open
gitea wants to merge 2 commits from feat/tls-ingress into master
Owner

Domyka PRE-16 po stronie manifestów: HTTPS na wejściu oraz klucze do
szyfrowania łączy między warstwami. Kod aplikacyjny: astrololo#21.
Instrukcja krok po kroku (oba PR-y): docs/wdrozenie-pre16.md w repo astrololo.

HTTPS na wejściu

Aplikacja chodziła po http, logowanie przez HTTP Basic — hasło do podsłuchania
(base64 to nie szyfrowanie). TLS naprawia przy okazji dwie funkcje zepsute
z tego samego powodu: geolokalizacja i schowek działają wyłącznie w secure context.

  • tls.yamlIssuer selfSigned → korzeń CA (10 lat, importowany raz) →
    Issuer CA → certyfikat serwera (90 dni, odnawiany sam). Własne CA, nie
    Let's Encrypt, bo klaster jest w LAN (Traefik LB na 192.168.1.x) — HTTP-01 nie
    dojdzie, DNS-01 wymagałby tokena do domeny w klastrze.
  • ingress.yaml — wejście po https + HSTS/nosniff/frameDeny oraz osobny
    Ingress na :80
    robiący przekierowanie (na jednym routerze odsyłałby sam do
    siebie w kółko).
  • presentationNodePortClusterIP. NodePort był drugą, nieszyfrowaną
    drogą do aplikacji, czyli obejściem całego PRE-16.

Szyfrowanie łączy — sekret astrololo-link

  • Dwa klucze: LINK_KEY_PRESENTATION_LOGIC, LINK_KEY_LOGIC_DATA. Osobne
    celowo — przejęcie klucza prezentacji nie otwiera warstwy danych. Logika bierze
    oba, prezentacja i dane wyłącznie swój (secretKeyRef).
  • LINK_ENCRYPTION_REQUIRED=true we wszystkich trzech: bez klucza pod nie
    wstaje
    , a klient nie wysyła niczego. Fail-closed w obie strony jest zamierzony
    — usługa, która wstała i po cichu nie szyfruje, jest gorsza niż CrashLoop, bo
    awarii nie widać.
  • TRUST_PROXY=true na prezentacji — żeby limit żądań liczył realnych klientów
    zza Ingressu, nie pod Traefika (patrz astrololo#21).

⚠️ Trzy kroki PRZED mergem (kolejność w instrukcji)

  1. sekret astrololo-link — inaczej pody wpadną w CrashLoop (fail-closed),
  2. cert-manager v1.21.0 — inaczej API odrzuci Certificate/Issuer,
  3. DNS astrololo.czernobog.pl → adres Traefika — bo NodePort znika.

Sprawdzone

  • Ingress i Middleware: kubectl apply --dry-run=server na żywym klastrze
    (CRD traefik.io/v1alpha1 są, entrypointy web/websecure, referencje
    middleware rozwiązują się).
  • cert-manager: walidacja offline wobec oficjalnego schematu z CRD v1.21.0
    z additionalProperties=false — sprawdzona literówką renewBefor, którą łapie.
  • kubectl kustomize + --dry-run=server przechodzą dla obu profili
    (bazowego i astrololo-swisseph).
Domyka **PRE-16** po stronie manifestów: HTTPS na wejściu **oraz** klucze do szyfrowania łączy między warstwami. Kod aplikacyjny: [astrololo#21](https://gitea.czernobog.pl/gitea/astrololo/pulls/21). Instrukcja krok po kroku (oba PR-y): `docs/wdrozenie-pre16.md` w repo astrololo. ## HTTPS na wejściu Aplikacja chodziła po http, logowanie przez HTTP Basic — **hasło do podsłuchania** (base64 to nie szyfrowanie). TLS naprawia przy okazji **dwie funkcje** zepsute z tego samego powodu: geolokalizacja i schowek działają wyłącznie w secure context. - **`tls.yaml`** — `Issuer selfSigned` → korzeń CA (10 lat, importowany raz) → `Issuer CA` → certyfikat serwera (**90 dni**, odnawiany sam). Własne CA, nie Let's Encrypt, bo klaster jest w LAN (Traefik LB na 192.168.1.x) — HTTP-01 nie dojdzie, DNS-01 wymagałby tokena do domeny w klastrze. - **`ingress.yaml`** — wejście po https + HSTS/nosniff/frameDeny oraz **osobny Ingress na :80** robiący przekierowanie (na jednym routerze odsyłałby sam do siebie w kółko). - **`presentation`** — `NodePort` → `ClusterIP`. NodePort był drugą, nieszyfrowaną drogą do aplikacji, czyli obejściem całego PRE-16. ## Szyfrowanie łączy — sekret `astrololo-link` - **Dwa klucze**: `LINK_KEY_PRESENTATION_LOGIC`, `LINK_KEY_LOGIC_DATA`. Osobne celowo — przejęcie klucza prezentacji nie otwiera warstwy danych. Logika bierze oba, prezentacja i dane wyłącznie swój (`secretKeyRef`). - **`LINK_ENCRYPTION_REQUIRED=true`** we wszystkich trzech: bez klucza pod **nie wstaje**, a klient nie wysyła niczego. Fail-closed w obie strony jest zamierzony — usługa, która wstała i po cichu nie szyfruje, jest gorsza niż CrashLoop, bo awarii nie widać. - **`TRUST_PROXY=true`** na prezentacji — żeby limit żądań liczył realnych klientów zza Ingressu, nie pod Traefika (patrz astrololo#21). ## ⚠️ Trzy kroki PRZED mergem (kolejność w instrukcji) 1. **sekret `astrololo-link`** — inaczej pody wpadną w CrashLoop (fail-closed), 2. **cert-manager** `v1.21.0` — inaczej API odrzuci `Certificate`/`Issuer`, 3. **DNS** `astrololo.czernobog.pl` → adres Traefika — bo NodePort znika. ## Sprawdzone - **Ingress i Middleware**: `kubectl apply --dry-run=server` na **żywym klastrze** (CRD `traefik.io/v1alpha1` są, entrypointy `web`/`websecure`, referencje middleware rozwiązują się). - **cert-manager**: walidacja offline wobec **oficjalnego schematu z CRD v1.21.0** z `additionalProperties=false` — sprawdzona literówką `renewBefor`, którą łapie. - `kubectl kustomize` + `--dry-run=server` przechodzą dla **obu** profili (bazowego i `astrololo-swisseph`).
gitea added 1 commit 2026-07-22 21:28:00 +00:00
Do tej pory aplikacja chodzila po zwyklym http, a logowanie szlo przez HTTP
Basic — czyli haslo leciało siecia w postaci trywialnej do podsluchania.

Poza bezpieczenstwem TLS naprawia DWIE funkcje zepsute dzis z tego samego
powodu: geolokalizacja przegladarki („Tu i teraz") i kopiowanie promptu do
schowka dzialaja wylacznie w secure context, wiec po http po prostu odmawialy.

Wlasne CA, nie Let's Encrypt — klaster stoi w LAN (traefik trzyma LoadBalancera
na 192.168.1.x), wiec walidacja HTTP-01 nie ma jak dojsc z internetu, a DNS-01
wymagalby trzymania w klastrze tokena API do domeny.

Co dochodzi:
- tls.yaml — Issuer selfSigned -> korzen CA (10 lat, importowany raz do
  przegladarki) -> Issuer CA -> certyfikat serwera (90 dni, odnawiany sam).
  Krotki termin certyfikatu serwera jest CELOWY: odnawianie sprawdza sie wtedy
  co kwartal, a nie dopiero za dekade.
- ingress.yaml — wejscie po https + naglowki (HSTS rok, nosniff, frameDeny)
  oraz osobny Ingress na porcie 80 robiacy przekierowanie. Rozdzielone
  swiadomie: gdyby redirect wisial na tym samym routerze co wejscie po https,
  odsylalby sam do siebie w kolko.
- presentation: Service NodePort -> ClusterIP. NodePort byl druga,
  nieszyfrowana droga do aplikacji, czyli obejsciem calego PRE-16.

Zmiana wymagajaca uwagi: TRUST_PROXY=true. Za Ingressem bezposrednim rozmowca
jest zawsze pod Traefika, wiec bez tego limit zadan liczylby WSZYSTKICH do
jednego wiadra i pierwsza osoba, ktora go wyklika, odcielaby pozostalych.

Sprawdzone: Ingress i Middleware przechodza `kubectl apply --dry-run=server`
na zywym klastrze (CRD traefik.io/v1alpha1 sa, entrypointy web/websecure sa).
Obiekty cert-managera zwalidowane offline wobec oficjalnego schematu z CRD
v1.21.0 z additionalProperties=false — literowka w nazwie pola zostalaby
zlapana. `kubectl kustomize` przechodzi dla obu profili (bazowego i swisseph).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
gitea added 1 commit 2026-07-22 21:52:44 +00:00
Domyka PRE-16 po stronie manifestow. Kod (astrololo#21) potrafi juz szyfrowac
ruch miedzy warstwami AES-256-GCM; tu dokladamy klucze i wymuszenie.

- astrololo-link: nowy sekret z dwoma kluczami (LINK_KEY_PRESENTATION_LOGIC,
  LINK_KEY_LOGIC_DATA), tworzony POZA repo jak pozostale. Osobny klucz na pare
  rozmowcow: przejecie klucza prezentacji nie otwiera warstwy danych. Logika
  bierze oba, prezentacja i dane wylacznie swoj (secretKeyRef).
- LINK_ENCRYPTION_REQUIRED=true we wszystkich trzech: bez klucza pod NIE wstaje,
  a klient nie wysyla niczego. Fail-closed w obie strony jest celowy — usluga,
  ktora wstala i po cichu nie szyfruje, jest gorsza niz CrashLoop, bo awarii
  nie widac.

README: sekcja o sekrecie astrololo-link (tworzenie, wymiana, restart calej
trojki naraz) oraz uczciwa nota, ze szyfrowane sa ciala, nie naglowki — sciezka
i token jada czytelnie, ale sam token bez klucza nic nie daje.

Sprawdzone: kubectl kustomize + apply --dry-run=server przechodza dla obu
profili. Pelna instrukcja wdrozenia: docs/wdrozenie-pre16.md w repo astrololo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
gitea changed title from feat(astrololo): wejście po https z własnym CA (PRE-16) to feat(astrololo): HTTPS + szyfrowanie łączy między warstwami (PRE-16) 2026-07-22 21:53:55 +00:00
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/tls-ingress:feat/tls-ingress
git checkout feat/tls-ingress
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gitea/deploy#4