FOSSLight Yocto Scanner
FOSSLight Yocto Scanner는 Yocto Project 기반 빌드 과정에서 bom.bbclass를 통해 추출된 결과를 활용하여, rootfs 이미지에 포함된 Package의 OSS 정보를 FOSSLight Report형식으로 출력해주는 Python Script입니다.
-
출력 내용
- SRC Sheet : Installed package 목록을 추출하고 OSS 정보를 출력합니다.
- BIN Sheet : rootfs image를 압축 해제한 폴더에서 binary를 추출한 후 binary별 OSS 정보를 출력합니다.
-
OSS 정보 수집 기준
- Package별 OSS 정보는 Recipe에 정의된 메타데이터를 기반으로 OSS Name(Recipe name), OSS Version, LICENSE, Download Location을 출력합니다.
-
⚠️주의 사항
- rootfs 이미지 외 target에 탑재되는 이미지 (ex- 커널, 부트로더)에 대해서는 Script가 OSS 정보를 출력해주지 않습니다. 이에 대해서는 사용자가 직접 FOSSLight Report에 OSS 정보를 추가해야 합니다.
필요 조건
- FOSSLight Yocto Scanner는 Python 3.10+ 기반에서 동작합니다.
- OSS 정보(OSS Name, OSS Version, License)를 Binary DB로부터 추출하는 기능을 사용하려면 DB 세팅 가이드를 참고하세요.
설치 방법
- (windows의 경우) https://visualstudio.microsoft.com/ko/vs/older-downloads/ > 재배포 가능 패키지 및 빌드 도구에서 Microsoft Build Tools 설치
- python virtualenv 환경 세팅
- Python package인 fosslight_yocto 설치
$ pip3 install fosslight_yocto
실행 방법
준비 사항
- build directory (ex-poky/build)로 이동한 후, conf/local.conf에 buildhistory와 bom을 inherit시킵니다.
$ cd poky/build poky/build$ vi conf/local.conf INHERIT += "buildhistory" BUILDHISTORY_COMMIT = "1" INHERIT += "bom" - 최상위 directory 아래 meta/classes 디렉토리에 bom.bbclass 파일을 다운로드합니다.
- meta/classes 가 없는 경우 build에 포함되는 meta layer의 classes폴더에 bom.bbclass를 다운로드합니다.
poky/meta/classes$ wget -O bom.bbclass "https://github.com/fosslight/fosslight_yocto_scanner/raw/main/files_for_preparation/bom.bbclass" - yocto 2.5 이전 버전의 경우, –runall 기능을 지원하지 않아 build시 bom.bbclass를 출력하기 위하여 bom.bbclass를 하기와 같이 수정합니다.
addtask write_bom_info -> addtask write_bom_info before do_build
- meta/classes 가 없는 경우 build에 포함되는 meta layer의 classes폴더에 bom.bbclass를 다운로드합니다.
- 이미지를 build한 후, write_bom_info를 실행합니다.
- yocto 2.5 이후 버전
poky/build $ bitbake <image> poky/build $ bitbake --runall=write_bom_info <image> (eg. bitbake --runall=write_bom_info core-image-minimal) - yocto 2.5 이전 버전
poky/build $ bitbake <image>
- yocto 2.5 이후 버전
- ${TOPDIR}/에 bom.json 파일과 buildhistory 폴더가 생성됩니다.
실행
fosslight_yocto 명령어를 실행합니다.
$ fosslight_yocto -i [installed-package-names.txt] -b [bom.json] -p [buildhistory/packages] -a [path_to_binary_analysis]
- Options
Usage ──────────────────────────────────────────────────────────────────── fosslight_yocto [options] <arguments> 📝 Description ──────────────────────────────────────────────────────────────────── FOSSLight Yocto Scanner parses bom.json to extract open source information for packages installed on a Yocto-based model. 📚 Guide: https://fosslight.org/fosslight-guide-en/scanner/7_yocto.html ⚙️ General Options ──────────────────────────────────────────────────────────────────── -h Show this help message -v Show version information -o <path> Output directory path (default: current directory) -f <format> Output file format (excel, csv, opossum) 🔍 Scanner-Specific Options ──────────────────────────────────────────────────────────────────── -p <path> Path of buildhistory/package directory -b <file> bom.json file path -i <file> installed-package-names.txt file path -ip <file> installed-packages.txt file path -y <file> sbom-info.yaml or oss-pkg-info.yaml file path -a <path> Path to analyze the binaries -n Print result in BIN(Yocto) format -s Analyze source code for New Open Source -c Analyze all the source code -e <path> Top build output path with bom.json to compress all the source code -pr Print all data of bom.json 💡 Examples ──────────────────────────────────────────────────────────────────── # Basic scan with required inputs fosslight_yocto -p buildhistory/packages -b bom.json \ -i installed-package-names.txt -ip installed-packages.txt # Scan with sbom-info.yaml and output path fosslight_yocto -p buildhistory/packages -b bom.json \ -i installed-package-names.txt -ip installed-packages.txt \ -y sbom-info.yaml -o results/ # Scan with binary analysis and source code analysis fosslight_yocto -p buildhistory/packages -b bom.json \ -i installed-package-names.txt -ip installed-packages.txt \ -a /path/to/binaries -s
결과
$ tree
.
├── fosslight_log_yocto_260413_1443.txt
└── fosslight_report_yocto_260413_1443.xlsx
- fosslight_log_yocto_[datetime].txt : 실행 log
- fosslight_report_yocto_[datetime].xlsx : FOSSLight Yocto의 결과 (FOSSLight Report 형태)
- Binary별 checksum, tlsh 값은 report에 기본적으로 숨김 처리 되어 있음.
- Binary별 checksum, tlsh 값은 report에 기본적으로 숨김 처리 되어 있음.
추가 기능
-y 옵션 : SBOM 정보 파일 기반 Recipe/Package별 OSS 정보 로딩 기능
-
Script를 -y 옵션으로 실행하는 경우, Recipe에 정의된 OSS 정보는 사용하지 않으며, SBOM 파일에 포함된 OSS 정보를 기준으로 FOSSLight Report를 생성합니다.
단, SBOM 파일에 Recipe/Package 정보가 존재하더라도, 실제로 Install 되지 않는 Recipe/Package인 경우, FOSSLight Report에 포함되지 않습니다.OSS Information Exclude Comment Recipe로부터 추출한 정보 O Excluded by sbom-info.yaml sbom-info.yaml로부터 추가된 정보 sbom-info.yaml에 쓰여진 값 Info loaded from osbom-info.yaml
SBOM 정보 파일 작성
SBOM 정보 파일 작성을 위해 YAML 파일을 준비하며, 두 가지 포맷 중 하나를 선택하여 작성합니다.
- sbom-info.yaml 파일 (Yaml 형식)을 생성하고, OSS 별로 해당하는 yocto_recipe 또는 yocto_package를 입력합니다. ( 예- sbom-info.yaml )
- list 타입으로 작성할 수 없는 필드 : version, download location, homepage, exclude
- list 타입으로 작성할 수 없는 필드 : version, download location, homepage, exclude
실행 방법
- Script 실행 시 -y 파라미터로 SBOM 파일을 지정합니다.
- 1개의 SBOM 파일 인 경우
(.venv)$ fosslight_yocto -i [installed-package-names.txt] -b [bom.json] -p [buildhistory/packages] -a [path_to_binary_analysis] -y [sbom-info.yaml] - 2개 이상의 SBOM 파일을 load하는 경우 (,로 구분)
(.venv)$ fosslight_yocto -i [installed-package-names.txt] -b [bom.json] -p [buildhistory/packages] -a [path_to_binary_analysis] -y [oss-pkg-info.yaml,sbom-info.yaml]
- 1개의 SBOM 파일 인 경우
-s, -c 옵션 : Source Code 분석
Source Code 분석을 실행합니다.
실행 방법
-
(권장) Parameter -s : FOSSLight Hub에 저장되지 않은 OSS인 Recipe에 대해서만 분석합니다.
(.venv)$ fosslight_yocto -i [installed-package-names.txt] -b [bom.json] -p [buildhistory/packages] -s - Parameter -c : Install되는 모든 Recipe에 대하여 Source Code 분석합니다.
(.venv)$ fosslight_yocto -i [installed-package-names.txt] -b [bom.json] -p [buildhistory/packages] -c
결과 파일
- source_analysis_report.xlsx : Source Code 분석 결과 파일
- scancode_result 폴더 : Recipe 별 결과 파일
-e 옵션 : Recipe별 Source Code를 복사 및 압축 기능
- 설치되는 Recipe별 Source Code를 [recipe_name].zip으로 압축하여 package_zips 폴더에 저장하고, 이를 하나로 재압축하는 기능입니다. 단, socket, FIFO, binary 파일은 제외됩니다.
준비 사항
- bom.bbclass의 do_write_bom_info() 함수 내 jsondata 딕셔너리에 아래 항목을 추가한 후 bom.json 파일을 생성합니다.
jsondata["file_path"] = d.getVar("FILESPATH", True)
실행 방법
- Parameter -e를 추가합니다.
(.venv)$ fosslight_yocto -i [installed-package-names.txt] -b [bom.json] -p [buildhistory/packages] -e
결과 파일
- package_zips : recipe별 Source code를 복사하여 [recipe_name].zip 형태로 모은 폴더
- packages.tar.gz : package_zips를 압축한 파일
- oss_source_path.txt : SRC_URI = file://로 시작하는 Recipe에 한하여 Source code 취합한 Path를 출력한 파일
- failed_to_compress_list.txt : 일부 또는 전체 소스에 대하여 압축이 실패한 내역을 출력한 파일