View a markdown version of this page

Praktik terbaik keamanan tugas dan wadah Amazon ECS - Amazon Elastic Container Service

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Praktik terbaik keamanan tugas dan wadah Amazon ECS

Anda harus mempertimbangkan gambar wadah sebagai garis pertahanan pertama Anda terhadap serangan. Gambar yang tidak aman dan dibangun dengan buruk dapat memungkinkan penyerang untuk melarikan diri dari batas wadah dan mendapatkan akses ke host. Anda harus melakukan hal berikut untuk mengurangi risiko terjadinya hal ini.

Kami menyarankan Anda melakukan hal berikut saat menyiapkan tugas dan wadah Anda.

Buat gambar minimal atau gunakan distroless

Mulailah dengan menghapus semua binari asing dari gambar wadah. Jika Anda menggunakan gambar yang tidak dikenal dari Amazon ECR Public Gallery, periksa gambar untuk merujuk ke isi masing-masing lapisan wadah. Anda dapat menggunakan aplikasi seperti Dive untuk melakukan ini.

Atau, Anda dapat menggunakan gambar distroless yang hanya menyertakan aplikasi Anda dan dependensi runtime. Mereka tidak berisi manajer paket atau shell. Gambar Distroless meningkatkan “sinyal ke noise pemindai dan mengurangi beban menetapkan asal sesuai dengan apa yang Anda butuhkan.” Untuk informasi lebih lanjut, lihat GitHub dokumentasi tentang distroless.

Docker memiliki mekanisme untuk membuat gambar dari gambar yang dicadangkan dan minimal yang dikenal sebagai scratch. Untuk informasi selengkapnya, lihat Membuat gambar induk sederhana menggunakan scratch di dokumentasi Docker. Dengan bahasa seperti Go, Anda dapat membuat biner tertaut statis dan mereferensikannya di Dockerfile Anda. Contoh berikut menunjukkan bagaimana Anda dapat mencapai ini.

############################ # STEP 1 build executable binary ############################ FROM golang:alpine AS builder # Install git. # Git is required for fetching the dependencies. RUN apk update && apk add --no-cache git WORKDIR $GOPATH/src/mypackage/myapp/ COPY . . # Fetch dependencies. # Using go get. RUN go get -d -v # Build the binary. RUN go build -o /go/bin/hello ############################ # STEP 2 build a small image ############################ FROM scratch # Copy our static executable. COPY --from=builder /go/bin/hello /go/bin/hello # Run the hello binary. ENTRYPOINT ["/go/bin/hello"] This creates a container image that consists of your application and nothing else, making it extremely secure.

Contoh sebelumnya juga merupakan contoh build multi-tahap. Jenis build ini menarik dari sudut pandang keamanan karena Anda dapat menggunakannya untuk meminimalkan ukuran gambar akhir yang didorong ke registri kontainer Anda. Gambar kontainer tanpa alat build dan biner asing lainnya meningkatkan postur keamanan Anda dengan mengurangi permukaan serangan gambar. Untuk informasi selengkapnya tentang build multi-tahap, lihat Multi-stage build dalam Docker dokumentasi.

Pindai gambar Anda untuk mencari kerentanan

Mirip dengan rekan-rekan mesin virtual mereka, gambar kontainer dapat berisi binari dan pustaka aplikasi dengan kerentanan atau mengembangkan kerentanan dari waktu ke waktu. Cara terbaik untuk melindungi dari eksploitasi adalah dengan memindai gambar Anda secara teratur dengan pemindai gambar.

Amazon ECR menyediakan dua versi pemindaian dasar yang menggunakan database Common Vulnerabilities and Exposures (CVEs):

  • AWS pemindaian dasar AWS asli — Menggunakan teknologi asli, yang sekarang GA dan direkomendasikan. Pemindaian dasar yang ditingkatkan ini dirancang untuk memberi pelanggan hasil pemindaian yang lebih baik dan deteksi kerentanan di berbagai sistem operasi populer. Hal ini memungkinkan pelanggan untuk lebih memperkuat keamanan gambar kontainer mereka. Semua registri pelanggan baru dipilih ke dalam versi yang ditingkatkan ini secara default.

  • Pemindaian dasar Clair - Versi pemindaian dasar sebelumnya yang menggunakan proyek Clair sumber terbuka dan tidak digunakan lagi. Untuk informasi lebih lanjut tentang Clair, lihat Clair on. GitHub

