Mengamankan port Websocket di Docker melibatkan beberapa lapisan praktik terbaik yang mencakup keamanan jaringan, enkripsi, otentikasi, otorisasi, dan konfigurasi kontainer untuk menjaga kerahasiaan, integritas, dan ketersediaan komunikasi Websocket. Di bawah ini adalah penjelasan terperinci tentang praktik terbaik untuk mengamankan port Websocket di Docker:
Gunakan Secure Websocket Protocol (WSS)
Selalu gunakan Protokol Websocket yang aman (WSS: //), yang beroperasi di atas TLS (Transport Layer Security). Ini mengenkripsi data yang dikirimkan antara klien dan server, mencegah serangan menguping dan man-in-the-middle (MITM). Enkripsi memastikan kerahasiaan dan integritas pesan yang dikirim melalui koneksi WebSocket. Seperti HTTPS untuk situs web, WSS juga memungkinkan penggunaan fitur keamanan berbasis browser seperti keamanan transportasi yang ketat dan pemblokiran konten campuran, meningkatkan keamanan komunikasi secara keseluruhan. Hindari menggunakan protokol WS: // yang tidak terenkripsi kecuali jika Anda beroperasi sepenuhnya di lingkungan tepercaya di mana enkripsi tidak diperlukan.
otentikasi dan otorisasi
Karena koneksi WebSocket tidak secara native mendukung mekanisme otentikasi berbasis sesi seperti HTTP, sangat penting untuk mengimplementasikan sistem otentikasi Anda sendiri. Pendekatan umum termasuk otentikasi berbasis token menggunakan JWT (JSON Web Token) atau cookie selama jabat tangan peningkatan HTTP awal. Otentikasi harus terikat pada fase Websocket Handshake untuk memastikan hanya klien yang berwenang membuat koneksi.
Otorisasi harus ditegakkan berdasarkan per-pesan atau per tindakan, tidak hanya sekali pada tahap pembentukan koneksi. Ini mencegah peningkatan hak istimewa untuk pengguna yang tidak sah setelah mereka mendapatkan akses ke Websocket yang terbuka.
To enhance security against stolen or replayed tokens, consider using short-lived, scoped tokens or issuing ephemeral one-time tokens specifically for WebSocket connections. Token ini kedaluwarsa dengan cepat dan mengurangi risiko jika dikompromikan.
isolasi jaringan dan praktik terbaik jaringan buruh pelabuhan
Hindari memaparkan port kontainer langsung ke jaringan publik. Sebagai gantinya, tempatkan wadah yang menampung layanan Websocket di dalam jaringan jembatan Docker khusus untuk mengisolasi mereka dari layanan lain dan membatasi akses eksternal.
Buat jembatan jaringan Docker terpisah untuk grup kontainer yang berbeda. Misalnya, satu jaringan jembatan dapat merutekan lalu lintas yang masuk dari host ke wadah layanan WebSocket, dan jaringan internal pribadi yang berbeda dapat digunakan untuk komunikasi yang aman antara wadah Websocket dan layanan backend lainnya seperti database.
Hindari menggunakan jembatan jaringan Docker `Docker0` karena menghubungkan semua kontainer secara default, berpotensi memungkinkan gerakan lateral yang tidak diinginkan di dalam host Docker.
Gunakan jaringan overlay dengan enkripsi diaktifkan (`--opt terenkripsi`) saat menggunakan Docker Swarm atau Kubernetes untuk orkestrasi kontainer. Jaringan semacam itu mengenkripsi lalu lintas antar-node termasuk komunikasi WebSocket di dalam cluster, melindungi data dari intersepsi di lapisan jaringan.
Proxying dan Load Balancing
Jangan mengekspos port Websocket langsung ke Internet. Gunakan proxy terbalik seperti nginx, traefik, atau haproxy untuk merutekan lalu lintas websocket. Proxying memberikan banyak manfaat, termasuk:
- Pengakhiran TLS terpusat, sehingga instance Websocket Anda tidak harus mengelola sertifikat TLS secara langsung.
- Pemeriksaan Otentikasi Sebelum meneruskan koneksi untuk mendukung layanan WebSocket.
- Perutean lalu lintas berdasarkan aturan penyeimbangan beban atau perutean.
- Konfigurasi firewall yang disederhanakan karena hanya port proxy yang diekspos secara eksternal.
- Kontrol yang lebih baik atas header dan kebijakan keamanan.
Proksi juga mengurangi risiko karena paparan langsung port dapat memperumit aturan jaringan dan firewall, selain meningkatkan permukaan serangan.
Validasi dan sanitasi input
Karena koneksi WebSocket memungkinkan pesan sewenang -wenang setelah jabat tangan, penting untuk memvalidasi dan membersihkan semua data yang masuk secara ketat. Perlakukan semua data klien yang masuk sebagai tidak dipercaya. Lakukan validasi skema untuk format data terstruktur seperti JSON untuk memastikan muatan sesuai dengan norma yang diharapkan dan untuk mencegah serangan injeksi.
Validasi sisi server melindungi terhadap injeksi, data yang salah, dan berupaya mengeksploitasi kesalahan logika bisnis. Demikian pula, validasi sisi klien memastikan data yang diterima dari server aman untuk diproses, melindungi dari data yang dimanipulasi atau rusak.
membatasi dan pelambatan tingkat
Menerapkan tarif yang membatasi koneksi WebSocket dan pesan untuk bertahan terhadap serangan penolakan (DOS) atau penyalahgunaan layanan WebSocket. Batasi jumlah koneksi per alamat IP dan Kontrol Pesan Kirim tarif untuk mencegah banjir yang dapat mengkonsumsi sumber daya yang berlebihan atau menurunkan kualitas layanan.
Konfigurasi Kontainer Aman
- Jangan menjalankan wadah dengan hak istimewa root. Gunakan prinsip yang paling tidak privilege di mana wadah berjalan menggunakan pengguna non-root.
- Hindari pemasangan soket Docker Daemon (`/var/run/docker.sock`) di dalam wadah Websocket, karena ini secara efektif memberikan akses root ke host, yang berbahaya.
- Batasi kemampuan kontainer hanya untuk apa yang diperlukan untuk layanan WebSocket.
- Gunakan gambar dasar Docker resmi, minimal, dan diperbarui secara teratur untuk mengurangi permukaan serangan.
Manajemen Rahasia
Hindari rahasia hardcoding seperti tombol API, token, atau sertifikat dalam gambar kontainer atau kode sumber. Gunakan Rahasia Docker, Variabel Lingkungan, atau Solusi Vault yang aman untuk menyuntikkan kredensial dengan aman saat runtime. Putar rahasia secara teratur.
Logging dan pemantauan
Aktifkan logging terperinci untuk koneksi WebSocket, termasuk upaya jabat tangan, keberhasilan/kegagalan otentikasi, kesalahan pesan, dan aktivitas yang tidak biasa. Pemantauan log membantu mengidentifikasi serangan yang dicoba atau disalahgunakan lebih awal.
Menerapkan logging terpusat dan peringatan real-time untuk aktivitas yang mencurigakan, upaya otentikasi yang gagal, atau lonjakan lalu lintas yang dapat menandakan serangan.
pembaruan reguler dan pengujian keamanan
Terus semua komponen diperbarui, termasuk mesin Docker, gambar kontainer, perpustakaan Websocket, dan proxy terbalik untuk menambal kerentanan yang diketahui.
Lakukan pengujian keamanan reguler khusus untuk titik akhir Websocket menggunakan alat seperti pemindai kerentanan otomatis (mis., Rebusan, rangkaian bersendawa) dan pengujian penetrasi manual. Pesan pengujian fuzz untuk mendeteksi perilaku server yang abnormal atau dieksploitasi direkomendasikan.
Cross-Origin dan Origin Checking
Menegakkan pemeriksaan header asal yang ketat selama jabat tangan Websocket untuk memastikan koneksi berasal dari domain tepercaya. Ini membantu bertahan dari pembajakan Websocket (CSWSH) lintas situs, di mana situs web jahat berusaha menyalahgunakan koneksi Websocket membuka.
Manajemen Sesi
Menerapkan manajemen sesi yang aman. Gunakan mekanisme kedaluwarsa dan pembaruan token untuk token otentikasi WebSocket untuk meminimalkan risiko pembajakan sesi. Membatalkan token saat keluar atau setelah periode tidak aktif.
Hindari paparan port yang tidak perlu
Hanya mengekspos port minimum yang diperlukan pada host wadah. Hindari menerbitkan port Websocket secara langsung menggunakan opsi `-p` Docker kecuali di balik proxy yang diamankan.
Batasi paparan port dengan menggunakan Docker Internal atau Custom Networks sehingga layanan WebSocket berkomunikasi hanya secara internal.
Ringkasan
Mengamankan port Websocket di Docker menuntut pendekatan berlapis-lapis:
- Gunakan WSS (WebSocket over TLS) untuk komunikasi terenkripsi.
- Mengotentikasi pengguna selama jabat tangan Websocket dengan metode berbasis token.
- mengotorisasi setiap tindakan atau pesan setelah otentikasi.
- Gunakan isolasi jaringan Docker dan jembatan kustom atau jaringan overlay dengan enkripsi diaktifkan.
- Lalu lintas Websocket proxy melalui proxy terbalik yang aman daripada mengekspos port secara langsung.
- Validasi dan sanitasi semua input untuk mencegah serangan injeksi.
- Menerapkan tingkat pembatasan untuk mengurangi serangan DOS.
- Ikuti praktik terbaik keamanan Docker Container, termasuk hak istimewa minimal dan manajemen rahasia.
- Monitor dan log aktivitas WebSocket untuk perilaku mencurigakan.
- Perbarui komponen secara teratur dan lakukan pengujian keamanan.
- Menegakkan cek asal untuk mencegah pembajakan.
- Kelola token sesi dengan aman dengan kedaluwarsa dan pembaruan.