रिवर्स एसएसएच ट्यूनिंग बंदरगाहों को कैसे सीमित करें?


9

हमारे पास एक सार्वजनिक सर्वर है जो फायरवॉल के पीछे कई ग्राहकों से एसएसएच कनेक्शन स्वीकार करता है।

इनमें से प्रत्येक क्लाइंट ssh -Rअपने वेब सर्वर से कमांड 80 पर हमारे सार्वजनिक सर्वर पर कमांड का उपयोग करके एक रिवर्स एसएसएच सुरंग बनाते हैं ।

रिवर्स एसएसएच टनल का गंतव्य बंदरगाह (क्लाइंट की तरफ) 80 है और स्रोत पोर्ट (सार्वजनिक सर्वर की तरफ) उपयोगकर्ता पर निर्भर करता है। हम प्रत्येक उपयोगकर्ता के लिए पोर्ट एड्रेस का एक नक्शा बनाए रखने की योजना बना रहे हैं।

उदाहरण के लिए, ग्राहक A अपने वेब सर्वर को पोर्ट 80 पर हमारे पोर्ट 8000 पर सुरंग करेगा; ग्राहक बी 80 से 8001 तक; क्लाइंट सी 80 से 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

असल में, हम जो करने की कोशिश कर रहे हैं वह प्रत्येक उपयोगकर्ता को एक पोर्ट के साथ बांधता है और उन्हें किसी अन्य पोर्ट पर सुरंग की अनुमति नहीं देता है।

अगर हम SSH की फॉरवर्ड टनलिंग सुविधा का उपयोग कर रहे हैं ssh -L, तो हम permitopen=host:portकॉन्फ़िगरेशन का उपयोग करके किस पोर्ट को सुरंग में डालने की अनुमति दे सकते हैं । हालांकि, रिवर्स एसएसएच सुरंग के लिए कोई समकक्ष नहीं है।

क्या प्रति उपयोगकर्ता रिवर्स टनलिंग पोर्ट को प्रतिबंधित करने का एक तरीका है?


1
केवल सिस्टम-वाइड नीति जैसे SELinux या IPTABLES द्वारा।
एंड्रयू स्मिथ

जवाबों:


6

चूंकि आपने बोल्ड में अनुमति नहीं दी है, इसलिए मुझे लगता है कि आप SSH क्लाइंट की ओर से किसी प्रकार की रन-टाइम अस्वीकृति चाहते हैं जो पोर्ट बाइंड को रोकता है। इसलिए, मैंने आपके लिए स्रोत कोड की खुदाई की है:

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

दुर्भाग्य से, जैसा कि आप देख सकते हैं, ऐसी कई स्थितियाँ नहीं हैं, जो मानक से अलग पोर्ट अग्रेषण को रोकने के लिए दिखाई देती हैं।

मैं mod_ownerभीतर उपयोग करने के लिए एक ही सुझाव की सिफारिश करने वाला था iptables, लेकिन जेफ ने मुझे इसमें हरा दिया।

आपका सबसे साफ समाधान सिर्फ इस फ़ाइल को संशोधित करने के लिए होगा (उदाहरण के लिए, आप pw->pw_uidउपयोगकर्ता को जोड़ने के यूआईडी को प्राप्त करने के लिए उपयोग कर सकते हैं , और सही पोर्ट पर मैप कर सकते हैं ) और अपने एसएसएच सर्वर को फिर से जोड़ सकते हैं, लेकिन यह इस बात पर निर्भर करेगा कि आप इसके साथ कितने सहज हैं ।


यह सचमुच अच्छा है। मैं वास्तव में -L विकल्प (टनलिंग) से एक ही वाक्यविन्यास की प्रतिलिपि बना सकता हूं और इसे काम कर सकता हूं। धन्यवाद।
उत्कु जिहिनोग्लू

3

मेरा सुझाव इसके लिए SELinux का उपयोग कर रहा है। आपको उपयोगकर्ता प्रोफ़ाइल को कॉन्फ़िगर करना होगा जो अनुमति देता है कि कौन से पोर्ट खुले हैं। sshdप्रक्रिया कांटे और उपयोगकर्ता की प्रक्रियाओं के लिए तो कुछ भी आवेदन किया, अग्रेषित करने के लिए एक बंदरगाह खोलने से पहले उपयोगकर्ता के विशेषाधिकारों में बूंदों पर लागू की जाएगी sshd। ध्यान रखें कि एक बार netcatदूसरे पोर्ट को फॉरवर्ड करने के लिए आपको सभी उपयोगकर्ता प्रक्रियाओं को प्रतिबंधित करना होगा । मैं आपके लिए बाद में (या किसी अन्य उपयोगकर्ता को मेरे लिए इसे संपादित करने के लिए स्वागत है) उचित वाक्य रचना को क्रमबद्ध करने की कोशिश करूँगा।

वैकल्पिक रूप से, आप उपयोग करने का प्रयास कर सकते हैं 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

हालांकि, उन्हें पोर्ट खोलने और किसी अन्य उपयोगकर्ता को अस्वीकार करने से नहीं रोका जाएगा।


महान जवाब के लिए धन्यवाद। मैं SELinux / उपयोगकर्ता प्रोफ़ाइल कॉन्फ़िगरेशन का प्रयास करूंगा। यह मेरे प्रश्न का समाधान लगता है।
उत्कु जिहिनोग्लू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.