소프트웨어 자재 명세서(SBOM)¶
소프트웨어 자재 명세서(“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을 실행하고 차이점이 예상한 변경 사항과 일치하는지 확인하십시오.종속성 코드 업데이트와 함께 Misc/sbom.spdx.json 변경 사항을 커밋하십시오.
새 종속성 추가¶
종속성을 추가할 때는 다음 정보를 확보하는 것이 중요합니다.
프로젝트의 이름, 버전, 다운로드 URL
SPDX License Expression으로 표현한 프로젝트의 라이선스
취약점 데이터베이스의 값과 일치하는 소프트웨어 식별자(CPE 및 Package URLs 또는 “PURLs”)
이 종속성에 해당하며 CPython 소스 트리에서 포함하거나 제외할 경로
이 정보를 수집한 후에는 다음을 수행하십시오.
관련 Misc/sbom.spdx.json 파일의
packages내 새 항목에 정보를 추가하십시오. 형식은 걱정하지 마십시오. 도구가 수동으로 작성한 JSON의 형식을 자동으로 맞춥니다. 입력해야 할 필드는 다음과 같습니다.name은 프로젝트 이름입니다.SPDXID는"SPDXRef-PACKAGE-{name}"입니다.프로젝트 라이선스의 SPDX 라이선스 식별자는
licenseConcluded에 지정합니다.프로젝트 버전은
versionInfo에 지정합니다.downloadLocation은 프로젝트를 아카이브로 다운로드할 수 있는 HTTPS URL이어야 합니다.checksums[0].checksumValue와.algorithm은 다운로드한 아카이브의 SHA-256 체크섬입니다.원저자 정보는
originator에 지정하고, 저자 및 유지관리 상황에 따라Organization:또는Person:접두사를 붙이십시오.primaryPackagePurpose는 대개"SOURCE"입니다.externalReferences는 CPE 또는 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의 변경 사항을 커밋하십시오.