SDLC / Policy-as-Code

EIAC w zabetonowanej organizacji: kiedy zwinność maskuje strukturę

Kilka lat temu siedziałem na przeglądzie bezpieczeństwa w dużej organizacji, świeżo po „transformacji agile”. Wszystko było: tablice, ceremonie, backlog wypielęgnowany jak bonsai. Na stole raport ze skanera: krytyczna podatność w bibliotece używanej przez wsadowy job, który uruchamia się raz na dobę w wydzielonej sieci, bez żadnej ekspozycji. Zespół dostał SLA: 7 dni na patch, bo „critical to critical”. W tym samym raporcie serwis brzegowy, wystawiony do internetu, z podatnością realnie exploitowalną - jego zespół dostał przedłużenie terminu, bo „zespół krytyczny dla biznesu, nie można go teraz obciążać”. Nikt na sali nie widział sprzeczności. Proces działał, metryki były zielone. Brakowało tylko bezpieczeństwa, ale tego akurat nikt nie mierzył.

Platon opisał ten mechanizm dwa i pół tysiąca lat temu: ludzie przykuci w jaskini, na ścianie cienie, i głębokie przekonanie, że cienie są światem. Organizacja, o której mówię, siedziała w tej jaskini dobrowolnie i jeszcze płaciła za projektor. Raport zgodności jest cieniem procesu bezpieczeństwa. Velocity jest cieniem dostarczania wartości. Cień nie jest kłamstwem - jest odbiciem o niskiej wierności, z którego usunięto wszystko, co niewygodne. I to jest właściwa definicja problemu, z którym mierzy się każde wdrożenie everything-as-code w takiej organizacji.

Teza

W organizacji z zabetonowaną strukturą standardy takie jak agile nie zwiększają jakości ani bezpieczeństwa - produkują cienie: metryki i rytuały, które wyglądają jak dowód poprawy i maskują problemy strukturalne. EIAC jest dla takiej organizacji groźny, bo kod jest odbiciem, któremu można zmierzyć wierność: jawnie pokazuje, kto za co odpowiada i jak proces naprawdę wygląda. Dlatego opór wobec EIAC jest strukturalny, nie techniczny - i nie da się go złamać jednym mandatem ani jedną zachętą.

Beton: struktura jako terytorium

Zabetonowana organizacja to taka, w której struktura zespołów i granice odpowiedzialności przestały być narzędziem, a stały się terytorium. Prawo Conwaya mówi, że systemy odwzorowują strukturę komunikacji organizacji - w becie działa to w obie strony: struktura broni się przed każdą zmianą, która mogłaby ją odwzorować inaczej. Odpowiedzialność przestaje znaczyć „odpowiadam za wynik”, a zaczyna znaczyć „nikt inny nie ma prawa tu wejść”.

Wdrożenie agile przebiega wtedy według przewidywalnego wzorca. Manifest stawia ludzi i interakcje ponad procesy i narzędzia - beton bierze z agile dokładnie to, co da się kupić fakturą: procesy, narzędzia i certyfikaty. Ludzi i interakcje zostawia w starych granicach. Ceremonie są, decyzje zapadają tam gdzie zawsze. Standupy są, eskalacja idzie starą drogą służbową. Retrospektywy są, a wnioski dotykające granic zespołów lądują w parkingu „poza naszym zasięgiem”, który jest parkingiem wyłącznie z nazwy, bo nic z niego nigdy nie wyjeżdża. Kult cargo w czystej postaci: wieża z bambusa stoi, słuchawki z kokosa założone, samoloty uparcie nie lądują.

Taka zwinność nie jest neutralna. Ona aktywnie szkodzi, bo produkuje artefakty, które wyglądają jak dowód poprawy - burndowny, velocity, raporty zgodności - podczas gdy problemy strukturalne, które miała obnażyć, zostają przykryte warstwą rytuału. W jaskini przybywa cieni, więc wszyscy widzą postęp. Maskowanie jest tańsze niż zmiana, więc system optymalizuje się w stronę maskowania.

Studium maskowania: podatność bez kontekstu

Najlepszym przykładem, jaki znam, jest zarządzanie podatnościami - bo tu cień da się pokazać na liczbach.

