
인프라를 코드(IaC)로 스캔하여 일반적인 취약점을 찾는 서비스
코드형 인프라(Infrastructure as Code)에서 일반적인 취약점을 스캔하는 서비스입니다.
| Aspect | Information |
|---|---|
| Tool name | IaC Scan Runner |
| Docker image | xscanner/runner |
| PyPI package | iac-scan-runner |
| Documentation | docs |
| Contact us | [email protected] |
IaC Scan Runner는 IaC(Infrastructure as Code) 패키지를 스캔하고 다양한 코드 검사를 수행하여 가능한 취약점과 개선 사항을 찾는 REST API 서비스입니다. 자세한 내용은 docs를 참조하세요.
이 섹션에서는 REST API를 실행하는 방법을 설명합니다.
공개 xscanner/runner Docker 이미지를 사용하여 다음과 같이 REST API를 실행할 수 있습니다.
# Docker 컨테이너에서 IaC Scan Runner REST API를 실행하고
# localhost:8080/swagger 또는 localhost:8080/redoc로 이동
$ docker run --name iac-scan-runner -p 8080:80 xscanner/runner
또는 로컬에서 이미지를 빌드하여 실행할 수도 있습니다.
# Docker 컨테이너 빌드 (시간이 다소 소요됨)
$ docker build -t iac-scan-runner .
# Docker 컨테이너에서 IaC Scan Runner REST API를 실행하고
# localhost:8080/swagger 또는 localhost:8080/redoc로 이동
$ docker run --name iac-scan-runner -p 8080:80 iac-scan-runner
IaC Scan Runner CLI를 사용하여 실행하려면:
# CLI 설치
$ python3 -m venv .venv && . .venv/bin/activate
(.venv) $ pip install iac-scan-runner
# OpenAPI 사양 출력
(.venv) $ iac-scan-runner openapi
# 필수 구성 요소 설치
(.venv) $ iac-scan-runner install
# IaC Scan Runner REST API 실행
(.venv) $ iac-scan-runner run
소스에서 로컬로 실행하려면:
# 환경 변수 내보내기
export MONGODB_CONNECTION_STRING=mongodb://localhost:27017
export SCAN_PERSISTENCE=enabled
export USER_MANAGEMENT=enabled
# MongoDB 설정
$ docker run --name mongodb -p 27017:27017 mongo
# 필수 구성 요소 설치
$ python3 -m venv .venv && . .venv/bin/activate
(.venv) $ pip install -r requirements.txt
(.venv) $ ./install-checks.sh
# IaC Scan Runner REST API 실행 (코드 변경 사항을 적용하려면 --reload 플래그 추가)
(.venv) $ uvicorn src.iac_scan_runner.api:app
이 부분에서는 가능한 배포 방법 중 하나와 API 호출 사용법에 대한 간단한 예제를 보여줍니다.
먼저 iac scan runner 저장소를 클론하고 API를 실행합니다.
$ git clone https://github.com/xlab-si/iac-scan-runner.git
$ docker compose up
이 작업이 완료되면 localhost:8000을 호출하여 다양한 API 엔드포인트를 사용할 수 있습니다. 또한 localhost:8000/swagger 또는 localhost:8000/redoc로 이동하여 모든 API 엔드포인트를 테스트할 수 있습니다. 이 예제에서는 curl을 사용하여 API 엔드포인트를 호출합니다.
curl -X 'POST' \
'http://0.0.0.0/project?creator_id=test' \
-H 'accept: application/json' \
-d ''
프로젝트 ID가 반환됩니다. 이 예제에서 프로젝트 ID는 1e7b2a91-2896-40fd-8d53-83db56088026입니다.
curl -X 'PUT' \
'http://0.0.0.0:8000/projects/1e7b2a91-2896-40fd-8d53-83db56088026/checks/ansible-lint/disable' \
-H 'accept: application/json'
curl -X 'POST' \
'http://0.0.0.0:8000/projects/1e7b2a91-2896-40fd-8d53-83db56088026/scan?scan_response_type=json' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F '[email protected];type=application/zip'
끝입니다.
어떤 시점에서는 IaC 표준 및 프로젝트 유형의 더 넓은 범위를 제공하기 위해 스캔 워크플로에 새 검사 도구를 포함해야 할 수 있습니다. 따라서 이 하위 섹션에서는 그 목적을 위한 필요한 단계의 순서를 식별하고 설명합니다. 그러나 단계는 설명된 대로 수동으로 수행해야 하며, 향후 API를 통해 이 절차를 자동화하고 사용자가 스캔 워크플로를 구성하는 사용 가능한 카탈로그의 일부가 될 새 도구를 가져올 때 도움을 주는 사용자 친화적인 인터페이스를 제공할 계획입니다. 그림 16은 스캔 워크플로를 새 도구로 확장하기 위해 수행해야 하는 필요한 단계를 보여줍니다.
1단계 – checks 디렉토리에 도구별 클래스 추가 먼저 IaC Scan Runner의 소스 코드 내 checks 디렉토리에 새 도구별 Python 클래스를 추가해야 합니다. iac-scan-runner/src/iac_scan_runner/checks/new_tool.py 새 도구의 클래스는 기존 Check 클래스를 상속하며, 이는 스캔 워크플로 도구의 일반화를 제공합니다. 또한 다음 메서드의 구현을 제공해야 합니다.
2단계 – ScanRunner 생성자 내에 검사 도구 클래스 인스턴스 추가 Check에서 파생된 새 클래스가 IaC Scan Runner의 소스 코드에 추가되면, 메인 클래스인 ScanRunner의 소스 코드도 수정해야 합니다. 이 클래스의 수정과 관련하여, 먼저 도구별 클래스를 가져오고, 새 검사 도구별 클래스 인스턴스를 생성한 후 def init_checks(self) 내의 IaC 검사 사전에 추가해야 합니다. A. 검사 도구 클래스 가져오기 from iac_scan_runner.checks.tfsec import TfsecCheck B. init_checks 내에서 검사 도구 객체의 새 인스턴스 생성 """사전 정의된 검사 객체 초기화""" new_tool = NewToolCheck() C. init_checks 내의 self.iac_checks 사전에 추가
self.iac_checks = {
new_tool.name: new_tool,
…
}
3단계 – Compatibility 클래스 내 호환성 매트릭스에 검사 도구 추가 반면에, src/iac_scan_runner/compatibility.py 파일 내에서 호환성 매트릭스를 나타내는 사전도 확장해야 합니다. 두 가지 가능한 경우가 있습니다: a) 새 파일 유형을 키로 추가하고 값으로 관련 도구 목록을 추가, b) 기존 파일 유형에 대한 호환성 목록에 새 도구를 추가.
compatibility_matrix = {
"new_type": ["new_tool_1", "new_tool_2"],
…
"old_typeK": ["tool_1", … "tool_N", "new_tool_3"]
}
4단계 – 결과 요약 지원 제공 마지막으로, 스캔 워크플로 확장을 위한 필수 수정 순서의 마지막 단계는 ResultsSummary 클래스(src/iac_scan_runner/results_summary.py)를 수정하는 것입니다. 정확하게는, 검사 통과 여부를 식별하는 데 사용할 수 있는 도구별 문자열을 찾기 위해 summarize_outcome 메서드에 코드 일부를 추가해야 합니다. 호환되는 검사를 순회하는 루프 내에서 각 새 도구에 대해 다음과 같은 if-else 구조를 포함해야 합니다.
if check == "new_tool":
if outcome.find("Check pass string") > -1:
self.outcomes[check]["status"] = "Passed"
return "Passed"
else:
self.outcomes[check]["status"] = "Problems"
return "Problems"
이 저작물은 Apache License 2.0에 따라 라이선스가 부여됩니다.
xOpera 팀에 문의하려면 [email protected]로 이메일을 보내주세요.
이 프로젝트는 유럽 연합의 Horizon 2020 연구 혁신 프로그램에 따라 Grant Agreement No. 101000162 (PIACERE)의 자금을 지원 받았습니다.