पोर्ट फॉरवर्डिंग के लिए प्रतिबंधित SSH उपयोगकर्ता कैसे बनाएं?


106

SSndrük ने किसी और (दूरस्थ मदद के लिए) के साथ एक आसान एसएसएच कनेक्शन प्राप्त करने के लिए एक रिवर्स कनेक्शन का सुझाव दिया । उस काम के लिए, कनेक्शन को स्वीकार करने के लिए एक अतिरिक्त उपयोगकर्ता की आवश्यकता होती है। इस उपयोगकर्ता को सर्वर के माध्यम से अपने पोर्ट को अग्रेषित करने में सक्षम होना चाहिए (सर्वर प्रॉक्सी के रूप में कार्य करता है)।

मैं एक प्रतिबंधित उपयोगकर्ता कैसे बनाऊं जो ऊपर वर्णित से अधिक कुछ नहीं कर सकता है?

नया उपयोगकर्ता इसके लिए सक्षम नहीं होना चाहिए :

  • शेल कमांड निष्पादित करें
  • फ़ाइलों तक पहुँचने या सर्वर पर फ़ाइलों को अपलोड करने के लिए
  • सर्वर को प्रॉक्सी के रूप में उपयोग करें (उदाहरण के लिए webproxy)
  • स्थानीय सेवाओं तक पहुंचें जो फ़ायरवॉल के कारण सार्वजनिक रूप से सुलभ नहीं थीं
  • सर्वर को मार डालो

संक्षेप में, मैं एक प्रतिबंधित एसएसएच उपयोगकर्ता कैसे बना सकता हूं जो केवल एसएसएच सर्वर को विशेषाधिकार के बिना कनेक्ट करने में सक्षम है, इसलिए मैं उसके कंप्यूटर के साथ उस कनेक्शन के माध्यम से जुड़ सकता हूं?


जवाबों:


166

टीएल; डीआर - जवाब के नीचे जाएं, "प्रतिबंध लागू करना"

प्रतिबंधित उपयोगकर्ता को जोड़ने के दो भाग होते हैं: 1. उपयोगकर्ता बनाना 2. SSH डेमॉन (sshd) कॉन्फ़िगर करना

Sshd कॉन्फ़िगर करना

SSH की संभावनाओं के बारे में जानने के लिए सबसे अच्छी जगह संबंधित मैनुअल पृष्ठों को पढ़कर है:

SSH क्लाइंट कहाँ क्रिया कर सकता है?

इससे पहले कि आप कुछ प्रतिबंधित कर सकते हैं, आपको एसएसएच की विशेषताओं को जानना होगा। मैन्युअल पृष्ठों की पैदावार के माध्यम से थूकना:

  • शेल कमांड निष्पादित करता है
  • फ़ाइल अपलोड sftp के माध्यम से
  • पोर्ट फॉरवार्डिंग
    • क्लाइंट फ़ॉर्वर्ड (अन) सर्वर के लिए पोर्ट का उपयोग करता है
    • सर्वर क्लाइंट के लिए उसके पोर्ट को आगे करता है
    • सर्वर क्लाइंट को एक अन्य होस्ट का एक पोर्ट फॉरवर्ड करता है (प्रॉक्सी-इश)
  • X11 फ़ॉरवर्डिंग (प्रदर्शन फ़ॉरवर्डिंग)
  • प्रमाणीकरण एजेंट अग्रेषण
  • एक सुरंग उपकरण का अग्रेषण

से प्रमाणीकरण की धारा sshd (8) के मैनुअल पृष्ठ :

यदि क्लाइंट सफलतापूर्वक खुद को प्रमाणित करता है, तो सत्र की तैयारी के लिए एक संवाद दर्ज किया जाता है। इस समय ग्राहक एक pseudo-tty आवंटित करने, X11 कनेक्शन अग्रेषित करने, टीसीपी कनेक्शन अग्रेषित करने, या सुरक्षित चैनल पर प्रमाणीकरण एजेंट कनेक्शन अग्रेषित करने जैसी चीजों का अनुरोध कर सकता है ।

इसके बाद, क्लाइंट या तो शेल या कमांड के निष्पादन का अनुरोध करता है । पक्ष तब सत्र मोड में प्रवेश करते हैं। इस मोड में, दोनों ओर से किसी भी समय डेटा भेजा जा सकता है, और इस तरह के डेटा को सर्वर साइड पर शेल या कमांड से / और क्लाइंट साइड में यूजर टर्मिनल को अग्रेषित किया जाता है।