Pem AWS indaian dasar asli dan Clair didukung di semua wilayah yang terdaftar di AWS Layanan berdasarkan Wilayah, kecuali yang ditambahkan setelah September 2024. Karena dukungan Clair tidak digunakan lagi, Clair tidak akan didukung di wilayah baru karena ditambahkan dan tidak akan lagi didukung di semua wilayah mulai 1 Oktober 2025.

Amazon ECR menggunakan tingkat keparahan untuk CVE dari sumber distribusi hulu jika tersedia. Jika tidak, skor Common Vulnerability Scoring System (CVSS) digunakan. Skor CVSS dapat digunakan untuk mengetahui tingkat kepelikan kelemahan NVD. Untuk informasi selengkapnya, lihat Tingkat kepelikan kelemahan NVD.

Anda juga dapat melihat hasil pemindaian dari dalam konsol Amazon ECR atau dengan memanggil DescribeImageScanFindings API. Gambar dengan ker CRITICAL entanan HIGH atau harus dihapus atau dibangun kembali. Jika gambar yang telah digunakan mengembangkan kerentanan, itu harus diganti sesegera mungkin.

Docker Desktop Edge versi 2.3.6.0 atau yang lebih baru dapat mem indai gambar lokal. Pemindaian didukung oleh Snyk, layanan keamanan aplikasi. Ketika kerentanan ditemukan, Snyk mengidentifikasi lapisan dan dependensi dengan kerentanan di Dockerfile. Ini juga merekomendasikan alternatif yang aman seperti menggunakan gambar dasar yang lebih ramping dengan kerentanan yang lebih sedikit atau memutakhirkan paket tertentu ke versi yang lebih baru. Dengan menggunakan Docker scan, pengembang dapat menyelesaikan masalah keamanan potensial sebelum mendorong gambar mereka ke registri.

Hapus izin khusus dari gambar Anda

Hak akses menandai setuid dan setgid memungkinkan menjalankan file yang dapat dieksekusi dengan izin pemilik atau grup yang dapat dieksekusi. Hapus semua binari dengan hak akses ini dari gambar Anda karena binari ini dapat digunakan untuk meningkatkan hak istimewa. Pertimbangkan untuk menghapus semua shell dan utilitas seperti nc dan curl yang dapat digunakan untuk tujuan jahat. Anda dapat menemukan file dengan setuid dan hak setgid akses dengan menggunakan perintah berikut.

find / -perm /6000 -type f -exec ls -ld {} \;

Untuk menghapus izin khusus ini dari file-file ini, tambahkan arahan berikut ke image kontainer Anda.

RUN find / -xdev -perm /6000 -type f -exec chmod a-s {} \; || true

Buat satu set gambar yang dikuratori

Daripada mengizinkan pengembang untuk membuat gambar mereka sendiri, buat satu set gambar yang diperiksa untuk tumpukan aplikasi yang berbeda di organisasi Anda. Dengan demikian, pengembang dapat melepaskan pembelajaran cara menyusun Dockerfiles dan berkonsentrasi pada penulisan kode. Saat perubahan digabungkan ke basis kode Anda, CI/CD pipeline dapat secara otomatis mengkompilasi aset dan kemudian menyimpannya di repositori artefak. Dan, terakhir, salin artefak ke gambar yang sesuai sebelum mendorongnya ke registri Docker seperti Amazon ECR. Paling tidak Anda harus membuat satu set gambar dasar yang dapat digunakan pengembang untuk membuat Dockerfiles mereka sendiri. Anda harus menghindari menarik gambar dari Docker Hub. Anda tidak selalu tahu apa yang ada di gambar dan gambar dapat memiliki kerentanan.

