Membatasi akses jaringan wadah Docker

14

Saya sedang dalam proses membuat wadah Docker hanya SFTP , yang akan digunakan oleh banyak orang untuk tujuan mengunggah dan mengelola file di chrootLingkungan ed mereka sendiri .

Di atas kertas, ini cukup aman: Saya akan menonaktifkan setiap bentuk bashlogin, dan saya tidak akan menjalankan proses lain di dalamnya. Namun saya ingin mengeraskannya sedikit lagi:

Saya ingin mencegah wadah ini mengakses Internet dari dalam, kecuali untuk tujuannya menjadi server SFTP.

Untuk memperjelas: Saya tahu bagaimana mencegah dunia luar mengakses wadah saya - saya dapat mengatur iptablesaturan yang masuk , dan saya hanya dapat mengekspos port SFTP di perintah run docker saya.

Namun saya ingin membuat perintah berikut (sebagai contoh) gagal, ketika dijalankan di dalam wadah:

curl google.com

Tujuan saya adalah untuk mengurangi jumlah kerusakan yang dapat dilakukan oleh wadah yang diretas (tidak dapat digunakan untuk mengirim email spam, dll.).

Daniel S
sumber
Ada beberapa permintaan fitur tertunda yang dapat membantu dengan jenis barang ini. # 6743 yang memungkinkan Anda membuat aturan iptables di host sebelum wadah dimulai, dan # 6982 yang memungkinkan Anda menambahkan aturan iptables saat wadah dimulai.
Patrick
Docker memberi Anda kendali penuh atas antarmuka jaringan kontainer; lihat bagaimana Docker jaringan wadah . Misalnya, pengaturan --net=nonebendera pada docker runakan menonaktifkan semua adapter jaringan eksternal, memungkinkan Anda untuk menambahkan sendiri dan menyesuaikan aturan lalu lintas jaringan.
sffc

Jawaban:

4

Masuk akal untuk memasukkan beberapa aturan masuk ke dalam instance docker Anda untuk membantu menangkal serangan, tetapi Anda harus membatasi akses outbound (Internet) dari router upstream apa pun yang dihubungkan dengan gambar buruh pelabuhan. Alasan untuk ini adalah, jika Anda mencoba untuk memblokir akses keluar dengan aturan firewall di dalam instance Anda, maka jika instance tersebut dikompromikan aturan-aturan itu dapat dihapus oleh penyerang. Dengan memblokir jalan keluar melalui router instance, Anda memblokir akses keluar bahkan jika terjadi kompromi - penyerang harus mengkompromikan router juga.


Ok, jadi setelah menerima beberapa komentar yang menjelaskan bahwa pemfilteran dimaksudkan untuk host penampung, sedikit lebih jelas apa yang ingin dicapai. Dalam hal ini, pada host, Anda akan menambahkan beberapa aturan yang mirip dengan ini:

iptables -A FORWARD -s lo.cal.sub.net -d con.tai.ner.ip -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d lo.cal.sub.net -j ACCEPT
iptables -A FORWARD -s ! lo.cal.sub.net -d con.tai.ner.ip -p tcp --dport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d ! lo.cal.sub.net -p tcp --sport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -m state --state related,established -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -j DROP

Dua aturan pertama adalah untuk akses antara tuan rumah dan wadah. Aturan ketiga mengatakan (secara kasar) bahwa apa pun yang bukan subnet tuan rumah yang menuju ke SFTP tidak apa-apa oleh kami; yang keempat adalah aturan keluar yang pada dasarnya adalah kembar ke tiga; aturan kelima adalah catch-all (jika ada port terkait lainnya yang digunakan), meskipun seharusnya tidak diperlukan, Anda mungkin bisa menghapusnya; aturan terakhir adalah keajaiban yang mencegah akses ke apa pun selain subnet host. Karena akses diberikan dalam beberapa aturan pertama, itu tidak akan pernah terpicu kecuali tidak ada aturan sebelumnya yang berlaku, dalam hal ini kami mengatakan "kami tidak peduli apa yang Anda inginkan, Anda tidak cocok dengan apa pun yang Anda setujui, jadi kamu tidak bisa sampai di sana dari sini ". Lalu lintas masuk dari luar akan dipenuhi oleh aturan ke-3 dan ke-4.

