Snyk: 컨테이너 및 애플리케이션 보안 취약점 분석 전문 도구
Snyk는 컨테이너 및 애플리케이션 패키지 내의 취약점뿐만 아니라, 인프라 구성 파일 코드의 취약점 분석에 특화된 도구입니다. Snyk는 클라우드 플랫폼을 기반으로 다양한 제품을 제공합니다.
Snyk는 오픈소스 프로젝트의 경우 CLI를 통해 Git 워크플로우에 통합됩니다. 소프트웨어 실행 시 취약점을 탐지하고, 심각도에 따라 분류하여 사용자에게 알려주며, 알려진 보안 오류를 자동 수정하는 기능을 제공합니다. 이러한 기능은 풀 리퀘스트 단계에 통합되어 리포지토리로 전송되는 코드에 적용될 수 있습니다.
Snyk Infrastructure as Code는 JSON 및 YAML Kubernetes 구성 파일에서 취약점을 분석하고 수정합니다. 규칙 엔진을 통해 관리자는 Git 리포지토리 내에서 탐지 민감도를 사용자 정의 매개변수에 따라 설정할 수 있습니다.
Snyk Container는 Docker 이미지와 관련된 레지스트리를 생성할 때와 그 이후에도 테스트를 수행할 수 있게 해줍니다. CLI, SCM, CI 도구, 컨테이너 레지스트리 및 Kubernetes와 통합이 가능합니다.
이제 Docker와 함께 제공되는 Snyk Container를 사용하여 취약점을 탐지하는 방법을 자세히 알아보겠습니다.
샘플 Dockerfile 예시
Snyk를 사용한 취약점 검사를 위해서는 먼저 Docker 이미지가 필요합니다. 다음은 예시로 사용할 Docker 이미지 구성입니다.
FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt EXPOSE 8000 CMD ["python", "app.py"]
이미지를 로컬에서 생성하려면 다음 명령을 사용합니다.
docker build -t 0xyz0/python-app .
이제 분석할 이미지가 준비되었습니다.
Docker 클라이언트에서 이미지 스캔 실행
Snyk 서비스가 Docker와 통합되어 있어 프로세스가 매우 간단합니다. 스캔을 시작하려면 다음 명령어를 실행하면 됩니다.
docker scan 0***0/python-app
이 명령어는 발견된 취약점에 따라 상세한 분석 결과를 출력하며, 최종 요약 보고서를 제공합니다.
Docker 스캔 결과는 발견된 취약점의 수뿐만 아니라, 각 취약점의 내용과 심각도 수준을 자세히 보여줍니다. 또한, 사용해야 할 기본 이미지에 대한 권장 사항도 제공합니다.
각각의 취약점에 대한 자세한 정보는 Snyk 취약점 데이터베이스에서 확인할 수 있습니다.
예시의 경우, 몇 가지 대안이 제시되었으므로 Dockerfile을 수정하여 더 안전한 기본 이미지로 변경해보겠습니다.
FROM python:3.7.11-slim ADD . /code WORKDIR /code RUN pip install -r requirements.txt EXPOSE 8000 CMD ["python", "app.py"]
수정된 Dockerfile을 사용하여 이미지를 다시 빌드하고 스캔해보면:
docker build -t 0***0/python-app . && docker scan 0***0/python-app
이제 출력 결과에 표시되는 취약점 수가 줄어들었고, 더 안전한 기본 이미지를 사용하고 있음을 확인할 수 있습니다.
Docker 스캔을 통해 가장 안전한 기본 이미지를 사용하고 있는지 확인할 수 있습니다.
Dockerfile을 명령에 추가하면 더 자세한 보고서를 얻을 수 있습니다.
docker scan -f Dockerfile 0***0/python-app
분석에서 기본 이미지를 제외하고, 문제 발생 지점에 집중하고 싶다면 다음 명령을 사용합니다.
docker scan -f Dockerfile --exclude-base 0***0/python-app
Snyk 서비스는 Docker Hub 리포지토리와도 통합할 수 있습니다.
이 기능을 사용하려면 유료 구독이 필요하지만, 무료 요금제 (검색 제한 있음)로 Docker Hub에 로그인하여 로컬에서 시작할 수 있습니다.
Github Actions와 함께 Snyk 사용하기
먼저 저장소를 만들고, 다음 경로에 폴더를 생성합니다.
.github / worflows /
Github에서 Snyk Container를 사용하려면 새 이미지를 만들거나 Docker Hub에 있는 이미지를 가져와야 합니다. Snyk를 사용하기 위해서는 ‘SNYK_TOKEN’이라는 새로운 시크릿을 생성해야 하며, 토큰을 얻기 위해서는 Snyk에 계정을 생성해야 합니다. API 토큰은 계정 설정에서 쉽게 생성할 수 있습니다.
생성된 토큰을 Github Secrets에 저장하면, Action에서 토큰을 사용할 수 있습니다. 그 다음에는 Docker Hub에 생성된 저장소 이름을 전달하고, 보낼 메시지를 정의해야 합니다. 메시지에서 단계 출력의 변수를 활용할 수 있습니다.
with: args: '새 커밋이 푸시되었습니다. Github Action을 확인해주세요: | 워크플로우 URL: $ {{fromJson (steps.repo.outputs.result) .html_url}} / actions | 실행 시간: $ {{steps.prep.outputs.created}} | 버전: $ {{steps.prep.outputs.version}} '
전체 워크플로를 실행하려면 Master 브랜치를 푸시하면 됩니다. Github Action은 .github/workflows/ 경로에 있는 파일을 자동으로 감지합니다.
결론
컨테이너 사용이 증가함에 따라 보안 침해 사고가 더욱 빈번해지고 있으며, 대부분은 컨테이너 배포 시 잘못된 구성 오류로 인해 발생합니다. Snyk는 잘못된 구성 오류를 예방하고, Docker 이미지에서 가장 일반적인 취약점을 효율적이고 간단하게 감지할 수 있도록 도와주는 도구입니다.