feat(astrololo): wejscie po https z wlasnym CA (PRE-16)
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>
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
# Wejście do aplikacji po HTTPS (PRE-16).
|
||||
#
|
||||
# Poza bezpieczeństwem — Basic Auth po zwykłym http leci siecią czytelny dla
|
||||
# każdego, kto słucha — TLS naprawia DWIE funkcje zepsute dziś z tego samego
|
||||
# powodu: geolokalizacja przeglądarki („Tu i teraz") oraz kopiowanie promptu do
|
||||
# schowka działają wyłącznie w tzw. secure context i po http po prostu odmawiają.
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: Middleware
|
||||
metadata:
|
||||
name: security-headers
|
||||
namespace: astrololo
|
||||
spec:
|
||||
headers:
|
||||
stsSeconds: 31536000 # HSTS: rok
|
||||
stsIncludeSubdomains: false # dotyczy tylko tego hosta
|
||||
stsPreload: false # preload to wpis na listę w przeglądarkach
|
||||
# — praktycznie nieodwracalny, nie wchodzimy
|
||||
forceSTSHeader: true # nagłówek także przy odpowiedziach z backendu
|
||||
contentTypeNosniff: true
|
||||
frameDeny: true
|
||||
referrerPolicy: same-origin
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: Middleware
|
||||
metadata:
|
||||
name: redirect-https
|
||||
namespace: astrololo
|
||||
spec:
|
||||
redirectScheme:
|
||||
scheme: https
|
||||
permanent: true
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: astrololo
|
||||
namespace: astrololo
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: websecure
|
||||
traefik.ingress.kubernetes.io/router.middlewares: astrololo-security-headers@kubernetescrd
|
||||
spec:
|
||||
tls:
|
||||
- hosts: [astrololo.czernobog.pl]
|
||||
secretName: astrololo-tls # wypełnia cert-manager (tls.yaml)
|
||||
rules:
|
||||
- host: astrololo.czernobog.pl
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service: { name: presentation, port: { number: 8000 } }
|
||||
---
|
||||
# Osobny Ingress wyłącznie na porcie 80 — istnieje po to, żeby odesłać na https.
|
||||
# Rozdzielone świadomie: gdyby przekierowanie wisiało na tym samym routerze, co
|
||||
# wejście po https, odsyłałoby samo do siebie w kółko. Backend jest tu formalnością,
|
||||
# bo żadne żądanie do niego nie dojdzie.
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: astrololo-redirect
|
||||
namespace: astrololo
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||
traefik.ingress.kubernetes.io/router.middlewares: astrololo-redirect-https@kubernetescrd
|
||||
spec:
|
||||
rules:
|
||||
- host: astrololo.czernobog.pl
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service: { name: presentation, port: { number: 8000 } }
|
||||
Reference in New Issue
Block a user