Avery Payne
sumber
Downvote menarik, mengingat bahwa tidak ada cara untuk melakukan ini di dalam wadah tanpa memiliki kepercayaan mutlak pada isi wadah .
Avery Payne
Perute upstream router docker (dengan asumsi konfigurasi default yang paling didukung) adalah host yang menjalankannya, dan kami sedang mencari cara menonaktifkan akses Internet satu kontainer pada host itu (tidak di dalam wadah) sementara tidak merusak fungsionalitas docker lainnya .
Tarnay Kálmán
(menghela nafas) Aku benar-benar tidak boleh menulis ulang jawaban saya saat hanya 6 jam tidur. Saya telah mengubah jawaban yang diberikan.
Avery Payne
Docker (dengan asumsi konfigurasi yang paling didukung default) menerbitkan port kontainer pada host melalui proxy userspace tcp, jadi saya tidak yakin apakah rantai penerusan bahkan relevan untuk aturan mengenai layanan sftp.
Tarnay Kálmán
Kira saya harus mengatur lingkungan pengujian dan mengeluarkan Docker, dan melihat apa yang terlibat. Sepertinya Anda menyarankan aturan harus dipindahkan dari depan ke input.
Avery Payne
1

Ini bukan masalah khusus buruh pelabuhan. Ada beberapa cara untuk menyelesaikannya.

  1. Gunakan iptablesaturan stateful untuk mengizinkan koneksi masuk dan lalu lintas terkait / mapan kemudian memblokir segala sesuatu yang lain.

  2. Gunakan layanan sftp saja seperti ProFTPD yang tidak mampu menjalankan shell.

Secara umum, jika Anda tidak mengizinkan pengguna untuk mendapatkan shell dan tidak mengizinkan mereka untuk menjalankan program dari dalam wadah, Anda tidak perlu khawatir tentang hal itu.

Randall Smith
sumber
1.) Docker menetapkan beberapa aturan sendiri secara default, dan menambahkannya tidak akan melakukan apa-apa karena sudah ada aturan catch-allish, dan menambahkannya akan merusak fungsi yang ada (seperti tautan) jika tidak hati-hati, jadi tidak sepele itu. 2.) Tidak menjawab pertanyaan. Dan OP sudah mengaturnya seperti itu. Juga, use case saya berbeda.
Tarnay Kálmán
0

Ini hanya curah pendapat singkat, dan saya belum mengujinya. Anda akan ingin memeriksanya di laboratorium sebelum membawanya ke produksi.

Untuk mencegah lalu lintas keluar pada non-SSH (SFTP) dan port Web, Anda mungkin ingin menerapkan kebijakan melalui IPTABLES atau firewall Layer4 lain untuk MENGHENTIKAN atau lalu lintas TOLAK yang bersumber dari segmen yang digunakan oleh wadah buruh pelabuhan yang ditujukan ke 0.0.0.0/0 kecuali saat Tujuan Port adalah TCP22.

Untuk memecahkan masalah going-to-unapprove-places-on-the-web, Anda mungkin ingin mencoba menyiapkan instance dari filtering / caching proxy, seperti squid atau bluecoat, yang mendengarkan pada interface docker0 dan yang menggunakan rute defalt tuan rumah untuk keluar ke internet. Dari sana, Anda dapat menerapkan kebijakan berdasarkan banyak kriteria, serta menghemat penggunaan jaringan dengan caching konten statis. Anda mungkin ingin menggunakan NAT (saya pikir IPTABLES dan Masquerade menyediakan ini di Linux) pada mesin host untuk menegakkan penggunaan proxy secara transparan (saya jelaskan ini dalam tanggapan saya untuk saya ingin proxy hanya HTTP tapi saya tidak yakin apa yang harus lakukan dengan lalu lintas HTTPS ). Ini menyiratkan memiliki alasan untuk masuk ke web di tempat pertama yang mematuhi kebijakan perusahaan Anda.

Karena sifat SSH (yang menjadi dasar SFTP), Anda tidak akan dapat memberikan larangan lalu lintas untuk pemindahan file kecuali jika Anda menerapkan kebijakan di mana kontainer hanya dapat menggunakan pasangan kunci yang disediakan oleh Anda. Ini bagus untuk Anda, karena memberi Anda " Saya tidak memiliki visibilitas atau kendali atas file yang ditransfer"Pertahanan jika salah satu pelanggan Anda mentransfer sesuatu yang ilegal (seperti pelanggaran IP, atau menggunakan layanan Anda untuk memeras informasi yang membawa label klasifikasi, atau mereka berdagang di CP), jika Anda dibawa ke pengadilan untuk melakukan sesuatu yang dilakukan pelanggan Anda (anggap analogi dengan status common-carrier untuk perusahaan telekomunikasi) Ini buruk bagi Anda karena Anda tidak dapat melakukan cache yang sering ditransfer kembali, file yang tidak berubah, dan karena kebijakan apa pun yang Anda tulis dalam kontrak dengan pelanggan Anda pada dasarnya tidak dapat diberlakukan melalui cara teknis.

DTK
sumber