SSH सुविधाओं को प्रतिबंधित करने के लिए विकल्प

फ़ाइलें और उनके विकल्प जो व्यवहार को बदलते हैं:

  • ~/.ssh/authorized_keys - वे कुंजियाँ हैं जिन्हें जोड़ने की अनुमति है, जिन्हें विकल्प दिए जा सकते हैं:
    • command="command"- उपयोगकर्ता द्वारा आपूर्ति की गई कमांड (यदि कोई है) को नजरअंदाज किया जाता है। ध्यान दें कि ग्राहक टीसीपी और / या एक्स 11 को अग्रेषित कर सकते हैं जब तक कि उन्हें स्पष्ट रूप से निषिद्ध नहीं किया जाता है । ध्यान दें कि यह विकल्प शेल, कमांड या सबसिस्टम निष्पादन पर लागू होता है।
    • no-agent-forwarding - यह कुंजी प्रमाणीकरण के लिए उपयोग किए जाने पर प्रमाणीकरण एजेंट को अग्रेषित करती है।
    • no-port-forwarding - यह कुंजी प्रमाणीकरण के लिए उपयोग किए जाने पर टीसीपी को अग्रेषित करती है
    • no-X11-forwarding - "जब यह कुंजी प्रमाणीकरण के लिए उपयोग की जाती है तो X11 अग्रेषित करना बंद कर देता है।"
    • permitopen="host:port" - स्थानीय 'ssh -L' पोर्ट को इस तरह अग्रेषित करना कि यह केवल निर्दिष्ट होस्ट और पोर्ट से कनेक्ट हो सके।
  • ~/.ssh/environment- इस फ़ाइल को लॉगिन पर पर्यावरण में पढ़ा जाता है (यदि यह मौजूद है)। पर्यावरण प्रसंस्करण डिफ़ॉल्ट रूप से अक्षम है और PermitUserEnvironment विकल्प के माध्यम से नियंत्रित किया जाता है
  • ~/.ssh/rc - उपयोगकर्ता के घर की निर्देशिका सुलभ होने से पहले चलाने के लिए इनिशियलाइज़ेशन रूटीन समाहित करता है।
  • /etc/ssh/sshd_config - सिस्टम-वाइड कॉन्फ़िगरेशन फ़ाइल
    • AllowAgentForwarding - निर्दिष्ट करता है कि ssh- एजेंट (1) अग्रेषण की अनुमति है या नहीं।
    • AllowTcpForwarding
    • ForceCommand - "फोर्सकॉमैंड द्वारा निर्दिष्ट कमांड के निष्पादन को मजबूर करता है, क्लाइंट द्वारा दिए गए किसी भी कमांड को अनदेखा करता है और अगर मौजूद है तो / / .ssh / rc। कमांड को -c विकल्प के साथ उपयोगकर्ता के लॉगिन शेल का उपयोग करके आमंत्रित किया जाता है।"
    • GatewayPorts - "निर्दिष्ट करता है कि क्या दूरस्थ होस्ट क्लाइंट के लिए अग्रेषित पोर्ट से कनेक्ट करने की अनुमति है। डिफ़ॉल्ट रूप से, sshd (8) लूपबैक पते पर दूरस्थ पोर्ट फ़ॉरवर्डिंग को बाइंड करता है। यह अन्य दूरस्थ होस्ट को अग्रेषित पोर्ट से कनेक्ट करने से रोकता है। GatewayPorts को निर्दिष्ट करने के लिए उपयोग किया जा सकता है। sshd को दूरस्थ पोर्ट फ़ॉरवर्डिंग को गैर-लूपबैक पतों पर बाँधने की अनुमति देनी चाहिए, इस प्रकार अन्य होस्ट को कनेक्ट करने की अनुमति मिलती है। "
    • PermitOpen:

      उन गंतव्यों को निर्दिष्ट करता है जिनमें टीसीपी पोर्ट अग्रेषण की अनुमति है। अग्रेषण विनिर्देश निम्नलिखित रूपों में से एक होना चाहिए:

      PermitOpen host:port
      PermitOpen IPv4_addr:port
      PermitOpen [IPv6_addr]:port
      

      एकाधिक फ़ॉरवर्ड को व्हॉट्सएप के साथ अलग करके निर्दिष्ट किया जा सकता है। सभी प्रतिबंधों को हटाने और किसी भी अग्रेषण अनुरोध को अनुमति देने के लिए 'किसी भी' के तर्क का उपयोग किया जा सकता है। डिफ़ॉल्ट रूप से सभी पोर्ट अग्रेषण अनुरोधों की अनुमति है।

    • PermitTunnel- निर्दिष्ट करता है कि क्या ट्यून (4) डिवाइस अग्रेषण की अनुमति है। डिफ़ॉल्ट 'नहीं' है
    • X11Forwarding- निर्दिष्ट करता है कि X11 अग्रेषण की अनुमति है या नहीं। डिफ़ॉल्ट 'नहीं' है