Pindai paket aplikasi dan pustaka untuk mencari kerentanan

Penggunaan pustaka open source sekarang umum. Seperti sistem operasi dan paket OS, pustaka ini dapat memiliki kerentanan. Sebagai bagian dari siklus pengembangan, pustaka ini harus dipindai dan diperbarui ketika kerentanan kritis ditemukan.

Docker Desktop melakukan pemindaian lokal menggunakan Snyk. Ini juga dapat digunakan untuk menemukan kerentanan dan potensi masalah lisensi di perpustakaan sumber terbuka. Ini dapat diintegrasikan langsung ke alur kerja pengembang yang memberi Anda kemampuan untuk mengurangi risiko yang ditimbulkan oleh pustaka sumber terbuka. Untuk informasi selengkapnya, lihat topik berikut:

Lakukan analisis kode statis

Anda harus melakukan analisis kode statis sebelum membangun image kontainer. Ini dilakukan terhadap kode sumber Anda dan digunakan untuk mengidentifikasi kesalahan pengkodean dan kode yang dapat dieksploitasi oleh aktor jahat, seperti suntikan kesalahan. Anda dapat menggunakan Amazon Inspector. Untuk informasi selengkapnya, lihat Memindai gambar wadah Amazon ECR dengan Amazon Inspector di Panduan Pengguna Amazon Inspector.

Jalankan wadah sebagai pengguna non-root

Anda harus menjalankan kontainer sebagai pengguna non-root. Secara default, container berjalan sebagai root pengguna kecuali direktif diser USER takan dalam Dockerfile Anda. Kemampuan Linux default yang ditetapkan oleh Docker membatasi tindakan yang dapat dijalankan sebagairoot, tetapi hanya sedikit. Misalnya, wadah yang berjalan seperti root masih tidak diizinkan untuk mengakses perangkat.

Sebagai bagian dari CI/CD pipeline Anda, Anda harus memberi tahu Dockerfiles untuk mencari direk USER tif dan gagal membangun jika hilang. Untuk informasi selengkapnya, lihat topik berikut:

  • Dockerfile-lintadalah alat sumber terbuka dari RedHat yang dapat digunakan untuk memeriksa apakah file sesuai dengan praktik terbaik.

  • Hadolint adalah alat lain untuk membangun gambar Docker yang sesuai dengan praktik terbaik.

Gunakan sistem file root read-only

Anda harus menggunakan sistem file root read-only. Sistem file root kontainer dapat ditulis secara default. Ketika Anda mengonfigurasi wadah dengan sistem file root RO (read-only), itu memaksa Anda untuk secara eksplisit menentukan di mana data dapat disimpan. Ini mengurangi permukaan serangan Anda karena sistem file container tidak dapat ditulis kecuali izin diberikan secara khusus.

catatan

Memiliki sistem file root read-only dapat menyebabkan masalah dengan paket OS tertentu yang diharapkan dapat menulis ke sistem file. Jika Anda berencana untuk menggunakan sistem file root read-only, uji secara menyeluruh terlebih dahulu.

Konfigurasikan tugas dengan batas CPU dan Memori (Amazon EC2)

Anda harus mengkonfigurasi tugas dengan batas CPU dan memori untuk meminimalkan risiko berikut. Batas sumber daya tugas menetapkan batas atas untuk jumlah CPU dan memori yang dapat dicadangkan oleh semua wadah dalam tugas. Jika tidak ada batasan yang ditetapkan, tugas memiliki akses ke CPU dan memori host. Hal ini dapat menyebabkan masalah di mana tugas yang diterapkan pada host bersama dapat membuat tugas lain dari sumber daya sistem kelaparan.

catatan

