Apa praktik terbaik dan komprehensif untuk dipertimbangkan ketika menjalankan buruh pelabuhan dalam produksi?

42

Akhirnya, Anda sangat mencintai Docker sehingga Anda ingin memindahkan sistem produksi kritis bisnis online Anda dengan data pelanggan yang sensitif ke Docker Swarm. Beberapa bahkan mungkin sudah melakukannya. Organisasi lain tidak mampu membelinya dengan kebijakan yang melarang proses produksi berjalan dalam mode root.

Apa yang bisa menjadi daftar periksa blok bangunan untuk dipertimbangkan bagi lingkungan produksi Docker? Seseorang tidak membutuhkan semuanya, tetapi semuanya harus penting untuk dinilai.

Penafian: Saya tahu ada kebijakan SE untuk menghindari "daftar besar tanpa akhir" tetapi saya pikir daftar periksa ini tidak boleh terlalu besar ... dan tidak ada habisnya sekarang.

Jadi - apa blok bangunan ini?

  1. Jika belum dikerahkan, pertimbangkan untuk menjalankan sistem host Linux dengan pengaturan keamanan tingkat lanjut - kernel yang diperkeras, SELinux dll.
  2. Pertimbangkan untuk menggunakan gambar dasar Docker yang kecil, seperti alpine, busybox, atau bahkan goresan misalnya, mulailah dengan gambar dasar yang kosong
  3. Gunakan pengaturan USER selain root
  4. Hati-hati menilai untuk lebih lanjut mengurangi set kemampuan kernel yang sudah menyusut yang diberikan kepada container
  5. Pertimbangkan hanya memiliki satu biner yang dapat dieksekusi per kontainer untuk meluncurkan proses Anda, yang terhubung secara ideal
  6. Mereka yang ingin membobol sistem Anda untuk mendapatkan akses shell mungkin bertanya-tanya apakah mereka menemukan wadah Anda telah menonaktifkan semua shell
  7. Pasang volume hanya baca jika hanya memungkinkan

Pertanyaan: apa lagi?

Peter
sumber
Saya menemukan ini sangat luas. Tetapi pada saat yang sama, saya menyukai pertanyaan itu. Jadi, saya akan membiarkan komunitas memutuskan ini :)
Dawny33
Apa artinya tag devsecops?
030
Bisakah Anda menjelaskan mengapa ini Consider using a tiny Docker base image, like alpine, busybox or even scratch e.g. start with an empty base imagemeningkatkan keamanan?
030
3
@ 030 semakin sedikit Anda menginstal, semakin baik Anda dapat melindungi terhadap layanan / perangkat lunak yang tidak diperlukan yang kurang terpelihara dan / atau berpotensi dieksploitasi. Pengupasan ke minimum akan selalu bekerja lebih baik karena setiap wadah seharusnya digunakan untuk melayani satu layanan.
Leon

Jawaban:

23

Tuan rumah di mana wadah berjalan

Jalankan bangku keamanan buruh pelabuhan di setiap simpul yang menjalankan wadah buruh pelabuhan https://github.com/docker/docker-bench-security

Menjalankan perintah berikut pada node yang menjalankan wadah buruh pelabuhan:

docker run -it --net host --pid host --cap-add audit_control \
    -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
    -v /var/lib:/var/lib \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/lib/systemd:/usr/lib/systemd \
    -v /etc:/etc --label docker_bench_security \
    docker/docker-bench-security

mengembalikan daftar cek:

[INFO] 1 - Host Configuration

[WARN] 1.1  - Ensure a separate partition for containers has been created

[NOTE] 4.2  - Ensure that containers use trusted base images

[PASS] 4.6  - Ensure HEALTHCHECK instructions have been added to the container image

Kutipan dari repositori README:

Docker Bench for Security adalah skrip yang memeriksa puluhan praktik terbaik umum seputar penerapan wadah Docker dalam produksi. Semua pengujian dilakukan secara otomatis, dan terinspirasi oleh Benchmark Edisi Komunitas CIS Docker v1.1.0 .

Beberapa masalah yang dilaporkan oleh bangku keamanan dapat diselesaikan dengan membaca artikel keamanan buruh pelabuhan resmi dan membandingkannya dengan peluru yang didefinisikan dalam pertanyaan hal-hal berikut juga penting:

  • melindungi soket daemon buruh pelabuhan dengan menerapkan ssl
  • kepercayaan konten menggunakan notaris dan DOCKER_CONTENT_TRUSTvariabel
030
sumber
7

Docker masih dalam pengembangan.

Seperti halnya setiap bug perangkat lunak lain di-dev akan terjadi, fitur tidak aman mungkin ditambahkan, mungkin ada kekurangan arsitektur yang mengarah pada pelanggaran keamanan. Jangan meremehkan ini! Sistem Anda mungkin benar-benar aman hari ini, tetapi dengan tambalan mulai minggu depan seseorang menemukan bug, menulis exploit, dan tiba-tiba sistem Anda terbuka lebar.

Kecuali Anda harus, jangan perbarui ke versi terbaru. Sebaliknya, gunakan versi teruji yang terbaru.

Docker bukan virtualisasi

Jika seseorang melarikan diri dari wadah Docker, penyerang itu ada di mesin yang sebenarnya segera. Tidak ada gerbang kedua seperti virtualisasi yang akan mencegah pelanggaran.

