Docker: Baiki Kelemahan Imej dengan Trivy dan Copa


Imej kontena Docker selalunya mengandungi kelemahan keselamatan yang diwarisi daripada pakej sistem pengendalian asas mereka. Daripada membina semula imej dari awal, anda boleh menggunakan Trivy untuk mengimbas kelemahan dan Copa untuk menampalnya secara langsung. Tutorial ini menunjukkan cara untuk mengenal pasti dan memperbaiki kelemahan kontena pada sistem Ubuntu, Debian, RHEL, CentOS, dan Fedora menggunakan kedua-dua alat sumber terbuka yang berkuasa ini.

Dalam tutorial ini anda akan belajar:

  • Cara memasang pengimbas kerentanan Trivy pada Ubuntu/Debian
  • Cara memasang alat tampalan bekas Copa
  • Cara mengimbas imej Docker untuk kelemahan OS
  • Cara membaiki kerentanan kontena secara automatik
  • Cara mengesahkan imej yang telah ditampal bebas daripada kerentanan

Ringkasan artikel: Imbas imej Docker untuk kelemahan menggunakan Trivy dan tampal secara automatik menggunakan Copa.

LangkahArahan/Tindakan
1. Imbas imej
sudo trivy image --vuln-type os --ignore-unfixed IMAGE_NAME
2. Eksport laporan JSON
trivy image --vuln-type os --ignore-unfixed -f json -o report.json IMAGE_NAME
3. Mula BuildKit
sudo docker run --detach --rm --privileged -p 127.0.0.1:8888:8888/tcp --name buildkitd --entrypoint buildkitd moby/buildkit:v0.11.4 --addr tcp://0.0.0.0:8888
4. Tampal imej
sudo copa patch -i IMAGE_NAME -r report.json -t patched -a tcp://0.0.0.0:8888

Langkah 1: Pasang Pengimbas Kelemahan Trivy

Trivy adalah pengimbas kerentanan sumber terbuka yang dibangunkan oleh Aqua Security. Ia mengesan kerentanan dalam pakej OS, pergantungan aplikasi, dan imej kontena.

Ubuntu/Debian

  1. Pasang kebergantungan: Pertama pasang pakej wget dan gnupg yang diperlukan untuk menambah repositori:

    $ sudo apt-get install wget gnupg -y
  2. Tambah kunci GPG Trivy: Muat turun dan tambah kunci tandatangan repositori Trivy:

    $ wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null
  3. Tambah repositori Trivy: Tambahkan repositori rasmi Trivy ke senarai sumber anda:

    $ echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb generic main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
  4. Pasang Trivy: Kemas kini senarai pakej dan pasang Trivy:

    $ sudo apt-get update
    $ sudo apt-get install trivy -y

RHEL/CentOS/Fedora

  1. Tambah repositori Trivy: Cipta fail repo Trivy:

    # sudo tee /etc/yum.repos.d/trivy.repo << 'EOF'
    [trivy]
    name=Trivy repository
    baseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://aquasecurity.github.io/trivy-repo/rpm/public.key
    EOF
  2. Pasang Trivy: Gunakan dnf atau yum untuk memasang:

    # sudo dnf install trivy -y

Sahkan pemasangan dengan memeriksa versi:

$ trivy --version

Langkah 2: Pasang Alat Penampalan Copa

Copa (Copacetic) ialah projek CNCF sandbox yang menampal imej kontena secara langsung tanpa memerlukan binaan penuh. Ia menggunakan laporan kelemahan dari pengimbas seperti Trivy untuk memohon kemas kini keselamatan. Copa diedarkan sebagai binari tunggal yang berfungsi pada semua pengedaran Linux.

  1. Muat turun binari Copa: Dapatkan binari siap bina dari halaman pelepasan GitHub rasmi Copa:

    $ wget https://github.com/project-copacetic/copacetic/releases/download/v0.9.0/copa_0.9.0_linux_amd64.tar.gz
  2. Keluarkan arkib: Buka fail tar yang dimuat turun:

    $ tar -xzf copa_0.9.0_linux_amd64.tar.gz
  3. Pasang Copa: Pindahkan binari ke laluan sistem anda:

    $ sudo mv copa /usr/local/bin/
  4. Sahkan pemasangan: Sahkan Copa dipasang dengan betul:

    $ copa --version

Langkah 3: Imbas Imej Kontena untuk Kerentanan

Sebelum membuat tampalan, anda perlu mengenal pasti kelemahan dalam imej kontena anda. Langkah-langkah berikut menggunakan linuxconfig/instantprivacy sebagai contoh – gantikan ia dengan nama imej anda sendiri.

  1. Muat turun imej bekas: Muat turun imej yang anda ingin imbas:

    $ sudo docker pull linuxconfig/instantprivacy
  2. Pemeriksaan kerentanan: Jalankan Trivy untuk mengimbas kerentanan pada peringkat OS. Bendera --ignore-unfixed mengecualikan kerentanan yang tiada pembaikan tersedia:

    $ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacy
  3. Eksport laporan JSON: Copa memerlukan hasil imbasan dalam format JSON:

    $ trivy image --vuln-type os --ignore-unfixed -f json -o instantprivacy.json linuxconfig/instantprivacy

