Kami memiliki server publik yang menerima koneksi SSH dari banyak klien di balik firewall.
Masing-masing klien membuat terowongan SSH Terbalik dengan menggunakan ssh -R
perintah dari server web mereka di port 80 ke server publik kami.
Port tujuan (di sisi klien) dari Terowongan SSH Terbalik adalah 80 dan port sumber (di sisi server publik) tergantung pada pengguna. Kami berencana mempertahankan peta alamat port untuk setiap pengguna.
Sebagai contoh, klien A akan melakukan tunnel server web mereka di port 80 ke port 8000 kami; klien B dari 80 hingga 8001; klien C dari 80 hingga 8002.
Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver
Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver
Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver
Pada dasarnya, apa yang kami coba lakukan adalah mengikat setiap pengguna dengan port dan tidak mengizinkan mereka untuk melakukan tunnel ke port lain.
Jika kami menggunakan fitur penerusan maju SSH dengan ssh -L
, kami dapat mengizinkan port mana yang akan disalurkan dengan menggunakan permitopen=host:port
konfigurasi. Namun, tidak ada padanan untuk terowongan SSH terbalik.
Apakah ada cara untuk membatasi port tunneling terbalik per pengguna?
sumber
Jawaban:
Karena Anda telah menempatkan tidak mengizinkan dalam huruf tebal, saya menganggap Anda ingin semacam penolakan run-time di sisi klien SSH yang mencegah port bind. Jadi, saya sudah menggali kode sumber untuk Anda:
serverloop.c:
Sayangnya, seperti yang Anda lihat, tidak ada banyak kondisi yang muncul untuk mencegah penerusan port selain dari yang standar.
Saya akan merekomendasikan saran yang sama untuk digunakan di
mod_owner
dalamiptables
, tetapi Jeff telah mengalahkan saya untuk itu.Solusi terbersih Anda hanya akan memodifikasi file ini (misalnya, Anda dapat menggunakan
pw->pw_uid
untuk mendapatkan koneksi pengguna, dan memetakannya ke port yang benar) dan mengkompilasi ulang server SSH Anda, tetapi itu akan tergantung pada seberapa nyaman Anda dengan ini .sumber
Saran saya menggunakan SELinux untuk ini. Anda harus mengonfigurasi profil pengguna yang memungkinkan port mana yang akan dibuka. The
sshd
Proses garpu dan tetes untuk hak pengguna sebelum membuka port untuk meneruskan, sehingga apa pun diterapkan untuk proses pengguna akan diterapkan padasshd
. Ingatlah bahwa Anda harus membatasi semua proses pengguna karena sekali dapat digunakannetcat
untuk meneruskan port lain. Saya akan mencoba memilah sintaks yang tepat untuk Anda nanti (atau pengguna lain dipersilakan untuk mengeditnya untuk saya).Atau, Anda dapat mencoba menggunakan
iptables
.Itu tidak akan mencegah mereka membuka port dan menolak pengguna lain.
sumber