chore(kb): whitelist --check — /opt/homelab jako swiadomy wyjatek

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.
This commit is contained in:
oskar 2026-08-04 18:05:45 +02:00
parent 41d3543082
commit 369ba31dde
3 changed files with 31 additions and 25 deletions

View file

@ -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ą.
---

View file

@ -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):
#
# <fragment> wycisza KAŻDE trafienie zawierające <fragment>
# <ścieżka strony>|<fragment> 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

View file

@ -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("|")