Popełniając wpis na temat rejestru dockerowego, zrobiłem sobie przegląd poprzednich wpisów. Dotarło do mnie, że w sumie, przedstawiając mój pomysł na lab, nie przedstawiłem go do końca. Zabrakło obrazka jak widzę całość rozwiązania, chociażby z lotu wróbelka. Po drugie, primo - w tzw. międzyczasie, zmieniłem plany co do GitLaba-CE. Skoro od dłuższego czasu korzystam z GitHuba, to czas najwyższy zacząć używać ostatnio wdrożone funkcjonalności, jak: skanowanie kodu, mechanizm analizy zależności Dependabot
i last, but not least.. GitHub Actions na lokalnie zainstalowanym GitHub runnerze.
W ten sposób, platforma GitHuba zapewni mi niemal kompletny CI, poza linterami, SonarQubem, trivy i ZAProxy. Te będę miał u siebie, tak samo jak CD - klaster trio Hashicorpowego - Nomad, Consul, Vault. Natomiast, “lokalność” githubowego runnera zapewni mi pełną dostępność do lokalnych komponentów przy pomocy kodu GitHub Actions.
Obrazek całości wygląda więc tak:
Proszę o jeszcze 3 minuty uwagi, postaram się zwięźle objaśnić ten makaron powyżej.
Założenia
Założenia do konstrukcji tego labu, są następujące:
- Budowa i
deployment
webowych aplikacji skonteneryzowanych; - Bezpieczeństwo badane jest wielowarstwowo:
- kod i zależności,
- docker i OS,
- logika biznesowa aplikacji (poprzez UI),
- W miarę modułowa budowa labu, tak aby można było szybko uruchomić potok wytwórczy (ang.
pipeline
) dokładając do niego kolejne elementy i komplikując życie pracującemu nad kodem. - Platforma CD wolna od komponentów CI - tzn. aby się nie zapętlić i nie zacząć walczyć o zasoby, komponenty CI - są albo w GitHubie albo instalowane na VMkach lokalnie. (Wyjątkiem jest rejestr dockerowy, dla którego osobna VMka to spory
overkill
) - Szczupłość zasobów powoduje, że platforma CD to tylko jeden klaster - a nie co najmniej, dwa -
dev/test
iprod
.
No to lecimy..
- Na początku było słowo, a więc kod.. leci
commit
do GitHuba. - Zdefiniowane w YAMLu
post-commit-checks
sprawdzają składnię, poprawność, w drobnym zakresie nawet bezpieczeństwo, są to głównie lintery: Hadolint dla dockera, Pylint dla pythona, ESlint dla JS/TS, może shellcheck. - Kolejny YAML GH Action-a zabiera się za wykonanie testów jednostkowych na zrealizowanej zmianie w kodzie i melduje wyniki do SonarQuba.
- Jeśli
jest
jest Ok, zabieramy się za budowanie aplikacji. - Zbudowane obrazy aplikacji czy dowolne inne są skanowane przez (AquaSecurity) Trivy odpalanego na zawołanie z kontenera trivy-cli. Sam skaner będzie zainstalowany jako osobna VMka albo usługa na już istniejącej.
- Jeszcze nie przyjrzałem się jak to się robi, ale jeśli będzie można - to - jeśli wykryte zostaną podatności
HIGH+
, budowa zakończy się niepowodzeniem i stosownym komunikatem. - Obraz “czysty” pobierany jest przez stosowną automatykę GH, do testowego
deploymentu
na Nomadzie. Tu wydarzy się testowanie UI-a skryptami cypressowymi, a na koniec jako pen-smoke-test wjedzie ZAProxy. Scenariusze testowe cypressa, jak i polityki skanowania ZAPem, będą częścią tego samego repozytorium. - I ten ostatni krok właściwie -
deployment
produkcyjny, na początku zrobiłbym ręcznie (proszę mnie nie bić!). A to dlatego, że właściwie, to jeszcze nie wiem czego się spodziewać po testach cypressowych i ZAPowych i jakie kryteria przyjąć.
I to tyle, czas pokaże - czy dość, czy nie-dość to ambitne. Pozostaje mi jeszcze wcisnąć gdzieś Grafanę/Loki, a póki co wystarczą natywne logi i UI Nomada, Consula i tryb audit
vaulta.