コサインとdistrolessなイメージでコンテナを確保する方法


コンテナ技術と用語「コンテナイメージ」は、多くの開発者、SRESとdevopsエンジニアのために新しくありません.しかし、生産展開のために安全なコンテナイメージを持つ必要は、我々が本当に最近必要とする何かです.我々は、バックドアを挿入することによって、Solarwindコマーシャルアプリケーションの最近のソフトウェアサプライチェーン攻撃を見ました.顧客がSolarWiseアプリケーションからトロイの木馬インストールパッケージをダウンロードすると、攻撃者はSolarWise製品を実行しているそれらのシステムにアクセスできます.このポストでは、私たちは、より安全にあなたのアプリケーションコンテナを生産して、実行するのを助けることができるCosignとdistrolessなコンテナイメージについて議論します.

どのようなディストリビュレスコンテナ画像ですか?
distrolessなコンテナイメージは「言語に集中したDocker画像、オペレーティングシステムをマイナス」です.これは、通常のOSパッケージマネージャ、Linuxシェルや標準的なLinuxディストリビューションで通常期待されるようなプログラムではなく、アプリケーションと実行時の依存関係だけを含んでいることを意味します.distrolessベースのイメージは、それらの対応するより小さいパッケージを持ちます.このことは攻撃面を減少させ、脆弱性のある部品が少なく、セキュリティが向上する.
ソースhttps://github.com/GoogleContainerTools/distroless

distrolessコンテナイメージの利点:
  • コンテナのセキュリティを向上させます.
  • コンテナサイズを減らします.
  • コンプライアンス範囲を減らします.
  • コンテナ配布パフォーマンスを改善します.
  • より少ない資源を利用することによるコスト効率

  • Coサイン検証と一緒にアプリケーションのためのdistrolessコンテナ画像
    COSIGNは、SigStoreと呼ばれるLinux財団プロジェクトとのコラボレーションで、Googleによって開発されたツールです.Googleは、distrolessなイメージが現在Cosignによって署名されると発表しました.したがって、これはdistrolessのすべてのユーザーが実際に彼らが意図したベースイメージを使用していることを確かめることができることを意味します.

    ワークフロー


    なぜ我々は不要なコンテナ画像と共にコサインを必要とするのですか?
    CoSignの必要性は、distrolessなイメージでさえ、Typosquatting攻撃、または悪意のあるイメージを受けているような若干のセキュリティ脅威に直面する機会があります.distrolessビルドプロセスが妥協している場合、それは誤って実際のdistroless画像の代わりに悪意のある画像を使用してユーザーに脆弱になります.
    Typosquattingは、ソーシャル・エンジニアリング攻撃の一種で、攻撃者が悪意のあるパッケージをレジストリに公開し、ユーザを騙してパッケージやレジストリ/ドメインの類似名をインストールすることを望んでいます.

    Cosignとdistrolessなイメージでアプリケーションコンテナイメージを構築する方法?


    COSIGN検証でdistrolessコンテナベースイメージを確認します.
    無損失画像GCRの検証Socisherで共有されています.これは画像構築プロセスの第一歩です.
    $ 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}
    

    Cosign検証されたdistlessなベース画像を使用してアプリケーションのコンテナイメージを構築する
    アプリケーション画像をdistrolessなコンテナ画像として構築するための2、3のアプローチがある.
  • ソースコードからアプリケーションを構築するには、それぞれのビルドツールを使用します.その後、Dockerディレクティブを使用して、コピーまたは追加して、ビルドされたアーティファクトをコピーまたは追加してDocker画像を構築します.
  • マルチステージのDockerビルド.
  • 私はここで複数のシナリオについては、ここで私はどこに静的なdistrolessイメージと標準的なベースイメージを見つけることができる私のHello World Go WebアプリのためのDockerコンテナイメージを構築している.
  • アプリケーションイメージGCRを内蔵.マルチステージビルドプロセスにおけるベースイメージとしてのIO/distroless/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つのステージビルドプロセスで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"]
    
    あなたのアプリケーションのためのdistrolessベースの画像を使用するの重要性を識別する次のトピックでDockerのスキャンレポートの詳細を見つけることができます.

    コンテナ画像走査:distrolessなコンテナイメージ対標準的な容器イメージ
    私はDockerパッケージの新しいバージョンで利用可能なDynkと呼ばれるネイティブのスキャンツールを使用している.Dockerコマンドを使用してこのユーティリティを使用できます.

    イメージスキャンレポート
    静的無損失ベース画像
    Numとしての標準のベースイメージ
    Ubuntuとしての標準ベースイメージ
    チェックインローカルdistroless:ローカルのdistrolessをテストしているV 1 .組織: JesWinjknPackage Manager : Lung . DeProjectの名前: DockerイメージとローカルdistrolessDockerイメージ:ローカルdistroless : V 1プラットフォーム: Linux/AMD 64ライセンス✔ 既知の問題に対する3つの依存関係をテストしました.
    ローカル標準:V 1テストローカルローカル:V 1 ...組織:JesWinjknPackage Manager : DeadProject名: Docker Image Count Local StandardDocker Image : Local Standard : V 1 Platform : Linux/AMD 64ライセンス:既知の問題に対応する200の依存関係、169の問題を発見しました.
    ローカルのUbuntuをテストします.組織: JesWinjknPackage Manager : DeadProjectの名前: DockerイメージHand Local Ubuntudockerイメージ:ローカルUbuntu : V 1プラットフォーム: Linux/AMD 64ライセンス:既知の問題に対応する103の依存関係について、12の問題を発見しました.
    注:参照からSynkスキャンの完全なレポートを見つけることができます.

    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公開キーでアプリケーションコンテナイメージを確認します
    $ 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}
    

    キーポイント
  • distroless言語指向のDocker画像、マイナスのオペレーティングシステムです.
  • パッケージを少なくして、脆弱性を持つ機会が少ない.distrolessなイメージは、必要なパッケージだけを持ちます.
  • 不機嫌なイメージは現在契約されます.
  • 各ビルド前にCoSign公開キーですべてのdistrolessイメージを確認します.
  • コンテナイメージのスキャンは、あなたのCICDのビルドシステムを持っている必要があります.
  • ベースのアプリケーションイメージは、ベースのdistrolessイメージから構築し、イメージの信頼を確保するために生産でそれを使用する前に確認します.
  • このブログの記事を読んで楽しんでください.あなたがより多くから我々を聞くのが好きであるならば

    参考文献
  • 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