प्रतिबंध लागू करना

सिस्टम-वाइड कॉन्फ़िगरेशन फ़ाइल को संशोधित करने की /etc/ssh/sshd_configअनुमति देता है भले ही पासवर्ड-आधारित प्रमाणीकरण लागू हो या अगर ~/.ssh/authorized_keysगलती से प्रतिबंध हटा दिए गए हों तो कॉन्फ़िगरेशन को लागू किया जा सकता है। यदि आपने वैश्विक चूक को संशोधित किया है, तो आपको उसके अनुसार विकल्पों को अनसुना करना चाहिए।

Match User limited-user
   #AllowTcpForwarding yes
   #X11Forwarding no
   #PermitTunnel no
   #GatewayPorts no
   AllowAgentForwarding no
   PermitOpen localhost:62222
   ForceCommand echo 'This account can only be used for [reason]'

अब एक उपयोगकर्ता जोड़ें:

sudo useradd -m limited-user

विकल्प ForceCommandको छोड़ा जा सकता है यदि शेल गैर-शेल की तरह सेट किया जाता है /bin/false(या /bin/true) जैसा /bin/false -c [command]कि कुछ भी नहीं होगा।

अब ग्राहक केवल SSH पर सर्वर के लूपबैक पते पर पोर्ट 62222 से जुड़ सकता है (यह सार्वजनिक आईपी पते पर नहीं सुनेगा)

अक्षम करने AllowTcpForwardingसे भी -Rइस तरह के प्रतिबंधित खाते के उपयोग को पराजित किया जा सकता है, जिससे एक पोर्ट को अग्रेषित किया जा सकेगा । PermitOpen localhost:62222मान लें कि सर्वर पर पोर्ट 62222 का उपयोग कभी नहीं होता है क्योंकि क्लाइंट खुशी से इसे कनेक्ट कर सकता है और इस पर भी सुन सकता है।

यदि सिस्टम-वाइड कॉन्फ़िगरेशन और अक्षम पासवर्ड-आधारित प्रमाणीकरण में टीसीपी अग्रेषण की अनुमति है, तो आप प्रति-कुंजी सेटिंग्स का भी उपयोग कर सकते हैं। संपादित करें ~/.ssh/authorized_keysऔर अगले विकल्पों को जोड़ें ssh-(विकल्पों के बीच की जगह के साथ ssh-) और :

command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"

सत्यापित करें

यह सुनिश्चित करने के लिए कि यह अपेक्षित रूप से काम करता है, कुछ परीक्षण मामलों को चलाने की आवश्यकता है। hostयदि यह सेट नहीं है , तो नीचे दिए गए आदेशों में, वास्तविक लॉगिन द्वारा प्रतिस्थापित किया जाना चाहिए ~/.ssh/config। आदेश के पीछे, एक कमांड दिखाया जाता है जिसे क्लाइंट या सर्वर (निर्दिष्ट के रूप में) पर निष्पादित किया जाना चाहिए।

# connection closed:
ssh host
# connection closed (/bin/date is not executed):
ssh host /bin/date
# administratively prohibited (2x):
ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222

निष्कर्ष

