Săriți la conținut

Blog ·

Un agent real, un gateway de dezvoltare

Cinci runde s-au încheiat cu aceeași rezervă: nedovedit pe fir. Închiderea ei a cerut un agent real, o parolă plantată și două măsurători care nu măsurau.

De Provibr

Cinci runde la rând și-au încheiat raportul cu o variantă a aceleiași fraze: schimbarea de protocol este aditivă, testele unitare sunt verzi și nimic din toate acestea nu a fost exersat împotriva unui agent real. Adaptoare de monitorizare, plicul sigilat, actualizările automate ale agentului, un pas de automatizare care așteaptă o comandă. Toate cinci erau corecte pe cât se putea vedea și toate cinci purtau o rezervă pe care runda următoare o moștenea.

Rezerva aceea costă puțin la scris și se adună. Fiecare rundă adaugă una, nimeni nu greșește, iar după cinci rămâne o stivă de comportament care a existat doar într-un banc de probă. Runda aceasta a servit la înlăturarea stivei, nu la mărirea ei: nicio funcție, nicio schimbare de protocol, nicio publicare. Optzeci și două de măsurători împotriva unui agent real.

Montajul, într-o frază

Un binar de agent real, compilat pentru aceeași țintă pe care o livrăm, semnat cu o cheie de dezvoltare, rulând într-un container de unică folosință pe o mașină care nu este laptopul nimănui, vorbind cu un gateway de dezvoltare printr-un tunel invers, cu șapte servicii de unică folosință pe bucla locală de măsurat și o a doua copie a aceluiași binar înscrisă ca sondă găzduită.

Totul în fraza aceea poartă greutate. Binarul este cel livrat și nu o compilare de test, fiindcă defectele interesante locuiesc în serializare și în TLS, nu în logică. Gateway-ul este intenționat o instanță de dezvoltare pe porturi diferite, fiindcă cel de producție ascultă pe cele evidente, iar un agent care ar bate la partea greșită ar însemna o după-amiază foarte proastă. Serviciile sunt containere de unică folosință cu software real în versiuni reale și nu imitații, fiindcă tot rostul exercițiului este că imitațiile sunt tocmai ceea ce aveam deja.

Serviciile de baze de date au primit o parolă canar, iar alegerea aceea a făcut posibilă secțiunea următoare.

GrupMăsurătoriCe lămurește
Adaptoare de monitorizare44Șase protocoale de bază de date și de director, credențiale corecte și greșite, și starea de regulă care urmează
Actualizări automate19Planificare, aplicare, repornire și refuzul unei compilări modificate
Pas de automatizare11O comandă care se încheie în timpul așteptării și una care nu se încheie
Sondă găzduită4Același binar înscris ca sondă de platformă în loc de agent de client
Sursă lipsă4Un agent deconectat produce o stare proprie, niciodată o avarie falsă

O căutare cu o valoare plantată

Afirmația pe care voiam cel mai mult să o punem la încercare este o negație: un secret de monitorizare călătorește sigilat și nu este scris niciodată în rândul comenzii, în jurnalul de evenimente, în magistrala de mesaje sau în vreunul dintre cele două jurnale de proces.

Negațiile sunt afirmațiile care greșesc în tăcere. Parolele nu au fost așadar șiruri aleatorii a căror absență nu dovedește nimic; au fost valori plantate, alese astfel încât o singură apariție oriunde să fie de neconfundat. Apoi au fost cercetate șapte straturi: sarcinile utile de comandă păstrate, tabelul de evenimente, configurația de verificare păstrată, rezultatele păstrate, magistrala de mesaje în text și în forma codificată, jurnalul gateway-ului și cel al agentului. În total, aproape jumătate de milion de caractere de material.

Zero potriviri, care este răspunsul dorit și totodată răspunsul pe care îl dă o căutare stricată.

Aceeași căutare a fost prin urmare lansată asupra unui fișier care conținea sigur cuvântul și l-a găsit. Controlul acela pozitiv este deosebirea dintre „am căutat și nu era nimic” și „nu am căutat”. Costă un rând și este rândul cel mai valoros din script.

Alte două cerințe acoperă același eșec de la celălalt capăt: execuția trebuie să observe cel puțin o duzină de comenzi de verificare reale și câteva zeci de mesaje pe magistrală înainte de a avea voie să concluzioneze ceva. Amândouă au stat pe roșu la un moment dat în rundă, la treceri care altfel ar fi anunțat o măturare curată peste absolut nimic. O măturare care nu găsește încălcări într-o mulțime goală nu este o dovadă și arată exact ca un succes.

Două feluri de a fi verde fără a măsura

Amândouă s-au petrecut în runda aceasta, în scripturi scrise de cineva care cunoaște acest mod de eșec și scrie despre el cu regularitate.

Primul: o interogare a selectat o coloană, iar codul a citit apoi altă proprietate pe rândurile rezultatului. Într-un limbaj cu tipuri asta este o eroare; aici este undefined, pentru totdeauna, în tăcere, iar orice comparație cu valoarea aceea eșuează într-un fel care seamănă cu o aserțiune care nu se declanșează niciodată, nu cu una care este mereu adevărată. Verificarea a anunțat succes fiindcă nu avea ce compara.

Al doilea: o probă de apartenență la o listă goală. Este o afirmație despre nimic, se satisface banal și este starea finală firească a oricărui script a cărui etapă anterioară a produs în tăcere zero rânduri. Amândouă se acoperă ieftin: verificați forma a ceea ce ați obținut și verificați că mulțimea de cercetat nu este goală.

