소프트웨어 자재 명세서(SBOM)¶
소프트웨어 자재 명세서(Software Bill-of-Materials, 줄여서 “SBOM”)는 소프트웨어와 그 구성 방식에 관한 정보를 공유하기 위한 문서입니다. 이 형식은 주로 보안 분야에서 CVE나 OSV 같은 취약점 데이터베이스를 사용하여 소프트웨어와 그 의존성에 취약점이 있는지 검사하는 데 사용됩니다. CPython 프로젝트가 사용하는 SBOM 형식은 SPDX이며, 사용자가 필요에 따라 다른 형식으로 변환할 수 있습니다.
CPython의 서드파티 의존성은 여러 경로를 통해 들어옵니다. 일부는 CPython 소스 코드 자체에 벤더링되어 있으며(Modules/_decimal/libmpdec에 벤더링된 mpdecimal 등), 일부는 Windows 빌드처럼 빌드 중에 python/cpython-source-deps 저장소의 의존성을 사용하여 선택적으로 가져올 수도 있습니다.
서드파티 의존성을 추가하거나 업데이트할 때마다 버전과 소프트웨어 식별자를 추적하기 위해 SBOM도 업데이트해야 할 가능성이 높습니다.
의존성 업데이트하기¶
CPython에 번들된 의존성의 SBOM은 Misc/sbom.spdx.json에 보관됩니다. 의존성을 새 버전으로 업데이트할 때는 SBOM에서 해당 의존성의 버전과 기타 메타데이터를 수정해야 합니다.
권장하는 워크플로는 다음과 같습니다:
새 의존성을 아카이브로 내려받으십시오. 새 버전, 다운로드 URL, 내려받은 아카이브의 체크섬을 기록해 두십시오.
CPython 소스 트리에 벤더링된 코드를 업데이트하십시오.
Misc/sbom.spdx.json을 수정하여 해당
package에 새versionInfo,downloadLocation,checksums,externalReferences를 추가하십시오. 대부분의 업데이트에서는 URL과 프로젝트 식별자에 포함된 버전만 업데이트하면 됩니다.files와relationships의 정보는 SBOM 도구가 자동으로 생성하므로 업데이트하지 마십시오.make regen-sbom또는python Tools/build/generate_sbom.py를 실행하십시오. 이 작업이 유효성 검사 오류로 실패하지 않는지 확인하십시오.git diff Misc/sbom.spdx.json을 실행하여 diff가 예상한 변경 사항과 일치하는지 확인하십시오.Misc/sbom.spdx.json의 변경 사항을 의존성 코드 업데이트와 함께 커밋하십시오.
새 의존성 추가하기¶
의존성을 추가할 때는 다음 정보를 갖추는 것이 중요합니다:
프로젝트의 이름, 버전, 다운로드 URL
SPDX 라이선스 표현식으로 나타낸 프로젝트의 라이선스
취약점 데이터베이스의 값과 일치하는 소프트웨어 식별자(CPE 및 Package URL, 즉 “PURL”)
CPython 소스 트리에서 이 의존성에 해당하는, 포함할 경로와 제외할 경로
이 정보를 모은 후에는 다음을 수행하십시오:
Misc/sbom.spdx.json 파일의
packages에 새 항목을 만들어 정보를 추가하십시오. 형식은 신경 쓰지 않아도 됩니다. 직접 작성한 JSON은 도구가 자동으로 정리합니다. 채워야 하는 필드는 다음과 같습니다:name에는 프로젝트 이름을 넣습니다.SPDXID는"SPDXRef-PACKAGE-{name}"이 됩니다.licenseConcluded에는 프로젝트 라이선스의 SPDX 라이선스 식별자를 지정합니다.versionInfo에는 프로젝트의 버전을 지정합니다.downloadLocation은 프로젝트를 아카이브로 내려받을 수 있는 HTTPS URL이어야 합니다.checksums[0].checksumValue와.algorithm은 내려받은 아카이브의 SHA-256 체크섬이 됩니다.originator에는 원저자 정보를 지정하며, 저작 및 유지 관리 상황에 따라Organization:또는Person:접두사를 붙이십시오.primaryPackagePurpose는 대개"SOURCE"가 됩니다.externalReferences는 CPE 또는 패키지 URL(Package URL) 형식으로 된 하나 이상의 프로젝트 식별자 목록입니다. 식별자가 소프트웨어의 올바른 릴리스에 대응하도록referenceLocator값에는 반드시versionInfo의 값이 포함되어야 합니다. 외부 참조에 관한 자세한 내용은 SPDX SBOM specification에서 확인할 수 있습니다.
새 라이선스 ID를 사용해야 한다면 Tools/build/generate_sbom.py의
ALLOWED_LICENSE_EXPRESSIONS에 해당 라이선스 표현식을 추가하십시오.Tools/build/generate_sbom.py에서 패키지의 SBOM ID(
SPDXRef-PACKAGE-*접두사를 뺀SPDXID)에 대응하는 키로PackageFiles인스턴스를 만들고, 여기에 포함하거나 제외할 경로를 추가하십시오.make regen-sbom또는python Tools/build/generate_sbom.py로 도구를 실행하십시오. 도구가 유효성 검사 오류로 실패하지 않는지 확인하십시오.git diff로 Misc/sbom.spdx.json의 변경 사항을 비교하고, 모든 정보가 올바른지 확인하십시오.Misc/sbom.spdx.json과 Tools/build/generate_sbom.py의 변경 사항을 커밋하십시오.
의존성 제거하기¶
의존성을 제거할 때는 다음과 같이 하십시오:
Misc/sbom.spdx.json의
packages필드에서 해당 항목을 제거하십시오.Tools/build/generate_sbom.py에서 대응하는
PackageFiles항목을 제거하십시오make regen-sbom또는python Tools/build/generate_sbom.py로 도구를 실행하십시오. 도구가 유효성 검사 오류로 실패하지 않는지 확인하십시오.git diff로 Misc/sbom.spdx.json의 변경 사항을 비교하고, SBOM에서 올바른 패키지가 제거되었는지 확인하십시오.Misc/sbom.spdx.json과 Tools/build/generate_sbom.py의 변경 사항을 커밋하십시오.