Saya sedang dalam proses membuat wadah Docker hanya SFTP , yang akan digunakan oleh banyak orang untuk tujuan mengunggah dan mengelola file di chroot
Lingkungan ed mereka sendiri .
Di atas kertas, ini cukup aman: Saya akan menonaktifkan setiap bentuk bash
login, 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 iptables
aturan 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.).
--net=none
bendera padadocker run
akan menonaktifkan semua adapter jaringan eksternal, memungkinkan Anda untuk menambahkan sendiri dan menyesuaikan aturan lalu lintas jaringan.Jawaban:
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:
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.
sumber
Ini bukan masalah khusus buruh pelabuhan. Ada beberapa cara untuk menyelesaikannya.
Gunakan
iptables
aturan stateful untuk mengizinkan koneksi masuk dan lalu lintas terkait / mapan kemudian memblokir segala sesuatu yang lain.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.
sumber
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.
sumber