Langkah 4: Tampal Imej Bekas dengan Copa

Copa menggunakan BuildKit untuk menerapkan tampalan pada imej kontena.

  1. Mula kontena BuildKit: Lancarkan BuildKit sebagai kontena dengan keistimewaan:

    $ sudo docker run --detach --rm --privileged \
      -p 127.0.0.1:8888:8888/tcp \
      --name buildkitd \
      --entrypoint buildkitd \
      moby/buildkit:v0.11.4 \
      --addr tcp://0.0.0.0:8888
  2. Sahkan BuildKit sedang berjalan: Sahkan kontena telah bermula dengan berjaya:

    $ sudo docker ps

  3. Pat kemas kini imej kontena: Gunakan Copa untuk menerapkan tampalan keselamatan. Flag -t menetapkan tag untuk imej yang telah ditampal:

    $ sudo copa patch \
      -i docker.io/linuxconfig/instantprivacy \
      -r instantprivacy.json \
      -t patched \
      -a tcp://0.0.0.0:8888

    Copa memuat turun kemas kini keselamatan dan mencipta lapisan imej baru dengan tampalan yang diterapkan. Imej yang telah ditampal akan ditandakan sebagai linuxconfig/instantprivacy:patched.

Langkah 5: Sahkan Imej yang Dipatch

  1. Imbas imej yang dipatch: Sahkan semua kerentanan telah diselesaikan:

    $ sudo trivy image --vuln-type os --ignore-unfixed linuxconfig/instantprivacy:patched
  2. Uji imej yang dipatch: Sahkan imej yang dipatch berjalan dengan betul:

    $ sudo docker run --name=instantprivacy -d -p 8118:8118 linuxconfig/instantprivacy:patched
    $ export http_proxy="http://localhost:8118"
    $ curl api.ipify.org
    45.84.107.174
  3. Pembersihan: Hentikan bekas BuildKit selepas selesai:

    $ sudo docker stop buildkitd

Kesimpulan

Anda telah berjaya mengimbas imej bekas Docker untuk kelemahan keselamatan menggunakan Trivy dan menampalnya secara automatik dengan Copa. Pendekatan ini lebih cepat daripada membina semula imej daripada awal dan hanya menambah satu lapisan tampalan, sambil mengekalkan struktur imej asal. Untuk persekitaran pengeluaran, gabungkan alat ini ke dalam saluran CI/CD anda untuk mengimbas dan menampal imej bekas secara automatik sebelum penyebaran. Untuk maklumat lanjut, rujuk dokumentasi rasmi Trivy dan laman web projek Copa.

Soalan Lazim

  1. Jenis kelemahan apa yang boleh diperbaiki oleh Copa? Copa hanya memperbaiki kelemahan pada peringkat pakej OS (seperti pakej Debian, Ubuntu, Alpine, atau RHEL). Ia tidak dapat memperbaiki kebergantungan pada peringkat aplikasi seperti pakej npm, modul Python pip, atau modul Go. Untuk itu, anda perlu membina semula aplikasi dengan kebergantungan yang dikemas kini.
  2. Mengapa saya memerlukan BuildKit untuk menjalankan Copa? Copa menggunakan keupayaan diff dan merge BuildKit untuk membuat lapisan imej baru yang hanya mengandungi fail yang ditampal. BuildKit dijalankan sebagai kontena berkeistimewaan yang mengendalikan manipulasi imej pada tahap rendah. Tanpa BuildKit, Copa tidak dapat menerapkan tampalan pada sistem fail kontena.
  3. Bolehkah saya menampal imej dari registri peribadi? Ya, Copa menyokong registri peribadi. Anda perlu mengesahkan dengan docker login sebelum menjalankan arahan tampalan. Copa menggunakan kelayakan Docker anda untuk memuat turun imej asas dan mendorong hasil tampalan jika perlu.
  4. Apa yang berlaku jika Copa tidak dapat menampal semua kelemahan? Sesetengah kelemahan mungkin belum mempunyai pembaikan. Flag --ignore-unfixed dalam Trivy mengecualikan kelemahan ini dari laporan. Copa akan menampal semua yang mempunyai pembaikan yang tersedia. Jalankan Trivy sekali lagi tanpa --ignore-unfixed untuk melihat semua kelemahan termasuk yang menunggu tampalan.
  5. Bagaimana saya mengemas kini Copa ke versi terkini? Muat turun versi terkini dari halaman pelepasan GitHub Copa dan gantikan binari di /usr/local/bin/. Semak versi semasa dengan copa --version.