Integracja Snyk i Bitbucket Pipelines w celu wdrażania kultury DevSecOps

Wdrażaj kulturę DevSecOps poprzez integrację rozwiązania Snyk z systemami Bitbucket Pipelines i Jira.
Czas
5 minut czytania.
Publiczność
Programiści, zespoły ds. zabezpieczeń/aplikacji oraz inżynierowie DevOps/DevSecOps.
WARUNEK WSTĘPNY
Masz konto Snyk. Zacznij tutaj.
Masz konto Atlassian Bitbucket. Zaloguj się tutaj lub zacznij tutaj.
W tym samouczku opisano, jak zabezpieczyć przepływ pracy przy kompilacji w Bitbucket Pipelines za pomocą rozwiązania Snyk. Ważnym krokiem w zabezpieczeniu środowiska jest skanowanie i analizowanie zarówno aplikacji, jak i projektu kontenera opartego na systemie Linux pod kątem znanych luk w zabezpieczeniach, co ułatwia identyfikację i niwelowanie takich luk. Ćwiczenia przedstawione w tym samouczku pomogą zabezpieczyć aplikację i kontener za pomocą aplikacji Snyk Pipe for Bitbucket Pipelines przeznaczonej do skanowania pliku manifestu aplikacji i obrazu bazowego kontenera pod kątem ich zależności.
Samouczek Jak Snyk i Bitbucket Cloud umożliwiają tworzenie kultury DevSecOps dotyczył przede wszystkim zależności aplikacji. Jednak skanowanie obrazu bazowego kontenera pozwala również wykryć:
pakiety systemu operacyjnego (OS) zainstalowane i zarządzane przez menedżera pakietów,
kluczowe pliki binarne — warstwy, które nie zostały zainstalowane za pośrednictwem menedżera pakietów.
Na podstawie tych wyników system Snyk udziela porad i wskazówek, przedstawiając między innymi:
pochodzenie luk w zabezpieczeniach w pakietach systemu operacyjnego i kluczowych plikach binarnych,
szczegóły uaktualnień obrazu bazowego lub zalecenie ponownej kompilacji obrazu,
warstwę pliku Dockerfile zawierającą pakiet, którego dotyczy problem,
stałą wersję pakietów systemu operacyjnego i kluczowych plików binarnych.
Skanowanie aplikacji w systemie Bitbucket Pipeline
Plik bitbucket-pipelines.yml definiuje Twoją konfigurację kompilacji Bitbucket Pipelines. Jeśli jesteś nowym użytkownikiem Bitbucket Pipelines, tutaj dowiesz się więcej na temat rozpoczęcia pracy.
Ten samouczek zawiera przykładowy plik bitbucket-pipelines.yml zawierający poszczególne kroki zmapowane do przepływu pracy. Zaczniemy od przeskanowania aplikacji, skompilowania obrazu kontenera Docker, a następnie przeskanowania tego obrazu kontenera. Poniżej przedstawiono szczegóły dotyczące etapu skanowania aplikacji:
scan-app: &scan-app
- step:
name: "Scan open source dependencies"
caches:
- node
script:
- pipe: snyk/snyk-scan:0.4.3
variables:
SNYK_TOKEN: $SNYK_TOKEN
LANGUAGE: "npm"
PROJECT_FOLDER: "app/goof"
TARGET_FILE: "package.json"
CODE_INSIGHTS_RESULTS: "true"
SEVERITY_THRESHOLD: "high"
DONT_BREAK_BUILD: "true"
MONITOR: "false"W tym przykładzie przeprowadzono skanowanie aplikacji przy użyciu pipe'u Snyk Scan w pipeline'ie. Źródło zawiera pełną definicję YAML wszystkich obsługiwanych zmiennych, ale do wykonania tej czynności niezbędne są tylko te, które zawarto w przedstawionym fragmencie kodu.
Przyjrzyjmy się teraz kilku z nich:
1. SNYK_TOKEN przekazywany jest do pipe'u jako zmienna repozytorium zdefiniowana uprzednio w module konfiguracji [Bitbucket Configuration].
2. PROJECT_FOLDER to zmienna oznaczająca folder, w którym znajduje się projekt i zazwyczaj jest to folder domyślny zapisu projektu. Jednak w tym przykładzie możemy ustawić folder app/goof i przekazać zapis jako artefakt do innych kroków w innych pipeline'ie.
3. CODE_INSIGHTS_RESULTS domyślnie przyjmuje wartość false. Jednak chcemy utworzyć raport Code Insight zawierający wyniki testu Snyk, dlatego trzeba ustawić dla tej zmiennej wartość true.
4. SEVERITY_THRESHOLD to zmienna zwracająca zgłoszenia o zadanym lub wyższym od zadanego poziomie. Wartość domyślna to low. Jednak w tym przypadku interesuje nas wyłącznie wartość high, dlatego trzeba odpowiednio zdefiniować tę zmienną.
5. Domyślna wartość zmiennej DONT_BREAK_BUILD to false i wartość ta jest oczekiwana. W normalnych okolicznościach należy przerwać kompilację w razie wykrycia problemów. Jednak na potrzeby tego ćwiczenia ustaw dla tej zmiennej wartość true.
Za pomocą nowej aplikacji Snyk Security Connect dostępnej w sklepie Atlassian Marketplace można uruchomić skanowanie zabezpieczeń Snyk na pull requestach, a następnie wyświetlić wyniki w aplikacji Code Insights. Rozpoczęcie pracy jest łatwe, a do zainstalowania aplikacji wystarczy kilka kliknięć.
Skanowanie obrazów kontenerów

