연합 서명과 배포할 수 없는 그림을 가진 용기를 어떻게 보호합니까

많은 개발자, SRE, DevOps 엔지니어들에게 용기 기술과 용어인 '용기 이미지' 는 신선하지 않다.그러나 우리는 현재 생산 배치를 위해 안전한 용기 이미지를 제공해야 한다.우리는 최근의 소프트웨어 공급망이 백도어를 삽입하여 Solar Winds 상업 응용 프로그램을 공격하는 것을 이미 보았다.고객이 SolarWinds 응용 프로그램에서 트로이 목마 설치 패키지를 다운로드할 때 공격자는 SolarWinds 제품을 실행 중인 시스템에 접근할 수 있다.본고에서, 우리는cosign과Distribless 용기 이미지를 토론할 것이다. 이것은 응용 프로그램 용기가 생산 환경에서 더욱 안전하게 배치되고 운행하도록 도와줄 수 있다.

배포할 수 없는 컨테이너 이미지는 무엇입니까?


배포할 수 없는 컨테이너 이미지는 운영 체제가 아닌 언어 중심 Docker 이미지입니다.이것은 응용 프로그램과 실행 시 의존 항목만 포함하고, 일반적인 운영체제 패키지 관리자, 리눅스 셸, 또는 표준 리눅스 버전에서 사용하고자 하는 모든 프로그램은 포함하지 않는다는 것을 의미합니다.기본 이미지가 없는 패키지는 해당 이미지의 패키지보다 작습니다.이것은 공격면을 감소시켰다. 공격을 받기 쉬운 부품이 더욱 적기 때문에 안전성을 높였다.
자료 출처: https://github.com/GoogleContainerTools/distroless

