Bagaimana menangani pembaruan keamanan di dalam wadah Docker?

117

Saat menempatkan aplikasi ke server, biasanya ada pemisahan antara apa yang dibundel dengan aplikasi itu sendiri dan apa yang diharapkan dari platform (sistem operasi dan paket yang diinstal) untuk menyediakan. Satu poin dari ini adalah bahwa platform dapat diperbarui secara terpisah dari aplikasi. Ini berguna misalnya ketika pembaruan keamanan perlu diterapkan segera untuk paket yang disediakan oleh platform tanpa membangun kembali seluruh aplikasi.

Secara tradisional pembaruan keamanan telah diterapkan hanya dengan menjalankan perintah manajer paket untuk menginstal versi paket yang diperbarui pada sistem operasi (misalnya "pembaruan yum" pada RHEL). Tetapi dengan munculnya teknologi kontainer seperti Docker di mana gambar kontainer pada dasarnya bundel baik aplikasi dan platform, apa cara kanonik untuk menjaga sistem dengan wadah up to date? Host dan kontainer memiliki paket sendiri, independen, paket yang perlu diperbarui dan diperbarui pada host tidak akan memperbarui paket apa pun di dalam kontainer. Dengan rilis RHEL 7 yang menampilkan wadah Docker secara khusus, akan menarik untuk mendengar apa yang direkomendasikan oleh Redhat untuk menangani pembaruan keamanan wadah.

Pikiran pada beberapa opsi:

  • Membiarkan manajer pembaruan paket paket pada tuan rumah tidak akan memperbarui paket di dalam wadah.
  • Harus meregenerasi semua gambar kontainer untuk menerapkan pembaruan tampaknya mematahkan pemisahan antara aplikasi dan platform (memperbarui platform membutuhkan akses ke proses pembuatan aplikasi yang menghasilkan gambar Docker).
  • Menjalankan perintah manual di dalam masing-masing wadah yang berjalan tampaknya rumit dan perubahan berisiko ditimpa saat berikutnya wadah diperbarui dari artefak rilis aplikasi.

Jadi tidak ada satupun dari pendekatan ini yang memuaskan.

Markus Hallmann
sumber
1
Ide terbaik untuk ini yang pernah saya lihat sejauh ini adalah Project Atomic . Saya tidak berpikir itu cukup siap untuk prime time.
Michael Hampton
1
Valko, alur kerja apa yang akhirnya Anda dapatkan? Saya menjalankan wadah jangka panjang (hosting php-cgi, misalnya) dan apa yang saya temukan sejauh ini adalah: docker pull debian/jessieuntuk memperbarui gambar, lalu membangun kembali gambar saya yang sudah ada, kemudian menghentikan wadah dan menjalankannya lagi ( dengan gambar baru). Gambar yang saya buat memiliki nama yang sama dengan yang sebelumnya, jadi permulaan dilakukan melalui skrip. Saya kemudian menghapus gambar "tanpa nama". Saya pasti akan menghargai alur kerja yang lebih baik.
miha
1
miha: Kedengarannya mirip dengan apa yang akhirnya saya lakukan. Pada dasarnya terus memperbarui dan membangun kembali semua gambar sebagai bagian dari membuat rilis baru. Dan memulai kembali wadah menggunakan gambar baru.
Markus Hallmann
1
Jawaban terbaik di sini sangat membantu karena ada skrip yang berisi perintah utama untuk melakukan apa yang dikatakan Johannes Ziemke:
Hudson Santos
Pertanyaan menarik. Saya bertanya-tanya sendiri. Jika Anda memiliki 20 aplikasi yang berjalan pada satu host buruh pelabuhan, Anda harus meningkatkan gambar dasar, membangun kembali dan memulai kembali! Ada 20 aplikasi dan Anda bahkan tidak tahu apakah pembaruan keamanan memengaruhi semuanya, atau hanya salah satunya. Anda harus membangun kembali gambar untuk mengatakan Apache ketika pembaruan keamanan hanya mempengaruhi libpng misalnya. Jadi Anda berakhir dengan membangun kembali dan memulai kembali yang tidak perlu ...
Dalibor Filus

Jawaban:

47

Aplikasi bundel gambar Docker dan "platform", itu benar. Tetapi biasanya gambar terdiri dari gambar dasar dan aplikasi yang sebenarnya.

Jadi cara kanonik untuk menangani pembaruan keamanan adalah memperbarui gambar dasar, kemudian membangun kembali gambar aplikasi Anda.