Do 2022 roku ponad 75 procent organizacji globalnych będzie korzystało ze skonteneryzowanych aplikacji w środowisku produkcyjnym (Gartner). Powszechnemu wdrażaniu tego rodzaju rozwiązania towarzyszył gwałtowny wzrost liczby luk w zabezpieczeniach kontenerów. W 2018 roku odnotowano czterokrotny wzrost liczby zgłaszanych luk w zabezpieczeniach systemów operacyjnych. Mimo to 80 procent programistów twierdzi, że nie testuje swoich obrazów kontenerowych w trakcie prac programistycznych. Twierdzą, że nie należy to do ich obowiązków lub są przyzwyczajeni, że ktoś na dalszych etapach procesu wychwytuje błędy, co w przypadku dynamicznie rozwijających się firm utrudnia skalowanie bezpieczeństwa kontenerów.
Skanowanie obrazu kontenerów w Twoim pipeline'ie
Podobnie jak w poprzedniej sekcji dotyczącej skanowania aplikacji, tak i tutaj skoncentrujemy się na skonfigurowaniu pliku bitbucket-pipelines.yml pod kątem kompilacji obrazu kontenera Docker na potrzeby aplikacji, skanowaniu obrazu oraz wypychaniu tego obrazu do rejestru. Poniżej bardziej szczegółowo opisano etap skanowania obrazu kontenera:
scan-push-image: &scan-push-image
- step:
name: "Scan and push container image"
services:
- docker
script:
- docker build -t $IMAGE ./app/goof/
- docker tag $IMAGE $IMAGE:${BITBUCKET_COMMIT}
- pipe: snyk/snyk-scan:0.4.3
variables:
SNYK_TOKEN: $SNYK_TOKEN
LANGUAGE: "docker"
IMAGE_NAME: $IMAGE
PROJECT_FOLDER: "app/goof"
TARGET_FILE: "Dockerfile"
CODE_INSIGHTS_RESULTS: "true"
SEVERITY_THRESHOLD: "high"
DONT_BREAK_BUILD: "true"
MONITOR: "false"W przykładzie przedstawiono kompilację obrazu kontenera, jego otagowanie, a następnie przeprowadzenie jego skanowania za pomocą pipe'u Snyk Scan w pipeline'ie. Zachowaj te same wartości dla zmiennych CODE_INSIGHTS_RESULTS, SEVERITY_THRESHOLD i DONT_BREAK_BUILD. Przykład przekazuje również kilka dodatkowych obsługiwanych zmiennych właściwych dla pipe'u Snyk, które pozwalają zinterpretować żądanie jako skanowanie obrazu kontenera, a nie skanowanie aplikacji. Operacje są następujące: ustawienie dla zmiennej LANGUAGE opcji docker, zadeklarowanie nazwy w zmiennej IMAGE_NAME oraz przekazanie odpowiedniej zmiennej repozytorium, a także ustawienie dla zmiennej TARGET_FILE wartości Dockerfile.
Twój pipeline przeskanuje teraz obraz kontenera pod kątem znanych luk w zabezpieczeniach, a także kod aplikacji.
Zobacz więcej integracji dla Atlassian Open DevOps