From 369ba31dde5e559063289093a6398211b289797b Mon Sep 17 00:00:00 2001 From: oskar Date: Tue, 4 Aug 2026 18:05:45 +0200 Subject: [PATCH] =?UTF-8?q?chore(kb):=20whitelist=20--check=20=E2=80=94=20?= =?UTF-8?q?/opt/homelab=20jako=20swiadomy=20wyjatek?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decyzja operatora 2026-08-04: /opt/homelab to standardowa sciezka deploy rootu homelaba, ta sama na kazdym wezle, opisana wprost w publicznej czesci modelu (standards, service-model, observer, event-system). Nie ujawnia sekretow ani topologii, wiec zostaje na stronie publicznej. scripts/kb/check_whitelist.txt: wpis `/opt/homelab` z uzasadnieniem i data. Zakres wyjatku jest waski — sprawdzone, ze wycisza wylacznie warianty `/opt/homelab/...`; `/home/oskar/...`, `/opt/other/...`, adresy RFC1918 i porty dalej zapalaja czerwone. gen_pages.py: load_whitelist() obcina komentarz `#` w dowolnym miejscu linii, nie tylko na jej poczatku — wyjatek ma stac obok uzasadnienia, a nie osobno. Zaden ze skanowanych wzorcow nie zawiera `#`, wiec obciecie jest bezpieczne. kb/runbooks/kb-site-deploy.md §2: zapisany aktualny stan bramki (exit 0, 22 trafienia wyciszone) zamiast opisu decyzji do podjecia. Po zmianie: python3 scripts/kb/gen_pages.py --check -> CZYSTO, exit 0. --- kb/runbooks/kb-site-deploy.md | 30 ++++++++++++++---------------- scripts/kb/check_whitelist.txt | 17 ++++++++++------- scripts/kb/gen_pages.py | 9 +++++++-- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/kb/runbooks/kb-site-deploy.md b/kb/runbooks/kb-site-deploy.md index 44cf7eb..e95bfb2 100644 --- a/kb/runbooks/kb-site-deploy.md +++ b/kb/runbooks/kb-site-deploy.md @@ -68,24 +68,22 @@ i `/opt/`, długie hexy i ciągi base64 wyglądające na tokeny. **Kontrola jest bramką publikacji — nie kopiuj treści na PIHA przy exit 1.** -Stan na 2026-08-04 (10 dokumentów public): **22 trafienia, wszystkie -`path-host` — `/opt/homelab/...` w dokumentach opisujących layout runtime** -(`subsystems/observer`, `subsystems/standards`, `subsystems/service-model`, -`subsystems/event-system`, `subsystems/agent-operating-procedures`, -`subsystems/action-approval-model`, `runbooks/node-onboarding`). Zero IP, zero -portów, zero tokenów. +Stan na 2026-08-04 (11 dokumentów public): **exit 0 — czysto, 22 trafienia +wyciszone whitelistą.** Wszystkie wyciszone to `path-host` `/opt/homelab/...` +w dokumentach opisujących layout runtime (`subsystems/observer`, +`subsystems/standards`, `subsystems/service-model`, `subsystems/event-system`, +`subsystems/agent-operating-procedures`, `subsystems/action-approval-model`, +`runbooks/node-onboarding`). Zero IP, zero portów, zero tokenów. -Przed pierwszą publikacją trzeba to świadomie rozstrzygnąć — dwie drogi: +Decyzja operatora 2026-08-04: `/opt/homelab` jest świadomym wyjątkiem — +standardowa ścieżka deploy rootu, ta sama na każdym węźle, nie ujawnia +sekretów ani topologii. Wpis siedzi w `scripts/kb/check_whitelist.txt` razem +z uzasadnieniem. Wycisza wyłącznie warianty `/opt/homelab/...`; `/home/...`, +adresy, porty i tokeny dalej zapalają czerwone. -- **wyczyścić źródła**: pousuwać konkretne ścieżki z dokumentów `public` - (najbezpieczniejsze, ale te dokumenty w dużej części o tych ścieżkach są), albo -- **wpisać wyjątek**: `/opt/homelab` w `scripts/kb/check_whitelist.txt`. - Ścieżka `/opt/homelab` to konwencja repo, nie sekret; jest opisana w publicznym - `CLAUDE.md`-owym modelu i nie zdradza ani hosta, ani użytkownika. Wpis - wycisza wszystkie warianty `/opt/homelab/...` i **nie** wycisza `/home/...`. - -Cokolwiek wybierzesz — udokumentuj decyzję w whitelist (plik jest po to, żeby -wyjątek był zapisany, nie domyślny). +Każdy kolejny wyjątek podlega tej samej regule: najpierw próba wyczyszczenia +źródła, wpis do whitelisty dopiero jako świadoma decyzja, zawsze z komentarzem +i datą. --- diff --git a/scripts/kb/check_whitelist.txt b/scripts/kb/check_whitelist.txt index 07d6841..1a6c43f 100644 --- a/scripts/kb/check_whitelist.txt +++ b/scripts/kb/check_whitelist.txt @@ -4,7 +4,7 @@ # znajdzie adres IP, port, ścieżkę hosta (/home/, /opt/) albo coś, co wygląda # na token. Ten plik wycisza pojedyncze, świadomie zaakceptowane trafienia. # -# Format — jeden wpis na linię, `#` zaczyna komentarz: +# Format — jeden wpis na linię, `#` zaczyna komentarz (także w środku linii): # # wycisza KAŻDE trafienie zawierające # <ścieżka strony>| to samo, ale tylko w tej jednej stronie @@ -13,11 +13,14 @@ # `subsystems/observer.html`. Fragment dopasowuje się jako podciąg trafienia, # więc wpis `/opt/homelab` wycisza wszystkie warianty `/opt/homelab/...`. # -# Przykłady (zakomentowane — plik startuje PUSTY, każdy wyjątek ma być decyzją): -# -# /opt/homelab # umowna ścieżka runtime, nie sekret -# subsystems/observer.html|:8080 # port w przykładzie z dokumentacji -# # Zasada: najpierw popraw źródło w kb/ (dokument `visibility: public` nie # powinien zawierać adresów ani ścieżek konkretnego hosta). Whitelist jest -# ostatecznością dla rzeczy, które naprawdę mają zostać na stronie. +# ostatecznością dla rzeczy, które naprawdę mają zostać na stronie — każdy wpis +# ma mieć obok uzasadnienie i datę decyzji. + +# Decyzja operatora 2026-08-04: standardowa ścieżka deploy rootu homelaba, +# opisana wprost w publicznej części modelu (kb/subsystems/standards.md, +# service-model, observer, event-system). Nie ujawnia sekretów ani topologii — +# ta sama ścieżka jest na każdym węźle i nie mówi nic o tym, co na nim stoi. +# Wycisza warianty `/opt/homelab/...`; `/home/...` NIE jest objęte. +/opt/homelab diff --git a/scripts/kb/gen_pages.py b/scripts/kb/gen_pages.py index 4355950..58d4596 100644 --- a/scripts/kb/gen_pages.py +++ b/scripts/kb/gen_pages.py @@ -738,13 +738,18 @@ def load_whitelist(path: Path) -> list[tuple[str | None, str]]: Fragment jest dopasowywany jako podciąg trafienia, więc jeden wpis `/opt/homelab` wycisza wszystkie warianty `/opt/homelab/...`. + + `#` zaczyna komentarz w dowolnym miejscu linii — wyjątek bez uzasadnienia + obok siebie szybko staje się wyjątkiem, którego nikt już nie rozumie. + Żaden ze skanowanych wzorców (adresy, porty, ścieżki, tokeny) nie zawiera + `#`, więc obcięcie ogona jest bezpieczne. """ if not path.is_file(): return [] entries: list[tuple[str | None, str]] = [] for raw in path.read_text(encoding="utf-8").splitlines(): - line = raw.strip() - if not line or line.startswith("#"): + line = raw.split("#", 1)[0].strip() + if not line: continue if "|" in line: scope, _, fragment = line.partition("|")