Yohanes 'ikan' Ziemke
sumber
3
Terima kasih, ini masuk akal. Tetap saja ingin memperbarui platform sehingga untuk berbicara tidak perlu memicu pengemasan ulang seluruh aplikasi (pertimbangkan misalnya harus membangun kembali 100 gambar aplikasi yang berbeda karena satu gambar dasar mendapatkan pembaruan). Tapi mungkin ini tak terhindarkan dengan filosofi Docker tentang menyatukan semuanya dalam satu gambar.
Markus Hallmann
3
@ValkoSipuli Anda selalu dapat menulis skrip untuk mengotomatiskan prosesnya.
dsljanus
Mengapa tidak apt-get upgrade, upgrade dnf, pacman -syu, dll yang setara di dalam wadah? Anda bahkan dapat membuat skrip shell yang melakukan itu dan kemudian menjalankan aplikasi, kemudian menggunakannya sebagai titik masuk wadah sehingga ketika wadah dimulai / dihidupkan ulang itu meningkatkan semua paketnya.
Arthur Kay
8
@ArthurKay Dua alasan: 1) Anda meledakkan ukuran kontainer, karena semua paket yang ditingkatkan akan ditambahkan ke lapisan kontainer sambil tetap menyimpan paket yang sudah ketinggalan zaman pada gambar. 2) Ini mengalahkan keuntungan terbesar dari (wadah) gambar: Gambar yang Anda jalankan tidak sama dengan yang Anda buat / tes karena Anda mengubah paket saat runtime.
Johannes 'fish' Ziemke
7
Ada satu hal yang saya tidak mengerti: Jika Anda adalah perusahaan yang membeli perangkat lunak yang dikirim sebagai wadah buruh pelabuhan, apakah Anda harus menunggu pembuat perangkat lunak untuk membangun kembali paket aplikasi setiap kali masalah keamanan keluar ? Perusahaan mana yang akan melepaskan kendali atas kerentanan terbuka mereka dengan cara itu?
Sentenza
7

Wadah tersebut seharusnya ringan dan dapat dipertukarkan. Jika wadah Anda memiliki masalah keamanan, Anda membangun kembali versi wadah yang ditambal dan menggunakan wadah baru. (banyak kontainer menggunakan gambar dasar standar yang menggunakan alat manajemen paket standar seperti apt-get untuk menginstal dependensi mereka, membangun kembali akan menarik pembaruan dari repositori)

Meskipun Anda bisa menambal di dalam wadah, itu tidak akan skala dengan baik.

Paul R
sumber
0

Pertama-tama, banyak pembaruan Anda yang biasanya Anda jalankan di masa lalu tidak akan berada di dalam wadah itu sendiri. Wadah harus merupakan subset yang cukup ringan dan kecil dari sistem file lengkap yang biasa Anda lihat di masa lalu. Paket-paket yang harus Anda perbarui adalah paket-paket yang merupakan bagian dari DockerFile Anda, dan karena Anda memiliki DockerFile, Anda harus dapat melacak paket-paket dan ID kontainer yang membutuhkan pembaruan. Cloudstein UI yang akan segera dirilis melacak bahan DockerFile ini untuk Anda sehingga orang dapat membangun skema pembaruan yang paling cocok untuk wadah mereka. Semoga ini membantu

Ben Grissinger
sumber
-1

umumnya lebih buruk daripada tiga pilihan yang Anda berikan. Sebagian besar gambar buruh pelabuhan tidak dibangun dengan pengelola paket sehingga Anda tidak bisa langsung masuk ke gambar buruh pelabuhan dan mengeluarkan pembaruan. Anda harus membangun kembali atau mendapatkan kembali gambar buruh pelabuhan.

Fakta bahwa Anda perlu membangun kembali atau memandang orang lain untuk membangun kembali untuk patch keamanan tampaknya tidak masuk akal dalam banyak kasus.

Saya sedang mempertimbangkan untuk menggunakan sonarr dan radarr dalam wadah buruh pelabuhan tetapi mengetahui bahwa mereka tidak akan mendapatkan pembaruan keamanan reguler yang didapat wadah saya adalah pelanggar kesepakatan. Mengelola pembaruan keamanan untuk wadah saya cukup merepotkan tanpa harus berurusan dengan entah bagaimana harus secara manual menerapkan pembaruan keamanan untuk setiap gambar buruh pelabuhan secara individual.

Lee Burch
sumber
1
Posting Anda tidak akan dianggap sebagai jawaban, karena Anda tidak memberikan jawaban untuk pertanyaan itu. Silakan tambahkan itu sebagai komentar untuk pertanyaan dan hapus "jawaban" Anda. StackExchange bukan forum, tetapi harus dianggap sebagai T&J di mana para ahli menjawab pertanyaan yang dapat mereka berikan bantuan.
Phillip -Zyan K Lee- Stockmann