Cinci nume de coloană din scripturile acelea fuseseră ghicite în loc să fie căutate. Acelea au eșuat zgomotos, ceea ce este varianta ieftină a aceleiași greșeli, dar este aceeași greșeală: o comandă spune cum se numește o coloană, iar versiunea în care o presupunere ajunge într-o listă pe care nimeni nu o execută este versiunea care supraviețuiește revizuirii.

Un agent care refuză să se înscrie de două ori

La jumătatea testelor de actualizare agentul a încetat să se întoarcă. Din afară arăta ca o buclă de repornire, iar prima oră s-a dus pe calea de actualizare.

Agentul făcea exact ce trebuia. Înscrierea scrie un fișier de stare, iar scriptul de instalare generat verifică fișierul acela și refuză să se înscrie din nou dacă el există. Reînscrierea unei gazde deja înscrise înlocuiește o identitate, iar a face asta din greșeală este felul în care o mașină își pierde certificatul și seiful într-un singur pas. Bucla noastră de supraveghere, scrisă pentru ocazie, nu avea o asemenea poartă, iar fiecare încercare de repornire se lovea de refuzul propriu și corect al agentului.

Lecția nu este despre poarta aceea. Este despre faptul că un refuz corect și un defect au de departe aceeași formă, iar ceea ce le desparte este citirea a ceea ce a spus cu adevărat cealaltă parte, nu a ceea ce sugera simptomul.

Din aceleași zile au ieșit alte trei surprize, toate trei decizii de proiectare întâlnind realitatea:

Orele de actualizare planificate stau pe o grilă de cinci minute, impusă de o restricție de bază de date. „Peste un minut”, ceea ce vrea cel care scrie un test, nu există. Ceea ce face lucrul acesta practicabil este o fereastră de recuperare: o oră ratată se execută totuși încă un sfert de oră. Tot de aceea o măsurătoare repetată în același sfert de oră trebuie să aleagă o oră de grilă nefolosită, fiindcă fiecare oră este revendicată unic pe agent, iar o a doua trecere pe aceeași este refuzată pe bună dreptate.

O verificare TCP vine cu TLS pornit. Îndreptată spre un port necriptat, eșuează cu o eroare TLS, ceea ce este corect și se citește ca o verificare stricată până când te uiți ce este o valoare implicită.

Iar rândul de audit al unui pas de automatizare a cărui așteptare a expirat îngheață pe starea pe care a văzut-o fluxul. Comanda a trecut în timp expirat șaizeci de milisecunde mai târziu, iar rândul a continuat să spună ce spunea. Nu este un defect al rândului, este un defect al comentariului de deasupra lui, care promitea că acolo se poate citi deznodământul final. Promisiunea aceea a fost retrasă și tratată cum se cuvine în altă parte.

O notificare care grupează și un număr care spune zero

Cea mai ascuțită dintre descoperirile mărunte. După o actualizare reușită platforma scrie o notificare. Măsurătoarea a numărat notificările create de la începutul execuției și a obținut zero.

Notificările grupează. O a doua apariție a aceluiași lucru mărește un contor pe rândul existent și lasă neatinsă marca de creare, ceea ce este exact ce se dorește într-un panou: „agentul acesta a căzut” cu un număr alături în loc de patruzeci de rânduri. Este totodată exact ceea ce face ca o numărare pe marca de creare să nu anunțe nimic în timp ce notificarea stă acolo la vedere.

Măsurătoarea greșea, produsul avea dreptate, iar singurul motiv pentru care se știe în ce sens era este că cineva a deschis panoul în loc să creadă interogarea. Orice agregare are o formă, iar un test care nu o cunoaște își pune la încercare propria presupunere.

Ce am nota

  1. „Nedovedit pe fir” este o datorie și se adună. O rundă o poate purta. Cinci runde sunt o stivă de comportament care nu a existat niciodată în afara bancului de probă.
  2. Dovediți o negație cu o valoare plantată și un control pozitiv. Fără el, zero potriviri și o căutare stricată nu se deosebesc.
  3. Dați fiecărei măturări o podea. Verificați că intrarea nu este goală înainte de a concluziona ceva despre ea.
  4. Un refuz corect arată de departe ca un defect. Citiți ce a spus cealaltă parte înainte de a o rescrie pe a voastră.
  5. Nu ghiciți nici un nume de coloană, nici o valoare implicită, nici o grilă. Toate trei sunt la o comandă distanță, iar presupunerea care ajunge într-o listă este cea care nu se declanșează niciodată.
  6. Cunoașteți forma a ceea ce numărați. Rândurile grupate nu poartă marca de creare după care filtrați.

Pentru claritate: în runda aceasta nu s-a publicat nimic. Nicio schimbare de produs, nicio schimbare de protocol, nicio publicare a agentului. Ce a ieșit este că cinci rezerve au dispărut și un pumn de defecte mici sunt reparate, iar curățenia a fost renumărată în loc de presupusă: fără rânduri rămase, fără containere rămase, fără fișiere rămase.

Unele lucruri au rămas nedovedite. Calea de injectare a automatizării a fost exersată prin nucleul ei și nu prin panou, adaptoarele nu au rulat de la o sondă găzduită, iar încă nu există măsurătoare împotriva unui hipervizor real.

Din munca de platformă la Provibr. De ce secretul de monitorizare este sigilat la fiecare încercare se află în un secret care călătorește o singură dată, iar cum o actualizare semnată a agentului refuză o compilare modificată se află în cum se refuză singură o actualizare semnată.

Începeți cu o gazdă și un agent

Creați un cont, instalați agentul cu o singură comandă și conectați primul dumneavoastră host Proxmox. Perioada de probă durează 14 zile și nu cere date de plată.