चेकलिस्ट: SSH उपयोगकर्ता इसके लिए सक्षम नहीं होना चाहिए:

  • निष्पादित शेल कमांड - किया गया
  • फ़ाइलों तक पहुँचने या सर्वर पर फ़ाइलों को अपलोड करने के लिए - किया गया
  • सर्वर को प्रॉक्सी के रूप में उपयोग करें (जैसे webproxy) - किया गया
  • स्थानीय सेवाओं का उपयोग करें जो फ़ायरवॉल के कारण सार्वजनिक रूप से सुलभ नहीं हैं - आंशिक रूप से , ग्राहक 62222 के अलावा अन्य पोर्ट तक नहीं पहुंच सकता है, लेकिन सर्वर पर पोर्ट 62222 को सुन और कनेक्ट कर सकता है
  • सर्वर को मारें - किया गया (ध्यान दें कि ये चेक एसएसएच सर्वर तक सीमित हैं। यदि आप मशीन पर अन्य असुरक्षित सेवा करते हैं, तो यह संभावित हमलावर को कमांड चलाने, सर्वर को मारने, आदि की अनुमति दे सकता है)

3
इस काम के लिए, द्वारा जोड़ा गया खाता useraddअनलॉक होना चाहिए। /etc/shadowजिसे ऐस्टरिक ( *) द्वारा पासवर्ड का उपयोग करके या पासवर्ड का उपयोग करके सेट करके किया जा सकता है sudo passwd limited-user
13:00 पर लेकेनस्टेय

2
SFTP काम करता है क्योंकि SSH सर्वर sftp-serverकमांड चलाता है । इसके साथ ForceCommand, इस आदेश को अब निष्पादित नहीं किया जाएगा।
लेकेन्स्टाइन

2
में भी उपयोगी from=विकल्प है authorized_keys। यह आपको किसी विशेष IP पते या होस्टनाम वाले स्रोतों के उपयोग की कुंजी को सीमित करने की अनुमति देता है। उदाहरण, from="1.1.1.1"या from="10.0.0.?,*.example.com"। सभी अधिकृत_कीप विकल्पों के लिए मैन पेज ( linux.die.net/man/8/sshd ) में " AUTHORIZED_KEYS FILE FORMAT" अनुभाग देखें ।
डोन ली

2
"AllowTcpForwarding स्थानीय" दूरस्थ अग्रेषण निषिद्ध है। (मुझे नहीं पता कि यह जवाब कब लिखा गया था।)
साइमन सैपिन

1
ध्यान दें कि यह लगातार ssh कनेक्शन से टूट जाता है, इसलिए आपको कनेक्ट करते समय Host * ControlMaster autoआपकी ~/.ssh/configफ़ाइल में कुछ ऐसा नहीं होना चाहिए ssh -N। आपको इसकी आवश्यकता है, तो का उपयोगssh -N -o ControlMaster=no
NH2

3

मुझे यकीन है कि इसके कई समाधान हैं, और जो मैं प्रस्ताव कर रहा हूं, उससे कई अधिक मजबूत है। हालाँकि, यह आपकी आवश्यकताओं के लिए पर्याप्त हो सकता है। ऐसा करने के लिए, मुझे लगता है कि उपयोगकर्ता ssh कुंजी आधारित प्रमाणीकरण करने में सक्षम है (पोटीन या किसी भी यूनिक्स ssh को इस का समर्थन करना चाहिए)।

  • उपयोगकर्ता को सामान्य रूप से जोड़ें ('एड्यूसर' या कोई अन्य उपकरण)

  • उपयोगकर्ता .shsh dir और .ssh / अधिकृत_की बनायें

your_user $ sudo -Hu ssh_forwarder /bin/bash

ssh_forwarder $ cd ~
ssh_forwarder $ mkdir .ssh
ssh_forwarder $ ( umask 066 && cat > .ssh/authorized_keys ) <<EOF
no-agent-forwarding,no-X11-forwarding,command="read a; exit" ssh-rsa AAAB3NzaC1y....2cD/VN3NtHw== smoser@brickies
EOF
  • इस खाते में पासवर्ड का उपयोग अक्षम करें।
your_user $ sudo usermod --lock ssh_forwarder

अब, एकमात्र तरीका जो उपयोगकर्ता आपके सिस्टम में प्राप्त कर सकता है, वह उचित ssh कुंजी तक पहुंच के माध्यम से है, और ssh उनके लिए "/ बिन / बैश -c 'चलाएगा, उनके लिए कोई भी" नहीं "पढ़ेगा, भले ही वे चलाने का प्रयास करें। 'read a' बस एक न्यूलाइन तक पढ़ा जाएगा, और फिर शेल बाहर निकल जाएगा, इसलिए उपयोगकर्ता को कनेक्शन को मारने के लिए बस 'एंटर' करना होगा।