Bazowy wynik CVSS jest z definicji bezkontekstowy: opisuje podatność jako ideę, nie jej wcielenie w konkretnym środowisku uruchomieniowym. Do kontekstu służą metryki środowiskowe CVSS, prawdopodobieństwo exploitacji z EPSS, katalog realnie wykorzystywanych podatności CISA KEV i wreszcie VEX, którym producent lub operator stwierdza: ten komponent jest podatny, ale w tym produkcie podatny kod nie jest osiągalny.

Zabetonowana organizacja ignoruje to wszystko i wybiera regułę „critical = patch w 7 dni, wszędzie tak samo”. Po co komu kontekst, skoro jest liczba. Ta reguła ma jedną zaletę: nie wymaga odpowiedzi na niewygodne pytanie strukturalne - kto jest właścicielem ryzyka w kontekście platformy uruchomieniowej? Ocena, czy podatność jest exploitowalna w konkretnym środowisku, wymaga wiedzy, którą mają łącznie zespół aplikacyjny, zespół platformy i security. Beton nie ma miejsca, w którym te trzy zespoły podejmują wspólnie decyzję i wspólnie za nią odpowiadają. Więc zamiast decyzji jest reguła, a zamiast ryzyka jego cień: liczba przepisana z bazy. Reguła traktuje jednakowo odizolowany job wsadowy i wystawiony na świat serwis brzegowy - przepala budżet zespołów na patche bez znaczenia i rozmywa uwagę tam, gdzie ryzyko jest realne. Ale produkuje raport zgodności, a raport jest zielony.

Błędne rozumienie kontekstu podatności nie jest tu przyczyną - jest objawem. Organizacja nie myli się w ocenie ryzyka; organizacja nie ma gdzie tej oceny dokonać, więc zastąpiła ją cieniem oceny.

Podejście as-code odwraca to w naturalny sposób: deklaracje VEX żyją w repozytorium obok kodu, kontekst platformy (ekspozycja sieciowa, izolacja, profil runtime) jest zapisany w manifestach, a bramka policy-as-code (OPA, Kyverno) łączy wynik skanera (Trivy) z tym kontekstem i podejmuje decyzję, która jest wersjonowana, podpisana i podlega review. Nagle widać, kto zatwierdził uzasadnienie „kod niepodatny w tej ścieżce wykonania” - i widać, że taka decyzja wymaga podpisu dwóch zespołów. Spór o ownership, który beton latami zamiatał pod regułę SLA, staje się jawny.

rytuał as-code ryzyko realne: niewidoczne skaner lista CVE SLA: 7 dni, wszędzie raport zgodności skaner VEX + kontekst bramka policy decyzja w repo review: podpis zespołu aplikacyjnego + platformy - ownership jawny
Dwa przepływy obsługi tej samej podatności. Rytualny kończy się zielonym raportem zgodności, a realne ryzyko pozostaje niewidoczne. W przepływie as-code decyzja łączy wynik skanera z kontekstem platformy, trafia do repozytorium i wymaga podpisu obu zespołów, więc widać, kto wziął za nią odpowiedzialność.

Dlaczego EIAC uderza w beton

EIAC nie jest dla zabetonowanej organizacji kolejnym narzędziem - jest zagrożeniem egzystencjalnym dla mechanizmu maskowania. Kod jest odbiciem rzeczywistości, tak jak raport i ceremonia. Różnica polega na tym, że kod jest odbiciem, któremu można zmierzyć wierność:

  • Jest jawny. CODEOWNERS pokazuje, kto naprawdę jest właścicielem czego. Pipeline pokazuje, jak proces naprawdę wygląda - nie jak wygląda na slajdzie. Historia gita pokazuje, kto naprawdę podejmuje decyzje.
  • Jest egzekwowalny. Bramki policy nie da się przekonać na spotkaniu. Wyjątek od polityki musi zostać zapisany, a zapisany wyjątek ma autora i datę.
  • Jest porównywalny. Gdy proces jest kodem, różnice między zespołami przestają być folklorem („u nas się tak robi”) i stają się diffem, który można przeczytać.

Dlatego opór wobec EIAC prawie nigdy nie jest tym, czym się przedstawia. „Nasze systemy są zbyt specyficzne” i „jesteśmy zbyt krytyczni, żeby nas teraz obciążać” to rzadko argumenty techniczne - to obrona terytorium przed jawnością. Pisałem w normalizacji pracy, że platforma standaryzuje sposób pracy; beton rozumie to doskonale i dlatego się broni. Zespół, który latami budował pozycję na tym, że tylko on wie, jak działa jego fragment świata, traci tę pozycję w dniu, w którym jego proces staje się czytelnym artefaktem w repozytorium. W jaskini gaśnie projektor.

