From e3114f3e7cb302cd79e2e6a6fb8e9744a68e973b Mon Sep 17 00:00:00 2001 From: migatu Date: Tue, 4 Aug 2026 17:10:23 +0200 Subject: [PATCH] =?UTF-8?q?docs(bezpiecze=C5=84stwo):=20runbook=20rotacji?= =?UTF-8?q?=20sekret=C3=B3w=20+=20poprawka=20nieaktualnej=20tre=C5=9Bci=20?= =?UTF-8?q?LOG-33?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wymaganie mówiło o restarcie „WSZYSTKICH TRZECH usług" przy zmianie INTERNAL_TOKEN. Sprawdzenie żywych deploymentów pokazuje, że token czytają CZTERY: data, logic, presentation ORAZ render (doszedł przy PRE-24, a wymaganie tego nie nadgoniło). Kto zrobiłby rotację literalnie, zostawiłby render ze starym tokenem i usługa po cichu przestałaby się dogadywać — dokładnie ta awaria, przed którą wymaganie ostrzega. Treść w arkuszu poprawiona. docs/log33-sekrety-i-rotacja.md: - MACIERZ zależności wyliczona z deploymentów, nie z założeń. Wniosek praktyczny: klucze łącz rotuje się PARAMI usług (logic+data, presentation+logic, presentation+render), a nie całą czwórką — restartu wszystkiego wymaga tylko INTERNAL_TOKEN. - Procedury per sekret, od najbezpieczniejszej do przećwiczenia (klucze LLM — dotykają tylko logiki, awaria widoczna i nieszkodliwa) po INTERNAL_TOKEN. Wszystkie zachowują pozostałe klucze przez odczyt z istniejącego sekretu — inaczej rotacja jednego skasowałaby resztę. - Weryfikacja: sam „Running" NIE wystarcza (pody wstaną, nawet gdy warstwy się nie dogadują) — trzeba przeliczyć horoskop i wygenerować PDF, żeby dotknąć wszystkich łącz. - Kroki hartowania z jasnym podziałem: co zrobione (automount tokenów — deploy #13), co wymaga węzła (szyfrowanie at-rest), co świadomie odłożone (Sealed Secrets — dziś sekrety NIE są w repo GitOps, więc ta zasada już jest spełniona; Sealed Secrets dodałyby odtwarzalność kosztem nowego pojedynczego punktu awarii). Co-Authored-By: Claude Opus 4.8 --- docs/astrololo_wymagania.xlsx | Bin 38549 -> 38637 bytes docs/log33-sekrety-i-rotacja.md | 171 ++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 docs/log33-sekrety-i-rotacja.md diff --git a/docs/astrololo_wymagania.xlsx b/docs/astrololo_wymagania.xlsx index 382c5fd647b6b7af9965f4baf5608f6719f389f0..e8260d67378056ae6fee947fe0c8e6ff35a6ea5a 100644 GIT binary patch delta 12334 zcmZvCWl&zhvh9bv2lwC-9D=(;aCdii-?;mS6WoG(aCdhnIKf?#pf5R9_trbF-uzj6 zdbdn<)pYgDtki1Ai)u(@B{?YQ4)zK1 zQ1KrZ5S{i$fR(Y4!IWfiZX8u8)?h#B_Tz)lf%tA!R|L||>Z6i7{_@+?=yY<7oWr%^ z>bc2Kp{-RJ_G(74cHvfL0VX*|R6|n-;ZQmG;on)2eWG6gRkk}0oP5*w4a7! zN`vyax)L~*-?C*kh^dm(td%JvBtEbBoQy&y51Bzob1;Pmova-@X|Z<@J~u63G-kzL zjQBr>=Xs1Me*Z0XFZcKrjF3-Dm1xe>k8|dM>CN-&<@R7COg8PL86E$b8oBTu?7O0k za}_UH?)gbH*P&cX{CX-?77)$t+c0C5-4}Pti|jYzSlbHVKx~V>^nYUY_ek@5svmC@ zmfT}Bwk8SZr^|~L#?IR$+^!VjPLDZ@6~yy@a-PIBp>AL{B@1jRDkU}y|0r7$t@W`+ zuI!3*#!#d9)5x_G-o&Fo_K*yWM9TD`RLU?o`eC;TMiPVKyMN9Aelf#z54rfGNUo_AtS<({kY&uend z<8rbRK)V2VnG^VV2++BWpbxl;;h*%pWcyrd!c&7$qoWEkI^}NaVoXMq&i{URb%g8% z6?k1U4S8*f+{`NR`z7ot!wpf0-5d)QdxgS@G`q;BD(z8@jYZ3}nfgOC{{eE8@n~@yyVDS3@ieqrA z_irRj&<}J!MhZ2wM#i98s-_HoAGhlp+7OzZjwH*-T;9ms5N;;5k8NQd+akW&;eLG- zbc{`KsO#E?>LxdLXf4}mc7wOkWt$Oc=W)cm1blMEvg7h*IO{Wd#1LUAWjOtosQnx7 z*)K04z;iXwFdJ~0?_bKM4i76^m*{Aq&K+Tg9z&U8tu1ac>hOLlm(R% z{^)w0tIBkRmjUM>pm}o5h>70gnL-hVetg^71{xDsid-sA%8hdPn;JSk|L<)A-(?a* zuI1HBJWWkE{J*S8c=4i9!b8;f%iBwr{#0RX%mZk(hK!a)lTy0Bv_26AjPWOyef

%H@5#@N0j} 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 delta 12218 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ⅅ939Q*IIeKWe2y~6+ODu+VY%nUz_XHM-4$ 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 **UWAGA — częsty błąd.** Wcześniejsza wersja tego wymagania mówiła o „wszystkich +> **trzech** usługach" przy `INTERNAL_TOKEN`. To już nieprawda: `render` (PRE-24) +> również go używa. Restart trzech zostawi render ze starym tokenem i **usługa po +> cichu przestanie się dogadywać** — dokładnie ta awaria, przed którą wymaganie +> ostrzega. + +Klucze łącz są **parami** — rotacja jednego wymaga restartu tylko dwóch usług, nie +całej czwórki. W trakcie wymiany para chwilowo się nie dogaduje (klucze muszą być +zgodne po obu stronach łącza), dlatego restart obu naraz. + +--- + +## Procedury rotacji + +### A. Klucze LLM (najbezpieczniejsze do przećwiczenia) + +Dotykają wyłącznie logiki, a awaria jest widoczna od razu i nieszkodliwa +(niedostępna chmura, model lokalny działa dalej). **Zacznij ćwiczenie od tego.** + +```bash +read -rs -p "Nowy ANTHROPIC_API_KEY: " NEW; echo +``` + +```bash +kubectl -n astrololo create secret generic astrololo-llm \ + --from-literal=OPENAI_API_KEY="$(kubectl -n astrololo get secret astrololo-llm -o jsonpath='{.data.OPENAI_API_KEY}' | base64 -d)" \ + --from-literal=ANTHROPIC_API_KEY="$NEW" \ + --dry-run=client -o yaml | kubectl apply -f - +``` + +```bash +unset NEW && kubectl -n astrololo rollout restart deploy/logic && kubectl -n astrololo rollout status deploy/logic +``` + +### B. Klucz łącza (para usług) + +Przykład dla `LINK_KEY_PRESENTATION_RENDER`. Pozostałe klucze zachowujemy bez zmian, +odczytując je z istniejącego sekretu — inaczej skasowalibyśmy pozostałe łącza. + +```bash +kubectl -n astrololo create secret generic astrololo-link \ + --from-literal=LINK_KEY_PRESENTATION_LOGIC="$(kubectl -n astrololo get secret astrololo-link -o jsonpath='{.data.LINK_KEY_PRESENTATION_LOGIC}' | base64 -d)" \ + --from-literal=LINK_KEY_LOGIC_DATA="$(kubectl -n astrololo get secret astrololo-link -o jsonpath='{.data.LINK_KEY_LOGIC_DATA}' | base64 -d)" \ + --from-literal=LINK_KEY_PRESENTATION_RENDER="$(openssl rand -hex 32)" \ + --dry-run=client -o yaml | kubectl apply -f - +``` + +```bash +kubectl -n astrololo rollout restart deploy/presentation deploy/render +``` + +```bash +kubectl -n astrololo rollout status deploy/presentation && kubectl -n astrololo rollout status deploy/render +``` + +### C. `INTERNAL_TOKEN` (wszystkie cztery naraz) + +Najbardziej wrażliwa rotacja: w trakcie usługi z różnymi tokenami **odrzucają się +nawzajem**, więc restart musi objąć całą czwórkę. + +```bash +kubectl -n astrololo create secret generic astrololo-auth \ + --from-literal=APP_PASSWORD="$(kubectl -n astrololo get secret astrololo-auth -o jsonpath='{.data.APP_PASSWORD}' | base64 -d)" \ + --from-literal=INTERNAL_TOKEN="$(openssl rand -hex 32)" \ + --dry-run=client -o yaml | kubectl apply -f - +``` + +```bash +kubectl -n astrololo rollout restart deploy/data deploy/logic deploy/presentation deploy/render +``` + +```bash +kubectl -n astrololo rollout status deploy/data && kubectl -n astrololo rollout status deploy/logic && kubectl -n astrololo rollout status deploy/presentation && kubectl -n astrololo rollout status deploy/render +``` + +> Jeśli używasz kont imiennych (PRE-17), zamiast `APP_PASSWORD` zachowaj `APP_USERS` +> — patrz [`konta-i-audyt.md`](konta-i-audyt.md). + +### Weryfikacja po KAŻDEJ rotacji + +Sam `Running` nie wystarczy — pody wstaną nawet, gdy warstwy się nie dogadują. +Trzeba sprawdzić **realny przelot przez wszystkie łącza**: + +```bash +kubectl -n astrololo get pods +``` + +```bash +curl -s -o /dev/null -w "aplikacja: %{http_code}\n" -u ":" https://astrololo.czernobog.pl/ +``` + +Policz horoskop w przeglądarce (dotyka presentation→logic→data) i wygeneruj PDF +(dotyka presentation→render). Dopiero to potwierdza, że wszystkie cztery klucze +i token są spójne. + +--- + +## Hartowanie — kroki wymagające dostępu do węzła + +### 1. Szyfrowanie sekretów w spoczynku (najważniejsze) + +k3s z jednym serwerem trzyma stan w **SQLite**, nie w etcd, więc „szyfrowanie etcd" +sprowadza się do wbudowanej funkcji k3s. Kroki są w sekcji „Co musisz zrobić sam" +poniżej. Efekt: kopia pliku stanu albo snapshot VM przestaje być wyciekiem haseł +i kluczy API. + +**Granica:** klucz szyfrujący leży na tym samym serwerze. Chroni przed kradzieżą +pliku/snapshotu — nie przed kimś, kto ma roota na węźle. + +### 2. Ograniczenie tokenów kont serwisowych ✅ + +Zrobione: `automountServiceAccountToken: false` we wszystkich czterech usługach +(deploy #13). Żadna nie rozmawia z API Kubernetesa — sekrety wstrzykuje kubelet, +nie pod — więc token był zbędny, a stanowił gotowy punkt wyjścia do klastra. + +### 3. RBAC + +Stan sprawdzony: **zero RoleBindings** w `astrololo`, `cluster-admin` tylko dla +`system:masters` i dwóch kont Helma w `kube-system`. Nie ma rozdanych nadmiarowych +uprawnień do cofania. + +Realna ekspozycja to **kubeconfig admina**. Sensowny krok: osobny, ograniczony +kubeconfig do codziennej pracy, a admin tylko wtedy, gdy naprawdę potrzebny. + +### 4. Sealed Secrets / SOPS — świadomie ODŁOŻONE + +Dziś sekrety tworzone są ręcznie i **nie ma ich w repo GitOps** — czyli zasada +„nie wpisywać sekretów do repozytorium" **jest już spełniona**. Kosztem jest +odtwarzalność: po utracie klastra nikt nie wie, co tam było. + +Sealed Secrets pozwoliłoby trzymać je w gicie w postaci zaszyfrowanej, ale to +zmiana filozofii i **nowy pojedynczy punkt awarii**: utrata klucza kontrolera = +utrata wszystkich sekretów. Rekomendacja: dopiero po punkcie 1, i tylko jeśli +zależy Ci na odtwarzalności klastra z gita. + +--- + +## Czego NIE robimy + +- **Nie wpisujemy sekretów do logów.** Dziennik audytowy (PRE-17) niesie wyłącznie + metadane i liczby. +- **Nie wpisujemy sekretów do repo GitOps.** Manifesty odwołują się do sekretów + przez `secretKeyRef` i celowo nie zawierają wartości. +- **Nie zostawiamy haseł w historii powłoki** — stąd `read -rs` i odczyt istniejących + wartości przez `kubectl … | base64 -d` zamiast wpisywania ich ponownie.