Bagaimana cara membatasi port tunelling SSH terbalik?


9

Kami memiliki server publik yang menerima koneksi SSH dari banyak klien di balik firewall.

Masing-masing klien membuat terowongan SSH Terbalik dengan menggunakan ssh -Rperintah 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:portkonfigurasi. Namun, tidak ada padanan untuk terowongan SSH terbalik.

Apakah ada cara untuk membatasi port tunneling terbalik per pengguna?


1
Hanya dengan kebijakan seluruh sistem seperti SELinux atau IPTABLES.
Andrew Smith

Jawaban:


6

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:

/* check permissions */
if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0)
#ifndef NO_IPPORT_RESERVED_CONCEPT
    || (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)
#endif
    ) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");
} else {
        /* Start listening on the port */
        success = channel_setup_remote_fwd_listener(
            listen_address, listen_port,
            &allocated_listen_port, options.gateway_ports);
}

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_ownerdalam iptables, tetapi Jeff telah mengalahkan saya untuk itu.

Solusi terbersih Anda hanya akan memodifikasi file ini (misalnya, Anda dapat menggunakan pw->pw_uiduntuk 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 .


Ini sangat bagus. Saya benar-benar dapat menyalin sintaks yang sama dari opsi -L (tunneling) dan membuatnya bekerja. Terima kasih.
Utku Zihnioglu

3

Saran saya menggunakan SELinux untuk ini. Anda harus mengonfigurasi profil pengguna yang memungkinkan port mana yang akan dibuka. The sshdProses garpu dan tetes untuk hak pengguna sebelum membuka port untuk meneruskan, sehingga apa pun diterapkan untuk proses pengguna akan diterapkan pada sshd. Ingatlah bahwa Anda harus membatasi semua proses pengguna karena sekali dapat digunakan netcatuntuk 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.

iptables -m owner --add-owner $user -p tcp --sport 8000 -j ACCEPT
iptables -m owner --add-owner $user -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT

Itu tidak akan mencegah mereka membuka port dan menolak pengguna lain.


Terima kasih atas jawabannya. Saya akan mencoba konfigurasi profil SELinux / Pengguna. Kedengarannya seperti solusi untuk pertanyaan saya.
Utku Zihnioglu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.