
BuildKit ã®ææ°ãªãªãŒã¹ ã·ãªãŒãºã§ãã v0.11 ã§ã¯ããã«ãæã®æ§æèšŒæãš SBOM ã®ãµããŒããå°å ¥ããããããªãã·ã£ãŒã¯ã€ã¡ãŒãžã®ãã«ãæ¹æ³ã®èšé²ã䜿çšããŠã€ã¡ãŒãžãäœæã§ããŸãã ããã«ãããã€ã¡ãŒãžå ã®ããã±ãŒãžãã€ã¡ãŒãžã®ãã«ãå ãåãçµæãããŒã«ã«ã§åçŸã§ãããã©ãããªã©ãäžè¬çãªè³ªåã«ç°¡åã«åçã§ããŸãã
ãã®æ°ããããŒã¿ã¯ã䜿çšããç»åã®ã»ãã¥ãªãã£ã«ã€ããŠæ å ±ã«åºã¥ããæææ±ºå®ãè¡ãã®ã«åœ¹ç«ã¡ããã¹ãŠã®æäœæ¥ãæåã§è¡ãå¿ èŠã¯ãããŸããã
ãã®ããã°æçš¿ã§ã¯ãæ§æèšŒæãš SBOM ãšã¯äœããSBOM ãå«ãã€ã¡ãŒãžãæ§ç¯ããæ¹æ³ãããã³çµæã®ããŒã¿ã®åæãéå§ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ãã®æçš¿ã®å 容:
蚌æãšã¯äœã§ãã?
æ§æèšŒæã¯ãã¹ããŒãã¡ã³ãã true ã§ããããšã宣èšããããšã§ãã ãœãããŠã§ã¢ã§ã¯ãæ§æèšŒæã¯ããœãããŠã§ã¢ææç©ã«é¢ããã¹ããŒãã¡ã³ããæå®ããã¬ã³ãŒãã§ãã ããšãã°ã誰ããã€æ§ç¯ããããã©ã®ãããªå ¥åã§æ§ç¯ãããããã©ã®ãããªåºåãçæããããªã©ãå«ããããšãã§ããŸãã
ãããã®èšŒæãèšè¿°ããææç©èªäœãšäžç·ã«é åžããããšã§ãä»ã®æ¹æ³ã§ã¯èŠã€ããã®ãé£ãããããã®è©³çްã確èªã§ããŸãã 蚌æãªãã§ãã®çš®ã®æ å ±ãååŸããã«ã¯ããœãŒã¹ã³ãŒããèŠã€ããããšãããã«ããèªåã§åçŸããããšããŠãã€ã¡ãŒãžãã©ã®ããã«ãã«ãããããããªããŒã¹ãšã³ãžãã¢ãªã³ã°ããå¿ èŠããããŸãã
ãã®è²Žéãªæ å ±ãã€ã¡ãŒãžã®ãšã³ããŠãŒã¶ãŒã«æäŸããããã«ãBuildKit v0.11 ã§ã¯ãéåžžã®ãã«ãããã»ã¹ã®äžéšãšããŠãããã®æ§æèšŒæããã«ãã§ããŸãã å¿ èŠãªã®ã¯ããã«ãã¹ãããã«ããã€ãã®ãªãã·ã§ã³ã远å ããããšã ãã§ãã
BuildKit ã¯ã(toto ãã¬ãŒã ã¯ãŒã¯ãã) toto 圢åŒã§ã®æ§æèšŒæããµããŒãããŠããŸãã çŸåšãDockerfile ããã³ããšã³ãã¯ã次㮠2 ã€ã®ç°ãªã質åã«çãã 2 çš®é¡ã®æ§æèšŒæãçæããŸãã
- SBOM (ãœãããŠã§ã¢éšå衚) â SBOM ã«ã¯ãã€ã¡ãŒãžå ã®ãœãããŠã§ã¢ ã³ã³ããŒãã³ãã®äžèЧãå«ãŸããŠããŸãã ããã«ã¯ãã€ã³ã¹ããŒã«ãããŠããããŸããŸãªããã±ãŒãžã®ååããããã®ããŒãžã§ã³çªå·ãããã³ãã®ä»ã®é¢é£ããã¡ã¿ããŒã¿ãå«ãŸããŸãã ããã䜿çšããŠãã€ã¡ãŒãžã«ç¹å®ã®ããã±ãŒãžãå«ãŸããŠãããã©ãããäžç®ã§ç¢ºèªããããã€ã¡ãŒãžãç¹å®ã®CVEã«å¯ŸããŠè匱ãã©ããã倿ãããã§ããŸãã
- SLSA ã®æ¥æŽ â ã€ã¡ãŒãžã®æ¥æŽã¯ãæ¶è²»ããããããªã¢ã« (ç»åãURLããã¡ã€ã«ãªã©)ãèšå®ããããã«ã ãã©ã¡ãŒã¿ãŒãçµæã®ã€ã¡ãŒãžããããäœæãã Dockerfile ã«ãããã³ã°ã§ãããœãŒã¹ ããããªã©ããã«ã ããã»ã¹ã®è©³çްãèšè¿°ããŸãã ããã䜿çšããŠãã€ã¡ãŒãžãã©ã®ããã«æ§ç¯ãããããåæãã䜿çšããããœãŒã¹ããã¹ãŠæ£åœã«èŠãããã©ããã確èªããèªåã§ã€ã¡ãŒãžãåæ§ç¯ããããšãã§ããŸãã
ãŠãŒã¶ãŒã¯ãã«ã¹ã¿ã BuildKit ããã³ããšã³ããä»ããŠç¬èªã®ã«ã¹ã¿ã æ§æèšŒæã¿ã€ããå®çŸ©ããããšãã§ããŸãã ãã®æçš¿ã§ã¯ãSBOMãšãããããDockerfilesã§äœ¿çšããæ¹æ³ã«çŠç¹ãåœãŠãŸãã
ææ°ãªãªãŒã¹ã®å ¥æ
ã€ã¡ãŒãžã«æ§æèšŒæãçµã¿èŸŒãã«ã¯ãBuildx ãš BuildKit ã®äž¡æ¹ã®ææ°ãªãªãŒã¹ãå¿ èŠã§ã â Docker Desktop ãææ°ããŒãžã§ã³ã«æŽæ°ããããšã§ææ°ããŒãžã§ã³ãå ¥æã§ããŸãã
ããŒãžã§ã³çªå·ã確èªããbuildx v0.10 ãªãªãŒã¹ ã·ãªãŒãºãšäžèŽããŠããããšã確èªã§ããŸãã
$ docker buildx version
github.com/docker/buildx 0.10.0 ...
BuildKit ã®ææ°ãªãªãŒã¹ã䜿çšããã«ã¯ã buildx ã䜿çšããŠããã«ãŒã³ã³ãããã«ããŒãäœæããŸãã
$ docker buildx create --use --name=buildkit-container --driver=docker-container
æ°ãããã«ããŒãæ£ããæ§æãããŠããããšã確èªããbuildkit v0.11ãªãªãŒã¹ã·ãªãŒãºãšäžèŽããŠããããšã確èªã§ããŸãã
$ docker buildx inspect | grep -i buildkit
Buildkit: v0.11.1
GitHub Actions ã§ docker/setup-buildx-action ã䜿çšããŠããå Žåã¯ãæŽæ°ããªããŠããããããã¹ãŠãèªåçã«ååŸãããŸãã
ãããéªéã«ãªããªãããã«ãSBOMãå«ãã€ã¡ãŒãžã®æ§ç¯ã«é²ãããšãã§ããŸã!
ã€ã¡ãŒãžãžã® SBOM ã®è¿œå
ããã§ãã€ã¡ãŒãžã® SBOM ãçæããæºåãã§ããŸããã
次ã®ããã«ãŒãã¡ã€ã«ããå§ããŠã nginxãŠã§ããµãŒããŒãäœæããŸãããã
# syntax=docker/dockerfile:1.5
FROM nginx:latest
COPY ./static /usr/share/nginx/html
ãã®ã€ã¡ãŒãžã SBOM ãšå ±ã« 1 ã€ã®æé ã§ãã«ãããŠããã·ã¥ã§ããŸãã
$ docker buildx build --sbom=true -t <myorg>/<myimage> --push .
å¿ èŠãªã®ã¯ããã ãã§ã! ãã«ãåºåã§ãSBOM ã®çæã«é¢ããã¡ãã»ãŒãžãèŠã€ããå¿ èŠããããŸãã
...
=> [linux/amd64] generating sbom using docker.io/docker/buildkit-syft-scanner:stable-1 0.2s
...
ãã«ããããã¯ãã¹ãã£ããŒãã©ã°ã€ã³ã䜿çšããŠSBOMãçæããŸãã ããã©ã«ãã§ã¯ã Anchore ã® Syft ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®äžã«æ§ç¯ãããã¹ãã£ãã§ãã buildkit-syft-scanner ã䜿çšããŠãæéã®ãããäœæ¥ãè¡ããŸãã å¿ èŠã«å¿ããŠããªãã·ã§ã³ãæå®ã㊠generator= å¥ã®ã¹ãã£ããŒã䜿çšã§ããŸããÂ
ã䜿çšããŠçæããã SBOM buildx imagetoolsã衚瀺ããæ¹æ³ã次ã«ç€ºããŸãã
$ docker buildx imagetools inspect <myorg>/<myimage> --format "{{ json .SBOM.SPDX }}"
{
"spdxVersion": "SPDX-2.3",
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "/run/src/core/sbom",
"documentNamespace": "https://anchore.com/syft/dir/run/src/core/sbom-a589a536-b5fb-49e8-9120-6a12ce988b67",
"creationInfo": {
"licenseListVersion": "3.18",
"creators": [
"Organization: Anchore, Inc",
"Tool: syft-v0.65.0",
"Tool: buildkit-v0.11.0"
],
"created": "2023-01-05T16:13:17.47415867Z"
},
...
SBOMã¯ãããŒã«ã«ããã³ã¿ãŒã«èŒžåºæ¥è ãšã飿ºããŸãã ãããã®ãšã¯ã¹ããŒã¿ãŒã䜿çšããŠãšã¯ã¹ããŒãããå Žåãæ§æèšŒæãåºåã€ã¡ãŒãžã«çŽæ¥æ·»ä»ãã代ããã«ãæ§æèšŒæã¯åå¥ã®ãã¡ã€ã«ãšããŠåºåãã¡ã€ã«ã·ã¹ãã ã«ãšã¯ã¹ããŒããããŸãã
$ docker buildx build --sbom=true -o ./image .
$ ls -lh ./image
-rw------- 1 user user 6.5M Jan 17 14:36 sbom.spdx.json
...
ãã®å Žåã® SBOM ã®è¡šç€ºã¯ãçµæã -ing ããã®ãšåãããã catç°¡åã§ãã
$ cat ./image/sbom.spdx.json | jq .predicate
{
"spdxVersion": "SPDX-2.3",
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
âŠ
SBOMã®è£è¶³
ã¹ãã£ããŒã䜿çšããŠSBOMãçæããããšã¯ãè¯ãæåã®ã¹ã¿ãŒãã§ã! ãã ããäžéšã®ããã±ãŒãžã¯ãå°ãåç Žããªæ¹æ³ã§ã€ã³ã¹ããŒã«ãããŠãããããæ£ããæ€åºãããŸããã
ãã®å Žåã§ããæåã§ã®ããåããå°ãè¡ãããšã§ããã®æ å ±ãSBOMã«åã蟌ãããšãã§ããŸãã
curlã䜿çšããŠããŠã³ããŒãããããšã«ãããfoo v1.2.3ãã€ã¡ãŒãžã«ã€ã³ã¹ããŒã«ãããšããŸãã
RUN curl https://example.com/releases/foo-v1.2.3-amd64.tar.gz | tar xzf - && \
mv foo /usr/local/bin/
ãã®æ¹æ³ã§ã€ã³ã¹ããŒã«ããããœãããŠã§ã¢ã¯ã䜿çšããŠãã SBOM ãžã§ãã¬ãŒã¿ãŒããã®ãã€ããªãç¹å¥ã«ãµããŒãããªãéã (ããšãã°ã Syft ãç¹å®ã®æ¢ç¥ã®ãã€ããªã®æ€åºããµããŒãããŠããå Žå)ãSBOM ã«è¡šç€ºãããªãå¯èœæ§ããããŸãã
ãã®ãœãããŠã§ã¢ã® SBOM ãæåã§çæããã«ã¯ã Dockerfile heredoc ã䜿çšããŠãã€ã¡ãŒãž ãã¡ã€ã«ã·ã¹ãã äžã®ä»»æã®å Žæã« SPDX ã¹ãããããèšè¿°ããŸãã
COPY /usr/local/share/sbom/foo.spdx.json <<"EOT"
{
"spdxVersion": "SPDX-2.3",
"SPDXID": "SPDXRef-DOCUMENT",
"name": "foo-v1.2.3",
...
}
EOT
ãã® SBOM 㯠SBOM ãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠååŸãããã€ã¡ãŒãžå šäœã®æçµç㪠SBOM ã«å«ãŸããå¿ èŠããããŸãã ãã®åäœã¯ buildkit-syft-scanner ã«æšæºã§å«ãŸããŠããŸããããã¹ãŠã®ãžã§ãã¬ãŒã¿ã®ããŒã«ãããã«å«ãŸããŠããããã§ã¯ãããŸããã
ããã«å€ãã®SBOMããããŸã!
äžèšã®ã»ã¯ã·ã§ã³ã¯åºæ¬çãªã€ã¡ãŒãžãã¹ãã£ã³ããã®ã«é©ããŠããŸããããã詳现ãªããã±ãŒãžãšãã¡ã€ã«ã®æ å ±ãæäŸããã®ã«èŠåŽãããããããŸããã BuildKit ã¯ãããããåŒæ°ãšåŒæ° BUILDKIT_SBOM_SCAN_CONTEXT ã䜿çšã㊠BUILDKIT_SBOM_SCAN_STAGE ãäžéã¹ããŒãžããã«ãã³ã³ããã¹ããªã©ããã«ãã®è¿œå ã³ã³ããŒãã³ããã¹ãã£ã³ããã®ã«åœ¹ç«ã¡ãŸãã
ãã«ãã¹ããŒãž ãã«ãã®å Žåãããã«ããããã®ãœãããŠã§ã¢ãæçµçãªã€ã¡ãŒãžã«è¡šç€ºãããªããŠããåã®ã¹ããŒãžã®äŸåé¢ä¿ã远跡ã§ããŸãã
ããšãã°ãã㢠C/C++ ããã°ã©ã ã®å Žåãæ¬¡ã® Dockerfile ããããšããŸãã
# syntax=docker/dockerfile:1.5
FROM ubuntu:22.04 AS build
ARG BUILDKIT_SBOM_SCAN_STAGE=true
RUN apt-get update && apt-get install -y git build-essential
WORKDIR /src
RUN git clone https://example.com/myorg/myrepo.git .
RUN make build
FROM scratch
COPY --from=build /src/build/ /
çµæã®ã€ã¡ãŒãžãã¹ãã£ã³ããã ãã§ã¯ãGitãGCC(build-essentialããã±ãŒãžã«å«ãŸããŠããŸã)ãªã©ã®ãã«ãããŒã«ããã«ãããã»ã¹ã§äœ¿çšãããããšã¯ããããŸããã build åŒæ°ã䜿çšã㊠BUILDKIT_SBOM_SCAN_STAGE SBOM ã¹ãã£ã³ããã«ãã«çµ±åããããšã§ãä»ã®æ¹æ³ã§ã¯å®å šã«å€±ãããŠããã§ããããã¯ããã«è±å¯ãªæ å ±ãååŸã§ããŸãã
ãããã®è¿œå çæããã SBOM ããã¥ã¡ã³ãã«ã¯ãã€ã¡ãŒãžããŒã«ã§ãã¢ã¯ã»ã¹ã§ããŸãã
$ docker buildx imagetools inspect <myorg>/<myimage> --format "{{ range .SBOM.AdditionalSPDXs }}{{ json . }}{{ end }}"
{
"spdxVersion": "SPDX-2.3",
"SPDXID": "SPDXRef-DOCUMENT",
...
}
{
"spdxVersion": "SPDX-2.3",
"SPDXID": "SPDXRef-DOCUMENT",
...
}
...
ããŒã«ã«ãšã¯ã¹ããŒã¿ãŒãštarãšã¯ã¹ããŒã¿ãŒã®å Žåããããã¯åºåãã£ã¬ã¯ããªã«å¥ã ã®ãã¡ã€ã«ãšããŠè¡šç€ºãããŸãã
$ docker buildx build --sbom=true -o ./image .
$ ls -lh ./image
-rw------- 1 user user 4.3M Jan 17 14:40 sbom-build.spdx.json
-rw------- 1 user user 877 Jan 17 14:40 sbom.spdx.json
...
ç»åã®è§£æ
SBOM ãå«ãã€ã¡ãŒãžãå ¬éããŠããã®ã§ããã®è¿œå ããŒã¿ãå©çšããããã«ããããåæããæ¹æ³ãèŠã€ããããšãéèŠã§ãã
åè¿°ã®ããã«ããµãã³ãã³ãã䜿çšããŠãã¢ã¿ããããã SBOM æ§æèšŒæ imagetools ãæœåºã§ããŸãã
$ docker buildx imagetools inspect <myorg>/<myimage> --format "{{json .SBOM.SPDX}}"
{
"spdxVersion": "SPDX-2.3",
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
...
ã¿ãŒã²ãã ã€ã¡ãŒãžããã©ã°ã䜿çšã㊠--platform è€æ°ã®ã¢ãŒããã¯ãã£çšã«ãã«ããããŠããå Žåã¯ãSBOM æ§æèšŒæãæœåºããããã«å°ãç°ãªãæ§æãå¿ èŠã«ãªããŸãã
$ docker buildx imagetools inspect <myorg>/<myimage> --format "{{ json (index .SBOM "linux/amd64").SPDX}}"
{
"spdxVersion": "SPDX-2.3",
"dataLicense": "CC0-1.0",
"SPDXID": "SPDXRef-DOCUMENT",
...
ããã§ãã€ã¡ãŒãžå ã®ãã¹ãŠã®ããã±ãŒãžãšãã®ããŒãžã§ã³ãäžèŠ§è¡šç€ºãããšããŸãã ãã©ã°ã«æž¡ããã --format å€ããããã±ãŒãžãäžèŠ§è¡šç€ºãã go ãã³ãã¬ãŒã ã«å€æŽã§ããŸãã
$ docker buildx imagetools inspect <myorg>/<myimage> --format '{{ range .SBOM.SPDX.packages }}{{ println .name .versionInfo }}{{ end }}' | sort
adduser 3.118
apt 2.2.4
base-files 11.1+deb11u6
base-passwd 3.5.51
bash 5.1-2+deb11u1
bsdutils 1:2.36.1-8+deb11u1
ca-certificates 20210119
coreutils 8.32-4+b1
curl 7.74.0-1.3+deb11u3
...
ãŸãã¯ãã€ã³ã¹ããŒã«ãããŠããããšãããã£ãŠãããœãããŠã§ã¢ã®ããŒãžã§ã³æ å ±ãååŸããããšãã§ããŸãã
$ docker buildx imagetools inspect <myorg>/<myimage> --format '{{ range .SBOM.SPDX.packages }}{{ if eq .name "nginx" }}{{ println .versionInfo }}{{ end }}{{ end }}'
1.23.3-1~bullseye
SBOMã䜿çšããŠCVEãæ€çŽ¢ã§ããããŒã«(ã¢ã³ã³ãŒã«ã® Grypeãªã©)ã䜿çšããŠãSBOMå šäœãååŸããããã䜿çšããŠCVEãã¹ãã£ã³ããããšãã§ããŸãã
$ docker buildx imagetools inspect <myorg>/<myimage> --format '{{ json .SBOM.SPDX }}' | grype
NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY
apt 2.2.4 deb CVE-2011-3374 Negligible
bash 5.1-2+deb11u1 (won't fix) deb CVE-2022-3715
...
ãããã®æäœã¯è¶ è¿ éã«å®äºããã¯ãã§ã! SBOM ã¯ãã«ãæã«æ¢ã«çæãããŠãããããæ¯åæåããçæããã®ã§ã¯ãªããDocker Hub ããæ¢åã®ããŒã¿ãã¯ãšãªããã ãã§ãã
ããã«å ãž
ãã®æçš¿ã§ã¯ãBuildKit ãš SBOM ã䜿ãå§ããããã®çµ¶å¯Ÿçãªåºæ¬ã«ã€ããŠã®ã¿èª¬æããŸãã â docs.docker.com ã§è©±ãåã£ãããšã«ã€ããŠãã£ãšç¥ãããšãã§ããŸã:
- ãã«ãæã®æ§æèšŒæã®è©³çްãèªã
- buildx ã䜿çšã㊠SBOM ãäœæããæ¹æ³ã«ã€ããŠåŠç¿ãã
- ãã«ããããSBOMãããã³ã«ã䜿çšããŠç¬èªã®SBOMã¹ãã£ããŒãå®è£ ãã
- æ§æèšŒæãã¬ãžã¹ããªã«æ ŒçŽãããæ¹æ³ã®è©³çް
ãŸããææ°ã® BuildKit v0.11 ãªãªãŒã¹ã§ãªãªãŒã¹ããããã®ä»ã®æ©èœã®è©³çްã«ã€ããŠã¯ã ãã¡ããã芧ãã ããã