배포 컨테이너 이미지의 이점 없음:

  • 컨테이너의 안전성을 향상시켰다.
  • 용기의 사이즈를 줄였다.
  • 규정 준수 범위를 줄였습니다.
  • 컨테이너 배송 성능을 향상시켰다.
  • 비교적 적은 자원을 이용하여 원가 효과가 있다.
  • 응용 프로그램에 용기 이미지를 나누어 주고 연합 서명 검증을 진행합니다


    Cosign은 구글이 sigstore라는 Linux 재단 프로젝트와 협력해 개발한 도구로 용기 이미지의 서명과 검증을 간소화하는 데 쓰인다.구글은 현재 게시할 수 없는 이 사진들에 Cosign이 서명했다고 발표했다.따라서 디스트로레스의 모든 사용자는 이미지 구축을 시작하기 전에 그들이 원하는 기본 이미지를 사용하고 있는지 확인하고 디스트로레스 이미지를 더욱 신뢰할 수 있음을 의미한다.

    공통 공동 서명 워크플로우



    배포할 수 없는 컨테이너 이미지와 함께 Cosign을 사용해야 하는 이유는 무엇입니까?


    협동 서명이 필요한 이유는 배포할 수 없는 이미지를 사용해도 오삽 공격이나 악성 이미지 수신 등 보안 위협에 직면할 수 있기 때문이다.디스트로레스 구축 과정이 파괴되면 사용자는 실제 디스트로레스 이미지가 아닌 악성 이미지를 의외로 사용할 수 있습니다.
    TypoShucking은 공격자가 악성 패키지를 등록표에 발표하여 유사한 패키지나 등록표/도메인 이름을 사용해서 설치하도록 유인하는 사회 공학 공격이다.

    어떻게 여현과 배포할 수 없는 이미지를 사용하여 응용 프로그램 용기 이미지를 구축합니까?



    Cosign verification을 사용하여 배포 컨테이너의 기본 이미지가 없는지 확인합니다.


    분포 이미지 gcr의 검증이 없습니다.io/distroless/static이 게시자 Google과 공유하는 공동 서명 키입니다.이것은 이미지 메이킹 과정의 첫걸음이어야 한다.
    $ cosign verify -key publisher-shared-cosign-pub.key gcr.io/distroless/static
    
    Verification for gcr.io/distroless/static --The following checks were performed on each of these signatures: - The cosign claims were validated - The signatures    were verified against the specified public key - Any certificates were verified against the Fulcio roots.{"critical":{"identity":{"docker-    reference":"gcr.io/distroless/static"},"image":{"docker-manifest-digest":"sha256:c9320b754c2fa2cd2dea50993195f104a24f4c7ebe6e0297c6ddb40ce3679e7d"},"type":"cosign   container image signature"},"optional":null}
    

    공동 서명 검증을 거친 배포 기반 이미지가 없는 응용 프로그램 용기 이미지 구축


    응용 프로그램 이미지를 배포할 수 없는 용기 이미지로 구축할 수 있는 몇 가지 방법이 있습니다.
  • 각자의 구축 도구를 사용하여 원본 코드에서 응용 프로그램을 구축한다.그런 다음 Docker 명령을 사용하여 COPY 또는 ADD를 사용하여 복사하거나 추가한 구축 가공소재를 사용하여 Docker 이미지를 구성합니다.
  • 다단계 Docker 구축
  • 저는 여기에서 여러 장면을 따라가고 있습니다. Hello World Go 웹 응용 프로그램에 Docker 용기 이미지를 구축하고 있습니다. 정적 디스트로리스 이미지와 표준 기본 이미지를 찾을 수 있습니다.
  • gcr를 사용하여 응용 프로그램 이미지를 구축합니다.io/Distriless/static은 다중 레벨 구축 프로세스의 기본 이미지입니다.
  •    FROM golang:1.15 as builder
       COPY . /usr/local
       WORKDIR /usr/local/
       RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags netgo -ldflags '-w -extldflags "-static"' -o cmd/app
    
       FROM gcr.io/distroless/static
       USER nonroot:nonroot
       COPY --from=builder  --chown=nonroot:nonroot /usr/local/cmd/app /bin/app
       ENTRYPOINT ["/bin/app"]
    
  • 1단계 구축 과정에서 Golang:1.15를 사용하여 응용 프로그램 이미지를 구축한다.
  •    FROM golang:1.15 as builder
       COPY . /usr/local
       WORKDIR /usr/local/
       RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /bin/app
       ENTRYPOINT ["/bin/app"]
    
  • 다단계 구축 과정에서 ubuntu:21.04를 기초 이미지로 응용 프로그램 이미지를 구축한다.
  •    FROM golang:1.15 as builderstage
       COPY . /usr/local
       WORKDIR /usr/local/
       RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o cmd/app
    
       FROM ubuntu:21.04
       COPY --from=builderstage /usr/local/cmd/app /bin/app
       ENTRYPOINT ["/bin/app"]
    
    다음 테마에서 Docker scan 보고서의 상세한 정보를 찾을 수 있습니다. 이 테마는 프로그램에서 Distorless 기본 이미지를 사용하는 중요성을 결정합니다.

    컨테이너 이미지 스캔: 컨테이너 이미지와 표준 컨테이너 이미지가 나누어지지 않음


    Docker 기본 검색 도구 Synk를 사용했습니다. Docker 패키지의 업데이트 버전에서 사용할 수 있습니다.docker 명령을 사용하여 "docker scan image name"유틸리티를 사용할 수 있습니다.

    이미지 스캔 보고서
    정적 무실진 기본 이미지
    알프스 산의 표준 기지 이미지
    Ubuntu의 표준 기본 이미지로 사용
    $docker scan local distroless:v1 로컬 distroless:v1을 테스트합니다.조직:jeswinjknPackage 관리자: 프로젝트 이름:docker 이미지 | 로컬 버전 docker 이미지:로컬 버전:v1Platform:linux/AMD64 라이센스:사용 가능✔ 알려진 문제 의존 항목 3개를 테스트했지만 공격받기 쉬운 경로를 찾지 못했습니다.
    $docker scan 로컬 표준: v1 테스트 로컬 표준: v1.조직 기구:jeswinjknPackage 매니저:DEB 프로젝트 이름:docker image | 로컬 표준 docker image: 로컬 표준:v1Platform:linux/AMD64 허가증: 200개의 알려진 문제에 대한 의존항을 테스트하여 169개의 문제를 발견했습니다.
    $docker가 로컬 ubuntu: v1을 스캔해서 로컬 ubuntu: v1을 테스트합니다.조직:jeswinjknPackage 매니저:deb Project name:docker image | local ubuntu Docker image:local ubuntu:v1 플랫폼:linux/AMD64 허가증:enabled Tested 103개의 알려진 문제 의존항, 12개의 문제 발견.
    참고: Synk scan 전체 보고서는 참조 자료에서 찾을 수 있습니다.

    Cosign을 사용하여 작성된 릴리스 없는 응용 프로그램 컨테이너 이미지에 서명합니다.



    여현 키 쌍 생성
    $ cosign generate-key-pair
    
    Enter password for private key: 
    Enter again: 
    Private key written to cosign.key
    Public key written to cosign.pub
    
    로컬 구축된 용기 이미지를 등록표에 상세하게 표시하고 원격 등록표로 전송해야 합니다.
    생성된 개인 키를 사용하여 원격 용기 이미지에 서명합니다.
    $ cosign sign -key cosign.key jeswinkninan/distroless:v1
    
    Enter password for private key: 
    Pushing signature to: index.docker.io/jeswinkninan/distroless:sha256-41fd2ec0997d91c5df7c7d58d0a2433a5744119d79a803123541cdd2b0e93f08.sig
    

    생성된 연합 서명 키 검증 프로그램 용기 이미지 사용하기


    $ cosign verify -key cosign.pub jeswinkninan/distroless:v1 
    
    Verification for jeswinkninan/distroless:v1 --
    The following checks were performed on each of these signatures:
    - The cosign claims were validated
    - The signatures were verified against the specified public key
    - Any certificates were verified against the Fulcio roots.
    {"critical":{"identity":{"docker-reference":"index.docker.io/jeswinkninan/distroless"},"image":{"docker-manifest-     digest":"sha256:41fd2ec0997d91c5df7c7d58d0a2433a5744119d79a803123541cdd2b0e93f08"},"type":"cosign container image signature"},"optional":null}
    

    요점

  • Distorless는 운영 체제를 제외한 언어 중심의 Docker 이미지입니다.
  • 패키지가 적을수록 취약성이 줄어듭니다.배포할 수 없는 이미지는 필요한 패키지만 포함됩니다.
  • 배포할 수 없는 이미지가 공동 서명되었습니다.
  • 매번 생성되기 전에 연합 서명 키를 사용하여 모든 배포할 수 없는 이미지를 검증한다.
  • 컨테이너 이미지 스캔은 CICD 구축 시스템에서 필수적인 기능입니다.
  • 기본 릴리스 이미지가 없는 내부 어플리케이션 이미지에 공동 서명하고 이를 프로덕션에 사용하기 전에 이미지를 신뢰할 수 있는지 확인합니다.
  • 우리는 네가 이 박문을 즐겨 읽기를 바란다.만약 당신이 우리의 더 많은 정보를 듣는 것을 좋아한다면, 언제든지 우리에게 연락하십시오

    도구책

  • https://security.googleblog.com/2021/05/making-internet-more-secure-one-signed.html
  • https://snyk.io/blog/typosquatting-attacks
  • https://github.com/sigstore/cosign#generate-a-keypair
  • https://www.cisecurity.org/solarwinds/
  • 전체 이미지 스캔 보고서: https://github.com/JESWINKNINAN/distroless-go-instrumented/tree/main/internal/scan-reports
  • 좋은 웹페이지 즐겨찾기