Mortinta Ŝaltilo por Fajroŝildo-Redaktoj

La plej timiga linio en hejmlaba aŭtomatigo estas tiu, kiu redaktas fajroŝildan regulon sur la enkursigilo, al kiu vi estas konektita per SSH.

Jen kiel Claude Code kaj mi ilin redaktas tamen.


La Timo

Mi devis ŝanĝi UDM Pro-regulon nomatan “Block inter-VLAN traffic” de accept al drop. La regulo estis malĝuste agordita longe — fiksita al accept, mallongcirkuitante ĉiun por-fluan permeson super ĝi — kaj refermi ĝin estis la tuta punkto. La orkestristo rulanta la ŝanĝon estis NixOS VM en mia hejma reto. Se la ŝanĝo forprenis la vojon, kiun tiu VM (aŭ mia propra SSH) uzis, mi estus ekskluzivigita el mia propra enkursigilo sen konzola rezervo.

La solvo ne estas “esti zorga.” La solvo estas igi la danĝeran redakton aŭtomate revertigi krom se mi konfirmas, ke ĝi estas bona.

Vi jam vidis ĉi tiun ŝablonon. Ŝanĝu la rezolucion de via monitoro sur macOS aŭ Windows kaj la sistemo aplikas ĝin dum dek kvin sekundoj kun malpliiĝanta dialogo “Konservi ĉi tiujn ekranajn agordojn?”. Se via ekrano nigriĝis, vi ne povas klaki ion ajn — kaj tio estas la punkto. La defaŭlta rezulto estas retroigo. Konfirmo estas laŭvola.

Tio estas ĝuste kion ni volas por fajroŝilda ŝanĝo sur enkursigilo, kies regulojn ni baldaŭ ŝanĝos.


La Lertaĵo

udm_set_firewall_rules.py --flip-with-revert 300 --apply

Legu: “ŝanĝu la regulon, sed aŭtomate revertigu post 300 sekundoj krom se mi diras al vi ne fari tion.”

Kion ĝi faras, laŭorde:

  1. Instantaĵo. GET-as la aktualan regulon kaj konservas la plenan JSON-ŝarĝon sur la UDM ĉe /root/.udm-flip-revert/payload-<id>.json.
  2. Prepari la revertigon. Skribas malgrandan ŝelan skripton apud la ŝarĝo, kiu re-PUT-as la instantaĵon al la UDM API.
  3. Plani la revertigon. systemd-run --on-active=300s --unit=udm-flip-revert-<id> vicumas la skripton kiel transitivan tempigilon.
  4. Ŝanĝi. PUT-as la novan regulon (action: drop).

Nun vi havas 5-minutajn fenestron por kontroli:

✓ flipped 'Block inter-VLAN traffic' to action='drop'
⏱  auto-revert scheduled (~300s)

TO KEEP THE FLIP:    ssh udm 'systemctl stop udm-flip-revert-66c1d…timer'
TO ROLL BACK NOW:    ssh udm 'systemctl stop …timer; bash /root/.udm-flip-revert/revert-….sh'
WAIT IT OUT:         do nothing — timer will revert in ~300s

Tri rezultoj:

La tria kazo estas la tuta kialo por kiu ĉi tio ekzistas.


Kial systemd-run, Ne at(1)

UDM Pro (Debian 11) ne liveras kun atd. Ĝi havas systemd. systemd-run --on-active=Ns kreas transitivan tempigilon, kiu ekfunkcias unufoje kaj mem-kolektiĝas — tio estas ĝuste la formo de “faru ĉi tion post N sekundoj kaj tiam foriru.”

ssh_udm(
    f"systemd-run --on-active={seconds} --unit={unit} --collect "
    f"--quiet /bin/bash {script_file}"
)

--collect estas la ŝlosila flago — sen ĝi la unuo restas en malsukcesa/senagiva stato kaj kaosas systemctl.


La Averto

Transitivaj systemd-unuoj loĝas en /run, kiu estas tmpfs. Se la UDM restartas ene de la revertig-fenestro, la tempigilo malaperas — kaj la ŝanĝo restas aplikita sen mortinta ŝaltilo gardanta ĝin.

Kontraŭintuitiva sed reala: konservu la fenestron mallonga. 5-minuta fenestro kun malgranda restarta risko estas pli sekura ol 1-hora fenestro, kie UPS-fiasko ĉe minuto 12 lasigas vin kun permanenta ekskluzivigo. Sufiĉe longa por kontroli, sufiĉe mallonga ke “ĉu mi forgesis pri atendanta revertiго?” neniam estu demando.


Konkludo

La mortinta ŝaltilo-ŝablono ĝeneralgas preter UDM-fajroŝildaj reguloj. Ie ajn vi baldaŭ aplikos ŝanĝon, kiu povus tranĉi la vojon tra kiu vi ĝin aplikis — enkursig-tabeloj, sshd_config, nftables, BGP — la sama formo funkcias:

  1. Kaptu la aktualan staton
  2. Pretigu skripton, kiu restaŭras ĝin
  3. Planu la skripton por ruli post N sekundoj
  4. Apliku la ŝanĝon

Se vi ankoraŭ estas tie post N+ε sekundoj kaj aferoj aspektas bone, nuligi la tempigilon. Se ne, la tempigilo nuligas vin.

Mi dormas pli bone kun ĉi tio en la ilaro.