Z tego wynika pierwsza praktyczna zasada: nie diagnozuj oporu po treści argumentu, tylko po jego funkcji. Ten sam argument „jesteśmy wyjątkowi” może być prawdą techniczną, obiekcją kosztową, obroną statusu albo czystą grą o dźwignię - i każda z tych czterech wersji wymaga innego narzędzia.

Test na cień: zmutuj rzeczywistość

W inżynierii mamy narzędzie do mierzenia, czy testy strzegą zachowania, czy tylko wykonują kod: mutation testing (Stryker, mutmut, PIT). Pokrycie liniami jest cieniem - pokazuje, który kod się wykonał, nie które zachowanie jest chronione. Suite może pokrywać sto procent i nie weryfikować niczego. Mutation testing mierzy wierność odbicia wprost: zmutuj kod, a każdy mutant, którego testy nie zabiją, to zachowanie, które testy rzekomo chronią, a którego nie widzą.

Ten sam test działa na metryki organizacji i polecam go jako podstawowe narzędzie diagnostyczne w becie: zmutuj rzeczywistość i sprawdź, czy metryka to zauważy. Gdyby zespół brzegowy z mojej anegdoty po cichu przestał patchować realnie exploitowalne podatności - czy raport zgodności by drgnął? Nie drgnął; organizacja sprawdziła to empirycznie, choć nie nazwałaby tego eksperymentem. Gdyby zespół przestał dowozić wartość, ale dalej domykał tickety - czy velocity by spadło? Metryka, której nie rusza mutacja rzeczywistości, niczego nie strzeże. Jest ocalałym mutantem organizacji: kosztuje, wisi na dashboardzie i daje dokładnie zero informacji. Wartość metryki - jak wartość testu - mierzy się tym, co chroni w ujęciu biznesowym, nie tym, że świeci na zielono.

Cztery obiekcje, cztery narzędzia

Najczęstszy błąd wdrożeniowy, jaki widuję, to jedna odpowiedź na wszystkie cztery obiekcje: albo mandat („od Q3 wszyscy jadą as-code”), albo jedna zachęta („kto wejdzie, dostaje zasoby”). Mandat rozbija się o zespoły z dźwignią polityczną, a zachęta trafia głównie do tych, którzy weszliby i tak - klasyczna selekcja negatywna. Zamiast tego:

ObiekcjaCo naprawdę mówiNarzędzie
Realny mismatch techniczny„nasz kontekst faktycznie nie pasuje”jawny, wygasający wyjątek z kontraktem na interfejsie
Koszt„nie stać nas na migrację”platforma jako produkt: subsydium w pracy, nie w budżecie
Status„jesteśmy zbyt wyjątkowi na standard”współautorstwo standardu zamiast zwolnienia z niego
Dźwignia polityczna„spróbujcie nas zmusić”timing: audyt, incydent, odejście kluczowej osoby

Realny mismatch: wyjątek jako kod, nie jako przywilej. Są zespoły, dla których EIAC w pełnej formie naprawdę nie jest optymalny - i udawanie, że jest inaczej, podkopuje wiarygodność całego wdrożenia. Rozwiązaniem nie jest motywowanie ich, tylko jawny wyjątek z kontraktem: wnętrze zespołu może pozostać dowolne, ale wszystko, co zespół wystawia na zewnątrz, jest as-code - wersjonowane artefakty, zadeklarowane interfejsy, polityki na granicy. Wyjątek zapisuję jako decyzję architektoniczną (ADR) z datą przeglądu. Różnica między wyjątkiem a przywilejem jest dokładnie taka: wyjątek jest zapisany, ma uzasadnienie i wygasa; przywilej jest ustny, dziedziczony i wieczny jak szlachectwo. Beton żywi się przywilejami - wyjątki as-code go nie karmią.

Koszt: subsydium w pracy, nie w budżecie. Tu działa forma promocyjna: obniżenie kosztu posiadania plus dodatkowe zasoby na wejście. Ale struktura ma znaczenie. Subsydium przekazane jako budżet czy etaty zostanie skonsumowane bez zmiany zachowania - beton wchłania zasoby sprawniej niż cokolwiek innego, co robi. Subsydium w postaci pracy i narzędzi nie da się przekierować: squad migracyjny, który przenosi pipeline zespołu, gotowe moduły, onboarding robiony za zespół, a nie zlecany zespołowi. Do tego twardy time-box - promocja, która nie wygasa, staje się rentą. I warunek krytyczny: zanim promocja się skończy, przewaga kosztowa ścieżki as-code musi być realna i odczuwalna, bo inaczej po promocji nastąpi regres do starego.