Amazon ECS pada AWS Fargate tugas mengharuskan Anda menentukan batas CPU dan memori karena menggunakan nilai-nilai ini untuk tujuan penagihan. Satu tugas yang menyita semua sumber daya sistem tidak menjadi masalah bagi Amazon ECS Fargate karena setiap tugas dijalankan pada instans khusus sendiri. Jika Anda tidak menentukan batas memori, Amazon ECS mengalokasikan minimal 4MB untuk setiap wadah. Demikian pula, jika tidak ada batas CPU yang ditetapkan untuk tugas tersebut, agen kontainer Amazon ECS menetapkan minimal 2 CPU.

Gunakan tag yang tidak dapat diubah dengan Amazon ECR

Dengan Amazon ECR, Anda dapat dan harus menggunakan gambar konfigurasi dengan tag yang tidak dapat diubah. Ini mencegah mendorong versi gambar yang diubah atau diperbarui ke repositori gambar Anda dengan tag yang identik. Ini melindungi dari penyerang yang mendorong versi gambar yang dikompromikan ke gambar Anda dengan tag yang sama. Dengan menggunakan tag yang tidak dapat diubah, Anda secara efektif memaksa diri Anda untuk mendorong gambar baru dengan tag yang berbeda untuk setiap perubahan.

Hindari menjalankan wadah sebagai hak istimewa (Amazon EC2)

Anda harus menghindari menjalankan wadah sebagai hak istimewa. Untuk latar belakang, kontainer berjalan sebagaimana privileged dijalankan dengan hak istimewa yang diperluas pada host. Ini berarti container mewarisi semua kemampuan Linux yang ditetapkan root pada host. Penggunaannya harus sangat dibatasi atau dilarang. Kami menyarankan untuk menyetel variabel lingkungan agen kontainer Amazon ECS ECS_DISABLE_PRIVILEGED true untuk mencegah kontainer berjalan seperti privileged pada host tertentu jika privileged tidak diperlukan. Atau Anda dapat menggunakan AWS Lambda untuk memindai definisi tugas Anda untuk penggunaan privileged parameter.

catatan

Menjalankan wadah karena privileged tidak didukung di Amazon ECS aktif. AWS Fargate

Hapus kemampuan Linux yang tidak perlu dari wadah

Berikut ini adalah daftar kemampuan Linux default yang ditetapkan untuk kontainer Docker. Untuk informasi selengkapnya tentang setiap kemampuan, lihat Ringkasan Kemampuan Linux.

CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_FOWNER, CAP_FSETID, CAP_KILL, CAP_SETGID, CAP_SETUID, CAP_SETPCAP, CAP_NET_BIND_SERVICE, CAP_NET_RAW, CAP_SYS_CHROOT, CAP_MKNOD, CAP_AUDIT_WRITE, CAP_SETFCAP

Jika wadah tidak memerlukan semua kemampuan kernel Docker yang tercantum di atas, pertimbangkan untuk menjatuhkannya dari wadah. Untuk informasi selengkapnya tentang setiap kemampuan kernel Docker, lihat KernelCapabilities. Anda dapat mengetahui kemampuan mana yang digunakan dengan melakukan hal berikut:

  • Instal paket OS libcap-ng dan jalankan pscap utilitas untuk mencantumkan kemampuan yang digunakan setiap proses.

  • Anda juga dapat menggunakan capsh untuk menguraikan kemampuan mana yang digunakan proses.

Gunakan kunci yang dikelola pelanggan (CMK) untuk mengenkripsi gambar yang didorong ke Amazon ECR

Anda harus menggunakan kunci yang dikelola pelanggan (CMK) untuk mengenkripsi gambar yang didorong ke Amazon ECR. Gambar yang didorong ke Amazon ECR secara otomatis dienkripsi saat diam dengan kunci AWS Key Management Service ter AWS KMS kelola (). Jika Anda lebih suka menggunakan kunci Anda sendiri, Amazon ECR sekarang mendukung AWS KMS enkripsi dengan kunci yang dikelola pelanggan (CMK). Sebelum mengaktifkan enkripsi sisi server dengan CMK, tinjau Pertimbangan yang tercantum dalam dokumentasi tentang enkripsi saat diam.