Ters SSH tünelleme bağlantı noktaları nasıl sınırlandırılır?


9

Güvenlik duvarlarının arkasındaki birden çok istemciden gelen SSH bağlantılarını kabul eden bir genel sunucumuz var.

Bu istemcilerin her biri, ssh -R80 numaralı bağlantı noktasındaki web sunucularından genel sunucumuza komutu kullanarak bir Ters SSH tüneli oluşturur .

Ters SSH Tünelinin hedef bağlantı noktası (istemci tarafında) 80'dir ve kaynak bağlantı noktası (ortak sunucu tarafında) kullanıcıya bağlıdır. Her kullanıcı için bir bağlantı noktası adresi haritası oluşturmayı planlıyoruz.

Örneğin, A müşterisi web sunucusunu 80 numaralı bağlantı noktasında 8000 numaralı bağlantı noktasına tünelleyecektir; müşteri B 80 ila 8001; müşteri C 80 ila 8002 arasındadır.

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

Temel olarak, yapmaya çalıştığımız her kullanıcıyı bir bağlantı noktasına bağlamak ve diğer bağlantı noktalarına tünellemelerine izin vermemek .

SSH'nin ileri tünelleme özelliğini ile birlikte ssh -Lkullansaydık, permitopen=host:portkonfigürasyonu kullanarak hangi portun tünellenmesine izin verebilirdik . Ancak, ters SSH tüneli için eşdeğeri yoktur.

Kullanıcı başına ters tünel bağlantı noktalarını kısıtlamanın bir yolu var mı?


1
Yalnızca SELinux veya IPTABLES gibi sistem çapında bir politika ile.
Andrew Smith

Yanıtlar:


6

Eğer önce verdiğiniz için izin kalın, ben SSH istemci tarafında olduğunu önler liman bağlama de çalışma zamanı reddi çeşit istiyorum varsayalım. Yani, sizin için kaynak kodunu kazdım:

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);
}

Ne yazık ki, gördüğünüz gibi, standart olanların dışında bağlantı noktası iletmeyi engelleyen pek çok koşul yok.

Ben kullanmak için aynı öneriyi tavsiye üzereyken mod_owneriçinde iptables, ama Jeff Beni ona yendi.

En temiz çözümünüz sadece bu dosyayı değiştirmek (örneğin, pw->pw_uidbağlanan kullanıcının uid'ini almak ve bunu doğru bağlantı noktasına eşlemek için kullanabilirsiniz) ve SSH sunucunuzu yeniden derlemek için kullanabilirsiniz, ancak bu, bununla ne kadar rahat olduğunuza bağlı olacaktır. .


Bu gerçekten iyi. Aslında aynı sözdizimini -L seçeneğinden (tünelleme) kopyalayabilir ve çalıştırabilirim. Teşekkür ederim.
Utku Zihnioglu

3

Benim önerim bunun için SELinux kullanmak. Hangi bağlantı noktalarının açılmasına izin veren kullanıcı profillerini yapılandırmanız gerekir. sshdŞey uygulandı, böylece kullanıcının süreçlerine, iletmek için bir port açmadan önce kullanıcının ayrıcalıklarını süreç çatal ve damla üzerine uygulanacaktır sshd. Bir kez netcatbaşka bir bağlantı noktasını iletmek için kullanabileceğinden , tüm kullanıcı işlemleriyle kısıtlamanız gerektiğine dikkat edin . Daha sonra sizin için uygun sözdizimini çözmeye çalışacağım (veya başka bir kullanıcı benim için düzenlemeye açıktır).

Alternatif olarak, kullanmayı deneyebilirsiniz 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

Ancak bu, bağlantı noktalarını açmalarını ve başka bir kullanıcıyı reddetmelerini engellemez.


Harika cevap için teşekkürler. SELinux / Kullanıcı profilleri yapılandırmasını deneyeceğim. Sorumun çözümü gibi görünüyor.
Utku Zihnioglu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.