कई अन्य चीजें हैं जो आप 'कमांड =' में कर सकते हैं। man authorized_keysअधिक जानकारी के लिए 'कमांड' देखें और खोजें।

यदि आप इस तथ्य को पसंद नहीं करते हैं कि हिटिंग कनेक्शन को मारता है, तो आप 'कमांड =' प्रविष्टि के लिए निम्नलिखित की तरह कुछ का उपयोग कर सकते हैं:

command="f=./.fifo.$$ && mkfifo $f && trap \"rm -f $f\" EXIT && read a <$f && echo $a; exit;"

यह उपयोगकर्ताओं की होम डायरेक्टरी में अस्थायी अस्थायी बनाता है और फिर इससे पढ़ने की कोशिश करता है। उस फ़ाइल पर कुछ भी नहीं लिखा जाएगा, इसलिए यह अनिश्चित काल तक लटका रहेगा। इसके अतिरिक्त, यदि आप उस कनेक्शन को बलपूर्वक समाप्त करना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं:

 your_user$ echo GOODBYE | sudo tee ~ssh_forwarder/.fifo.*

यह बहुत कम संसाधनों का उपयोग करना चाहिए, और उस स्क्रिप्ट में कुछ भी गलत नहीं होना चाहिए जो शेल की समाप्ति में समाप्त नहीं होगा।

sleep 1h; echo You have been here too long. Good bye.

मैंने हाथ से नहीं देखा कि आप उपयोगकर्ता को आगे ( ssh -R) लेकिन सीमा ( ssh -L) को दूरस्थ करने की अनुमति कैसे दे सकते हैं । शायद 'परमोपेन' का इस्तेमाल किया जा सकता था। Googling बहुत मददगार नहीं थी। ऐसा लगता है कि 'नो-पोर्ट-फ़ॉरवर्डिंग, परमिटमार्टोपॉरेन = 10001' जैसी कोई चीज़ अनुमति देने के लिए उपयोगी होगी ssh -R 6901:localhost:6901

यह एक उपाय है। यह निश्चित रूप से सुधार किया जा सकता है, और दूरस्थ बंदरगाहों के किसी भी उद्घाटन की जांच की जानी चाहिए। यदि मेरा लक्ष्य मेरी दादी को अपने लैन में जुड़ने की अनुमति देना था, तो मैं उसकी स्क्रीन देखने के लिए vnc का उपयोग कर सकता था, और उन कुंजियों तक पहुंच उसके लिए सीमित थी, मैं व्यक्तिगत रूप से यथोचित सुरक्षित महसूस करूंगा। यदि यह एक उद्यम के लिए था, तो अधिक गहन जांच आवश्यक होगी। के बारे में पता होना एक बात ssh -Nयह है कि एक शेल का अनुरोध बिल्कुल भी नहीं करता है, इसलिए 'कमांड =' कोड निष्पादित नहीं करता है।

अन्य, संभवतः अधिक सुरक्षित तंत्र में उपयोगकर्ता के लिए एक कस्टम शेल बनाना शामिल हो सकता है, और यहां तक ​​कि एपरमौर के साथ नीचे लॉक करना भी शामिल है।


3
यह बहुत ही हैकिंग लगता है, इसके लिए एक शेल होना भी आवश्यक नहीं है क्योंकि किसी भी कमांड को निष्पादित करने की आवश्यकता नहीं है। विकल्प केssh लिए मैनुअल पेज देखें -N। इसे पूरा करने के लिए एक क्लीनर तरीका होना चाहिए।
लेकेनस्टाइन

यह सच है। मैं एक क्लीनर समाधान भी देखने की उम्मीद कर रहा हूं। मुझे लगता है कि no-port-अग्रेषण के साथ संयोजन के रूप में अधिकृत_कीप एक बहुत अच्छा समाधान होगा यदि कोई 'permremoteopen' विकल्प था।
13

मैंने कुछ researcg (ऊपर देखें) किया। चूंकि ssh -Nयह एक कमांड को बिल्कुल भी निष्पादित नहीं करता है, इसलिए यह कोई समस्या नहीं है जो command="something"सत्र को बंद कर देता है।
लेकेनस्टीन

क्या मैं कुछ भूल रहा हूँ? ऐसा लगता था कि chsh ssh_forwarder -s /bin/false यह सब लेता है।
टाइपेलॉजिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.