Distroless 알파인

일상 업무에서 한동안 Google's Distroless 이미지를 사용했습니다. 이것의 이점은 잘 알려져 있습니다. 더 작은 이미지와 공격 표면입니다. 그러나 우리가 예상하지 못한 것은 여전히 ​​취약성 분류를 처리하는 상당한 수고를 처리해야 한다는 것입니다(distroless/base에 대한 아래 Snyk 출력 참조). 우리의 SDLC가 작고 투박하며 scratch (Graal, Golang 등) 이미지에 대한 준비가 아직 되지 않았기 때문에 당분간 무엇을 할 수 있습니까? 🤔

이로 인해 distrolessAlpine Linux 이미지에 대해 생각하게 되었습니다. 빠른 Google은 최근Medium article이 증명한 것처럼 내가 유일한 사람이 아니라는 것을 보여줍니다. 그러나 우리는 라이브러리별로 라이브러리를 가져와 작동하는 이미지를 얻기 위해 대부분 Java를 다루기 때문에 다소 어리석은 일입니다. 다행히 APKO 구조에.

APKO는 필요한 것만 Alpine을 사용하여 린 이미지를 만드는 도구입니다.

데모



작성 당시 Alpine 3.15 이미지는 5.57MB였습니다. 꽤 작지만 여전히 sh 셸과 같이 필요하지 않은 일부 항목이 포함되어 있습니다. 그래서 저는 APKO의 예시를 통해 다음과 같은 결론을 내렸습니다.

contents:
  repositories:
  - https://dl-cdn.alpinelinux.org/alpine/v3.15/main
  packages:
  - musl
  - zlib

accounts:
  groups:
  - groupname: nonroot
    gid: 10000
  users:
  - username: nonroot
    uid: 10000
  run-as: nonroot

os-release:
  version-id: '3.15'  # defaults to 3.16/edge


여기서 참고할 몇 가지 사항:
  • 예제에서 사용된 3.15가 아닌 edge repos를 사용하여,
  • 몇 가지 패키지 추가:
  • musl : 거의 모든 것에 필요합니다.
  • zlib : JRE 17에 필요하며 JRE 17이 없으면 충돌합니다.

  • non-root 사용자를 사용 중입니다.

  • PS ...> docker run --rm `
      -v $pwd/:/app:rw `
      -w /app ghcr.io/chainguard-dev/apko:v0.3.3 `
      build rootless.yaml alpine:3.15-apko apko.tar
    2022/05/10 09:21:44 loading config file: rootless.yaml
    2022/05/10 09:21:45 apko (x86_64): building image 'alpine:3.15-apko'
    ...
    PS ...>  docker load -i .\apko.tar 
    Loaded image: alpine:3.15-apko
    


    결과는 매우 작은 이미지입니다.

    REPOSITORY   TAG               IMAGE ID       CREATED         SIZE
    alpine       3.15              0ac33e5f5afa   4 weeks ago     5.57MB
    alpine       3.15-apko         5a3ea808f8ed   52 years ago    709kB
    


    크기의 거의 1/8(12.7%)이며 총 2개의 패키지(14개에서 감소)입니다.

    PS ...> docker scan alpine:3.15-apko
    
    Testing alpine:3.15-apko...
    
    Package manager:   apk
    Project name:      docker-image|alpine
    Docker image:      alpine:3.15-apko
    Platform:          linux/amd64
    
     Tested 2 dependencies for known vulnerabilities, no vulnerable paths found.
    


    이는 대략적으로 동등한 것distroless/base보다 훨씬 작습니다.

    REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
    gcr.io/distroless/base   nonroot   555ca12a9222   52 years ago   20.3MB
    


    28배 이상 크며 잠재적인 문제가 있습니다.

    PS ...> docker scan gcr.io/distroless/base:nonroot
    
    Testing gcr.io/distroless/base:nonroot...
    
    ...
    Package manager:   deb
    Project name:      docker-image|gcr.io/distroless/base
    Docker image:      gcr.io/distroless/base:nonroot
    Platform:          linux/amd64
    
    Tested 6 dependencies for known vulnerabilities, found 11 vulnerabilities.
    


    Netty 및 gRPC에 많은 JLink를 통해 existing project으로 새 이미지를 시험해 보았습니다.

    grpc-자바#9083 자바는 어떻습니까?



    좋아, JLink 최소 JRE를 사용하고 싶지 않습니다. Java 17 JRE의 차이점은 무엇입니까?

    REPOSITORY                          TAG         IMAGE ID       CREATED        SIZE
    gcr.io/distroless/java17-debian11   nonroot     678ed8ce3ba5   52 years ago   231MB
    alpine                              jre17-apko  d2302101850c   52 years ago   202MB
    


    29MB 이하, 그게 다야!

    결론



    따라서 공격 표면이 더 작은 Google보다 더 작은 배포 없는 Alpine 이미지를 가질 수 있습니다. 🔥

    APKO의 메인테이너는 아직 출시되지 않았고 변경될 가능성이 있지만 좋은 시작이라고 강조합니다.

    좋은 웹페이지 즐겨찾기