종속성
종속성 그래프란 무엇인가요?
종속성 그래프는 소프트웨어가 의존하는 모든 패키지와 각 패키지를 끌어온 패키지를 나타냅니다. 목록은 소프트웨어에 무엇이 들어 있는지 알려 줍니다. 그래프는 그것이 왜 거기에 있고 무엇과 연결되는지 알려 주며, 이는 취약점이 발생했을 때 가장 먼저 떠오르는 질문입니다.
업데이트
노드, 간선, 경로
종속성 그래프에서 각 패키지는 노드이고, 각 "의존" 관계는 한 패키지에서 다른 패키지로 이어지는 간선입니다. 프로젝트가 맨 위에 있습니다. 직접 종속성은 간선 하나 거리에 있고, 전이적 종속성은 그보다 아래에 있는 모든 것입니다. 프로젝트에서 어떤 패키지까지 이어지는 경로가 그 패키지의 종속성 경로이며, 한 패키지에 경로가 여러 개 있을 수 있습니다.
그래프, 트리, 목록
같은 종속성을 세 가지 방식으로 보여 줄 수 있으며, 각 방식은 서로 다른 질문에 답합니다.
| 보기 방식 | 보여 주는 것 | 잃는 것 |
|---|---|---|
| 평면 목록 | 모든 패키지를 버전과 함께 한 번씩 | 각 패키지가 왜 있는지 |
| 트리 | 패키지 관리자가 출력하는 대로, 프로젝트에서 시작하는 모든 경로 | 공유 패키지가 반복되어 트리가 실제보다 크게 보임 |
| 그래프 | 모든 패키지를 한 번씩, 각 상위 패키지에서 이어지는 간선과 함께 | 뷰어 없이 눈으로 읽기 어려움 |
그래프가 중요한 이유는 공유 패키지에 있습니다. 두 종속성이 같은 패키지를 필요로 하면 다이아몬드, 즉 상위 패키지가 두 개인 노드 하나가 생깁니다. 이 패키지의 취약점을 고치려면 두 경로를 모두 알아야 합니다. 어느 상위 패키지든 이전 버전을 고정할 수 있기 때문입니다.
종속성 그래프의 용도
- 수정 경로 찾기. 취약한 전이적 패키지는 그 경로에 있는 무언가를 업그레이드하거나 재정의해 수정합니다. 그래프는 어떤 직접 종속성을 옮겨야 하는지 보여 줍니다.
- 영향 범위 측정. 보안 권고가 발표되면 그래프는 어떤 직접 종속성, 서비스, 제품이 영향을 받는 패키지로 이어지는지 보여 줍니다.
- 라이선스 검토. 그래프 깊숙이 있는 카피레프트 라이선스도 맨 위에 있는 라이선스와 똑같이 적용되며, 경로를 보면 어떤 종속성이 이를 들여왔는지 알 수 있습니다.
- 업그레이드 계획. 한 패키지의 메이저 업그레이드는 그 아래의 모든 것을 바꿉니다. 그래프는 트리의 얼마만큼이 바뀌는지 보여 줍니다.
- 위험 집중 파악. 많은 경로가 지나가는, 작고 유지 관리되지 않는 패키지는 단일 장애 지점입니다.
종속성 그래프를 얻는 방법
패키지 관리자에서. 모든 패키지 관리자는 해석된 트리를 출력하며, 대부분은 특정 패키지가 왜 있는지 설명할 수 있습니다. 전이적 종속성 페이지에 npm, pnpm, Python, Go, Rust, Maven, Gradle 명령어가 정리되어 있습니다.
GitHub에서. 리포지토리 Insights 탭의 종속성 그래프는 리포지토리의 매니페스트와 잠금 파일, 그리고 종속성 제출 API로 제출된 종속성을 요약한 것입니다. 지원되는 생태계에서는 각 종속성을 끌어온 전이 경로를 보여 주며, 그래프를 SBOM으로 내보낼 수도 있습니다.
SBOM에서. CycloneDX는 그래프를 dependencies 섹션에 기록하며, 여기서 각 구성 요소는 자신이 의존하는 것을 나열합니다. SPDX는 패키지 간의 DEPENDS_ON 관계를 사용합니다. Express 앱 일부의 CycloneDX 그래프는 다음과 같습니다.
"dependencies": [
{ "ref": "my-app", "dependsOn": ["express"] },
{ "ref": "express", "dependsOn": ["body-parser", "send"] },
{ "ref": "body-parser", "dependsOn": ["raw-body", "debug"] },
{ "ref": "send", "dependsOn": ["mime-types", "debug"] }
] 여기서 debug는 두 상위 패키지 아래에 나타납니다. 다이아몬드입니다. 많은 SBOM이 관계를 생략하고 구성 요소만 나열하는데, 그러면 목록은 남지만 경로는 모두 사라집니다.
그래프의 품질은 원천에 달려 있습니다
대부분의 종속성 그래프는 매니페스트와 잠금 파일로 만들어지므로, 패키지 관리자가 계획한 트리를 보여 줍니다. CI 캐시에서 복원된 패키지, 설정 단계에서 설치된 빌드 도구, 설치 스크립트와 다운로드로 가져온 코드는 보여 주지 않으며, 빌드가 잠금 파일 그대로 설치했는지도 알 수 없습니다. 잠금 파일이 출시된 내용의 기록이 아닌 이유를 참고하세요.
CRACI의 종속성 그래프
CRACI는 빌드 자체에서 그래프를 만듭니다. CRACI는 각 작업이 가져오는 모든 패키지를 트리의 모든 깊이에서, CI 캐시에서 복원된 패키지까지 포함해 기록하는 GitHub Actions 러너이며, 그 결과를 자체 완전성을 명시하는 SBOM으로 남깁니다.
- SBOM의 그래프 보기. 종속성 보기는 SBOM의 종속성 계층을 Pivot, Graph, Blob, Chord, Sunburst 보기로 보여 주며, 깊이와 심각도 필터를 제공합니다.
- 전체 트리를 담은 내보내기. CycloneDX 및 SPDX 내보내기에는 전이적 종속성이 각각의 선언된 라이선스와 함께 포함됩니다.
- 시간에 따른 영향받는 빌드. 새로운 취약점이 발표되면 빌드 기록을 통해 과거의 어떤 빌드에 취약한 패키지가 직접 또는 전이적으로 포함되었는지 확인할 수 있습니다.
CRACI의 SBOM 생성을 살펴보거나, 데모를 예약해 직접 실행한 빌드의 그래프를 탐색해 보세요.
종속성 그래프: 자주 묻는 질문
종속성 그래프란 무엇인가요?
종속성 그래프는 소프트웨어가 의존하는 모든 패키지를 나타낸 지도로, 각 패키지에서 그 패키지가 필요로 하는 패키지로 화살표가 이어집니다. 소프트웨어에 무엇이 들어 있는지뿐 아니라 왜 들어 있는지, 즉 코드에서 각 전이적 종속성까지 이어지는 경로를 보여 줍니다.
종속성 트리와 종속성 그래프는 어떻게 다른가요?
트리는 각 경로를 따로 보여 주므로, 두 상위 패키지가 필요로 하는 패키지는 두 번 나타납니다. 그래프는 각 패키지를 한 번만 보여 주고, 그 패키지를 필요로 하는 모든 상위 패키지에서 간선을 잇습니다. 패키지 관리자는 읽기 쉬운 트리를 출력하고, 영향을 분석하는 도구는 그래프를 다룹니다.
SBOM에는 종속성 그래프가 포함되나요?
포함될 수 있습니다. CycloneDX에는 각 구성 요소가 의존하는 구성 요소를 나열하는 dependencies 섹션이 있고, SPDX는 같은 내용을 DEPENDS_ON 관계로 표현합니다. 하지만 많은 SBOM이 관계를 생략하고 구성 요소만 나열하므로 경로가 사라집니다.
GitHub 리포지토리의 종속성 그래프는 어떻게 확인하나요?
리포지토리의 Insights 탭을 열고 Dependency graph를 선택하세요. GitHub는 리포지토리의 매니페스트와 잠금 파일, 그리고 종속성 제출 API로 제출된 정보로 그래프를 만들며, 지원되는 생태계에서는 각 전이적 종속성을 끌어온 경로를 보여 줍니다.
다이아몬드 종속성이란 무엇인가요?
두 종속성이 같은 패키지에 의존해 그래프가 다이아몬드 모양을 이루는 경우입니다. 두 종속성이 서로 호환되지 않는 버전을 필요로 하면 패키지 관리자는 사본 두 개를 설치하거나 실패해야 합니다. 그래프가 보기보다 관리하기 어려워지는 이유 중 하나입니다.
빌드가 가져온 것의 그래프를 확인하세요
GitHub Actions 워크플로 하나를 CRACI에서 실행하고, 기록된 SBOM의 종속성 그래프를 트리의 모든 깊이에서 탐색해 보세요.
데모 예약