Perlakukan wadah Docker seperti program lain. Jalankan dengan hak pengguna serendah mungkin, blok semua lalu lintas jaringan yang tidak diperlukan, virtualkan seluruh host Docker jika kinerja memungkinkan.

Docker tidak ada perlindungan

Kode apa pun yang dijalankan di dalam wadah Docker dijalankan tanpa pertanyaan dari Docker. Penyerang apa pun dapat menginstal perangkat lunaknya di dalam wadah, dan Docker akan menjalankannya seperti kode lainnya.

Selain hal-hal yang Anda sebutkan dalam pertanyaan, pertimbangkan untuk menggunakan metrik dan peringatan untuk mendapatkan pemberitahuan jika ada gambar Docker yang melakukan hal-hal aneh. Apakah ada lonjakan CPU yang tiba-tiba dan berkelanjutan? Apakah program tiba-tiba memindai port jaringan? Apakah ada akses disk yang mencurigakan? Anda harus mendapatkan pemberitahuan jika semua itu terjadi. Ada banyak alat yang tersedia untuk mengukur hal-hal ini, Anda harus menggunakannya.

Dua
sumber
7

Gambar Docker itu sendiri

Opsi tambahan adalah menggunakan Clair .

Clair adalah proyek sumber terbuka untuk analisis statis kerentanan dalam wadah aplikasi (saat ini termasuk appc dan buruh pelabuhan).

Secara berkala, Clair mencerna metadata kerentanan dari kumpulan sumber yang dikonfigurasi dan menyimpannya dalam database.

Klien menggunakan API Clair untuk mengindeks gambar wadah mereka; ini membuat daftar fitur yang ada dalam gambar dan menyimpannya dalam database.

Klien menggunakan API Clair untuk meminta pangkalan data tentang kerentanan gambar tertentu; mengkorelasikan kerentanan dan fitur dilakukan untuk setiap permintaan, menghindari kebutuhan untuk memindai ulang gambar.

Ketika pembaruan metadata kerentanan terjadi, pemberitahuan dapat dikirim ke sistem peringatan bahwa perubahan telah terjadi.

Tujuan kami adalah untuk memungkinkan pandangan yang lebih transparan tentang keamanan infrastruktur berbasis kontainer. Dengan demikian, proyek ini dinamai Clair setelah istilah Perancis yang diterjemahkan menjadi jelas, cerah, transparan.

030
sumber
5

Selain poin di utas ini; berikut ini akan menjadi rekomendasi saya:

  • Dapatkan kontrol atas Docker PID1 dengan dumb-init
  • Jangan menjalankan buruh pelabuhan dalam produksi tanpa sistem orkestrasi wadah
    • Pilihlah dari Kubernetes, Mesos, Swarm dll.
  • Gunakan gosu untuk kontrol pengguna di dalam gambar buruh pelabuhan
  • Ikuti paradigma aplikasi 12 faktor, jika Anda menjalankan aplikasi stateful dalam wadah, ubahlah.
    • Jika Anda benar-benar perlu menjalankan aplikasi stateful (mysql, zookeeper, elasticsearch) dalam wadah, gunakan paradigma orkestrator seperti Kubernetes Statefulsets
  • Lakukan manajemen rahasia / konfigurasi yang kuat dengan alat-alat seperti hashicorp vault / consul
  • Kirim wadah yang sama yang dibangun oleh para pengembang untuk mendorong melalui pipa CI yang membawanya melalui pementasan, tes integrasi secara menyeluruh.
  • Buat pemberitahuan di sekitar CVE dan tambalan, memicu build di tambalan-beri tahu
  • Memiliki logging yang luas untuk mendapatkan wawasan tentang wadah yang sedang berjalan, Anda tidak ingin memberikan akses SSH devs ke host atau wadah
    • rekomendasi: fluentd
  • Memiliki metrik penampung dan host
    • rekomendasi: prometheus + simpul-eksportir
Hashfyre
sumber
2

Jika Anda mengisi titik masuk buruh pelabuhan dengan sedperintah, pertimbangkan praktik ini:

  • Gunakan alat seperti confd untuk mengelola file konfigurasi gambar buruh pelabuhan Anda dan tetap perbarui

Confd akan membaca data dari banyak toko nilai kunci yang didukung dan membuat templat konfigurasi secara dinamis.

Vincenzo Pii
sumber
0

Seseorang dapat menggunakan A2D untuk memanggang aplikasi menjadi gambar buruh pelabuhan sambil mempertimbangkan hal-hal tertentu, misalnya non-root, izin, lokasi aplikasi:

docker run -v $PWD:/projectName utrecht/a2d:1.0.0 \
       -projectName someProjectName -dockerfile /projectName/Dockerfile

pengembalian:

FROM golang:1.12.4-alpine as builder
COPY . ./someProjectName/
WORKDIR someProjectName
RUN adduser -D -g '' someProjectName && \
    apk add git && \
    CGO_ENABLED=0 go build && \
    cp someProjectName /someProjectName && \
    chmod 100 /someProjectName

FROM scratch
COPY --from=builder /etc/group /etc/group
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder --chown=someProjectName:someProjectName /someProjectName /usr/local/someProjectName
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
USER someProjectName
ENTRYPOINT ["/usr/local/someProjectName"]
030
sumber