Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Praktik terbaik keamanan ECS tugas dan wadah Amazon
Anda harus mempertimbangkan gambar kontainer sebagai garis pertahanan pertama Anda terhadap serangan. Gambar yang tidak aman dan tidak dibangun dengan baik dapat memungkinkan penyerang melarikan diri dari batas-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 minimal atau gunakan gambar distroless
Mulailah dengan menghapus semua binari asing dari gambar kontainer. Jika Anda menggunakan gambar yang tidak dikenal dari Galeri ECR Publik Amazon, periksa gambar untuk merujuk ke konten setiap lapisan penampung. Anda dapat menggunakan aplikasi seperti Dive
Atau, Anda dapat menggunakan gambar distroless yang hanya menyertakan aplikasi Anda dan dependensi runtime-nya. 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 minimal yang dicadangkan yang dikenal sebagai scratch. Untuk informasi selengkapnya, lihat Membuat gambar induk sederhana menggunakan scratch
############################ # 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 binari asing lainnya meningkatkan postur keamanan Anda dengan mengurangi permukaan serangan gambar. Untuk informasi selengkapnya tentang build multi-tahap, lihat membuat build multi-tahap
Pindai gambar Anda untuk 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 terhadap eksploitasi adalah dengan memindai gambar Anda secara teratur dengan pemindai gambar.
Gambar yang disimpan di Amazon ECR dapat dipindai saat push atau on-demand (setiap 24 jam sekali). Pemindaian ECR dasar Amazon menggunakan ClairCRITICAL
kerentanan 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
-
Mengotomatiskan kepatuhan gambar menggunakan Amazon ECR dan AWS Security Hub
menjelaskan cara memunculkan informasi kerentanan dari Amazon ECR AWS Security Hub dan mengotomatiskan remediasi dengan memblokir akses ke gambar yang rentan.
Hapus izin khusus dari gambar Anda
Hak akses menandai setuid
dan setgid
memungkinkan menjalankan executable 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 gambar 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 mengabaikan belajar bagaimana menulis Dockerfiles dan berkonsentrasi pada penulisan kode. Saat perubahan digabungkan ke dalam basis kode Anda, pipeline CI/CD dapat secara otomatis mengkompilasi aset dan kemudian menyimpannya dalam repositori artefak. Dan, terakhir, salin artefak ke gambar yang sesuai sebelum mendorongnya ke registri Docker seperti Amazon. ECR Setidaknya Anda harus membuat satu set gambar dasar yang dapat dibuat oleh pengembang Dockerfiles mereka sendiri. Anda harus menghindari menarik gambar dari Docker Hub. Anda tidak selalu tahu apa yang ada dalam gambar dan sekitar seperlima dari 1000 gambar teratas memiliki kerentanan. Daftar gambar-gambar tersebut dan kerentanannya dapat ditemukan di https://vulnerablecontainers.org/.
Pindai paket aplikasi dan pustaka untuk mencari kerentanan
Penggunaan pustaka open source sekarang umum. Seperti halnya sistem operasi dan paket OS, pustaka ini dapat memiliki kerentanan. Sebagai bagian dari siklus hidup pengembangan, pustaka ini harus dipindai dan diperbarui saat kerentanan kritis ditemukan.
Docker Desktop melakukan pemindaian lokal menggunakan Snyk. Ini juga dapat digunakan untuk menemukan kerentanan dan potensi masalah lisensi di perpustakaan open source. Ini dapat diintegrasikan langsung ke dalam alur kerja pengembang yang memberi Anda kemampuan untuk mengurangi risiko yang ditimbulkan oleh pustaka open source. Untuk informasi selengkapnya, lihat topik berikut.
-
Alat Keamanan Aplikasi Sumber Terbuka
mencakup daftar alat untuk mendeteksi kerentanan dalam aplikasi.
Lakukan analisis kode statis
Anda harus melakukan analisis kode statis sebelum membuat gambar 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 ECR penampung Amazon dengan Amazon Inspector di Panduan Pengguna Amazon Inspector.
Jalankan kontainer sebagai pengguna non-root
Anda harus menjalankan container sebagai pengguna non-root. Secara default, container berjalan sebagai root
pengguna kecuali USER
direktif disertakan dalam Dockerfile Anda. Kemampuan default Linux yang ditetapkan oleh Docker membatasi tindakan yang dapat dijalankan sebagairoot
, tetapi hanya sedikit. Misalnya, kontainer yang berjalan seperti root
masih tidak diizinkan untuk mengakses perangkat.
Sebagai bagian dari pipeline CI/CD Anda, Anda harus lint Dockerfiles untuk mencari USER
arahan dan gagal membangun jika tidak ada. Untuk informasi selengkapnya, lihat topik berikut.
-
DockerFile-Lint
adalah alat sumber terbuka RedHat yang dapat digunakan untuk memeriksa apakah file tersebut 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 container dapat ditulis secara default. Saat Anda mengonfigurasi wadah dengan sistem file root RO
(hanya-baca), 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 sebelumnya.
Konfigurasikan tugas dengan CPU dan batas Memori (AmazonEC2)
Anda harus mengonfigurasi tugas dengan CPU dan batas 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 host CPU dan memori. Hal ini dapat menyebabkan masalah di mana tugas yang diterapkan pada host bersama dapat membuat tugas-tugas lain dari sumber daya sistem kelaparan.
catatan
Amazon ECS pada AWS Fargate tugas mengharuskan Anda menentukan CPU dan batas memori karena menggunakan nilai ini untuk tujuan penagihan. Satu tugas memonopoli semua sumber daya sistem tidak menjadi masalah bagi Amazon ECS Fargate karena setiap tugas dijalankan pada instance khusus sendiri. Jika Anda tidak menentukan batas memori, Amazon ECS mengalokasikan minimal 4MB untuk setiap kontainer. Demikian pula, jika tidak ada CPU batasan yang ditetapkan untuk tugas tersebut, agen ECS penampung Amazon menetapkannya minimal 2CPUs.
Gunakan tag yang tidak dapat diubah dengan Amazon ECR
Dengan AmazonECR, Anda dapat dan harus menggunakan konfigurasi gambar 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 terhadap penyerang yang mendorong versi gambar yang dikompromikan di atas 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 kontainer sebagai hak istimewa (AmazonEC2)
Anda harus menghindari menjalankan kontainer sebagai hak istimewa. Untuk latar belakang, kontainer dijalankan seperti privileged
yang dijalankan dengan hak istimewa yang diperluas pada host. Ini berarti wadah mewarisi semua kemampuan Linux yang ditetapkan root
pada host. Penggunaannya harus sangat dibatasi atau dilarang. Kami menyarankan untuk menyetel variabel lingkungan agen ECS penampung Amazon 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 seperti yang privileged
tidak didukung di Amazon ECS di 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 Ikhtisar 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 sebuah container tidak memerlukan semua kemampuan kernel Docker yang tercantum di atas, pertimbangkan untuk menjatuhkannya dari container. Untuk informasi selengkapnya tentang setiap kemampuan kernel Docker, lihat KernelCapabilities. Anda dapat mengetahui kemampuan mana yang digunakan dengan melakukan hal berikut:
Menggunakan kunci terkelola pelanggan (CMK) untuk mengenkripsi gambar yang didorong ke Amazon ECR
Anda harus menggunakan kunci terkelola pelanggan (CMK) untuk mengenkripsi gambar yang didorong ke AmazonECR. Gambar yang didorong ke Amazon secara otomatis ECR dienkripsi saat istirahat dengan kunci terkelola AWS Key Management Service (AWS KMS). Jika Anda lebih suka menggunakan kunci Anda sendiri, Amazon ECR sekarang mendukung AWS KMS enkripsi dengan kunci terkelola pelanggan (CMK). Sebelum mengaktifkan enkripsi sisi server dengan aCMK, tinjau Pertimbangan yang tercantum dalam dokumentasi tentang enkripsi saat istirahat.