Status: własność standardu bije zwolnienie ze standardu. Zespół krytyczny, który mówi „jesteśmy zbyt wyjątkowi”, często nie negocjuje kosztu - broni tożsamości. Rabat nie odpowiada na obronę tożsamości. Odpowiada na nią odwrócenie kierunku: zespół zostaje współautorem standardu, jego wzorce są nazwane, udokumentowane i upstreamowane jako moduły dla innych, jego wdrożenie jest referencyjne. Wyjątkowość zostaje - ale wewnątrz standardu, nie obok niego. To nie jest sztuczka socjotechniczna: zespoły krytyczne zwykle naprawdę mają najlepsze praktyki w organizacji i standard, który ich nie uwzględnia, jest po prostu gorszy.

Dźwignia polityczna: nie wygrasz argumentem, wygrasz momentem. Zespół, który wie, że organizacja nie może sobie pozwolić na konflikt z nim, nie wejdzie w EIAC ani za zachętę, ani pod mandatem. Wejdzie wtedy, gdy jego własna nieprzejrzystość go zaboli: audyt, którego nie da się przejść bez tygodni ręcznego zbierania dowodów; odejście osoby, która była jedyną dokumentacją procesu; incydent, którego postmortem pokazuje, że nikt nie wiedział, jak naprawdę wygląda ścieżka wdrożenia. Rolą wdrażającego nie jest wywoływanie tych momentów - przyjdą same, punktualnie jak audyt. Rolą jest bycie gotowym z ofertą, gdy przyjdą: „to, co was właśnie zabolało, w ścieżce as-code jest raportem z pipeline”.

Asymetria bez przymusu

Cztery narzędzia powyżej obniżają koszt wejścia. Druga połowa równania jest mniej przyjemna i częściej pomijana: przestań socjalizować koszt niewejścia. W większości organizacji zespoły poza standardem są de facto subsydiowane przez resztę - ktoś za nich zbiera dowody do audytu, ktoś utrzymuje ich wyjątki w narzędziach, ktoś ręcznie integruje ich artefakty. To jest ukryta renta betonu.

Bez żadnego mandatu można tę rentę wygasić: kto nie jest na ścieżce as-code, sam produkuje dowody zgodności, sam utrzymuje swoje integracje, sam odpowiada przed audytorem. Nie jest to kara - jest to urealnienie kosztów, które dotąd ponosili inni. Promocja obniża koszt adopcji, urealnienie podnosi koszt odmowy; obie dźwignie działają jednocześnie i żadna nie wymaga przymusu.

Ostatni element: dowód społeczny. Beton jest odporny na argumenty centrali, ale słabo znosi dane sąsiadów. Mierz efekty adopcji wynikami, nie deklaracjami - czas przygotowania do audytu, lead time zmiany, czas onboardingu nowej osoby do zespołu - i publikuj te liczby wewnętrznie. Zespół, który przez trzy kwartały patrzy, jak sąsiedzi przechodzą audyt w dwa dni zamiast trzech tygodni, w końcu przychodzi sam. Nie dlatego, że przegrał spór. Dlatego, że spór przestał być potrzebny.

Puenta

Zabetonowana organizacja nie boi się EIAC dlatego, że to nowa technologia. Boi się dlatego, że kod jest pierwszym standardem w jej historii, którego nie da się wdrożyć rytualnie. Agile dało się odegrać - tablice wiszą, ceremonie się odbywają, struktura stoi nietknięta. Pipeline’u nie da się odegrać: albo bramka jest w kodzie i decyzje są jawne, albo jej nie ma i to też widać.

Dlatego jeśli wdrażasz EIAC w takiej organizacji, nie planuj walki o technologię, bo tej walki nie będzie. Planuj na to, że każdy argument techniczny, który usłyszysz, jest opakowaniem na jeden z czterech oporów strukturalnych - i miej dla każdego z nich osobne narzędzie. A tam, gdzie usłyszysz, że proces działa i metryki są zielone, zaproponuj mutację: wyłączcie na tydzień to, co proces podobno chroni, i zobaczcie, czy metryki zauważą. Cisza po tej propozycji powie Ci więcej niż wszystkie raporty zgodności razem wzięte.