मैं अपने घरों में केवल SSH उपयोगकर्ताओं को sftp कैसे काट सकता हूं?


123

मैं एक क्लाइंट को अपने सर्वर तक पहुंच देना चाहता हूं, लेकिन मैं उन उपयोगकर्ताओं को उनके होम निर्देशिकाओं तक सीमित करना चाहता हूं। मैं उन सभी फ़ाइलों में बाँधूँगा, जिन्हें मैं देखना चाहता हूँ।

मैंने एक उपयोगकर्ता नाम बनाया है bobऔर उसे एक नए समूह में जोड़ा है sftponly। उनके पास एक घरेलू निर्देशिका है /home/bob। मैंने /bin/falseSSH लॉगिन को रोकने के लिए उनके शेल को बदल दिया है । यहाँ उनकी /etc/passwdलाइन है:

bob:x:1001:1002::/home/bob:/bin/false

मैंने /etc/ssh/sshd_configनिम्नलिखित को शामिल करने के लिए भी बदलाव किया है:

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no

जब मैं उनके रूप में लॉग इन करने की कोशिश करता हूं, तो यहां मैं देख रहा हूं

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

अगर मैं उस ChrootDirectoryलाइन पर टिप्पणी करता हूं जिसमें मैं SFTP कर सकता हूं, लेकिन तब उनके पास सर्वर पर मुफ्त लगाम है। मैंने पाया है कि ChrootDirectory /homeकाम करता है, लेकिन यह अभी भी उन्हें किसी भी घर निर्देशिका तक पहुंच प्रदान करता है। मैंने स्पष्ट रूप से कोशिश की है ChrootDirectory /home/bobलेकिन वह भी काम नहीं करता है।

मैं क्या गलत कर रहा हूं? मैं कैसे सीमित कर सकते हैं bobकरने के लिए /home/bob/?

---- संपादित करें -----

ठीक है, इसलिए मैंने अभी /var/log/auth.logदेखा और इसे देखा:

May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May  9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob

मुझे पूरी तरह से यकीन नहीं है कि वहां क्या चल रहा है, लेकिन यह सुझाव देता है कि उपयोगकर्ता निर्देशिका के साथ कुछ गलत है। यहाँ ls -h /homeउत्पादन है:

drwxr-xr-x 26 oli      oli      4096 2012-01-19 17:19 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob

2
मुझे विश्वास है कि ChrootDirectory /home/%uप्रतिस्थापित किया जा सकता है ChrootDirectory %h
फ्रेंक डर्नोनकोर्ट

जवाबों:


119

यह सब दर्द कई सुरक्षा मुद्दों के लिए धन्यवाद है जैसा कि यहां वर्णित है । मूल रूप से चेरोट निर्देशिका के स्वामित्व में है rootऔर कोई भी समूह-लेखन पहुंच नहीं हो सकती है। लवली। तो अगर आप अनिवार्य रूप से एक होल्डिंग सेल में अपने chroot चालू करने की आवश्यकता है और भीतर कि आप अपने संपादन योग्य सामग्री हो सकती है।

sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable

और बम, आप लॉग इन कर सकते हैं और लिख सकते हैं /writable


3
धन्यवाद वास्तव में उपयोगी है। हालांकि दो समस्याएं। 1.) भले ही मैं लिख नहीं सकता, मैं अभी भी पूरे फाइल सिस्टम को ब्राउज़ कर सकता हूं। 2.) शेल को / बिन / असत्य में बदलने से SFTP पूरी तरह से रोकता है। क्या मुझसे कुछ ग़लत हो रहा है?
किम 3

1
धन्यवाद! इस विषय पर कई अन्य लेख इस विवरण को याद करते हैं, और कुछ इसे बनाते हैं ताकि सर्वर ssh कनेक्शन को स्वीकार न कर सके (जब आप EC2 पर होते हैं और किस तरह से चूसते हैं ... यही एकमात्र तरीका है)।
टॉम हैरिसन जूनियर

4
kim3er: ऐसा इसलिए है क्योंकि आपको उपयोगकर्ता के शेल को / sbin / nologin पर सेट करने की आवश्यकता है - / बिन / गलत किसी भी प्रकार की पहुंच को निष्क्रिय करता है।

8
मैं यह भी नोट करना चाहूंगा कि आपके चेरोट फ़ोल्डर के लिए नेतृत्व करने वाले सभी फ़ोल्डर स्वामित्व में होने चाहिए root। इस उदाहरण में, /homeरूट के स्वामित्व में भी होना चाहिए।
शिकी

2
14.04 को, मुझे काम Subsystem sftp /usr/lib/openssh/sftp-serverकरने Subsystem sftp internal-sftp -f AUTH -l VERBOSEसे पहले लाइन को बदलना पड़ा ।
partofthething

57

SFTP डायरेक्टरी को चुराने के लिए आपको चाहिए

  1. एक उपयोगकर्ता बनाएं और उसके मालिक होने के लिए रूट को बाध्य करें

    cd /home
    mkdir john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
    
  2. / Etc / ssh / sshd_config पर सबसिस्टम स्थान बदलें:

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp
    

    और फ़ाइल के अंत में एक उपयोगकर्ता अनुभाग बनाएँ (ssh श्वसन की मृत्यु हो सकती है यदि सबसिस्टम लाइन के बाद रखा जाए):

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    

3
यह काम नहीं लगता है। आपके उदाहरण में, उपयोगकर्ता निर्देशिका johnमें बंद है /home/john। आपने 755निर्देशिका को अनुमति प्रदान कर दी है । इसलिए मालिक ने पढ़ा (4), लिखना (2) और निष्पादित (1), और समूह ने पढ़ा है (4) और निष्पादित (1)। आपने स्वामी और समूह को भी सेट किया है root, इसलिए johnअन्य के अंतर्गत आता है। उन्होंने तब (4 + 1 = 5) पढ़ा और निष्पादित भी किया। इसलिए आपने जॉन को एक निर्देशिका में बंद कर दिया है, जहां उनके पास कोई विशेषाधिकार नहीं है। इसे कैसे ठीक करें? बदलने के लिए 757या यहाँ तक 777कि लॉगिन को तोड़ता है। जॉन के लिए समूह या मालिक को बदलने से भी लॉगिन टूट जाता है।
डैनियल

यह भी ध्यान दें: / etc / ssh / sshd_config में विन्यास क्रम में पढ़े जाते हैं। इसलिए यदि आपके पास सामान्य में उपयोगकर्ताओं के लिए एक नियम है और आप उनमें से एक को अधिलेखित करना चाहते हैं, तो बस उपयोगकर्ता-विशिष्ट नियम को शीर्ष पर रखें।
rwenz3l

मैं कुछ अन्य उपयोगकर्ता के होम फ़ोल्डर में एक SFTP निर्देशिका को क्रॉट करना चाहता हूं। मेरे पास /home/userx/sftproot/uploads/ घर / sftpuse में sftpuser है। मैंने चुरोट /home/usex/sftprootको जड़ के स्वामित्व में सेट किया है: जड़ और /home/usex/sftproot/uploadsचामोद 755। साफ्टपासर द्वारा चाउट-एड: sftpuser। मुझे उपरोक्त प्रश्न के समान त्रुटि मिली। क्या चेरोट और सभी मूल फ़ोल्डरों को रूट करने की आवश्यकता है: कार्य करने के लिए sftp के लिए रूट?
प्रिमोज़ रोम

6

मैंने पूरा दिन अपने रास्पबेरी पर एक नेटवर्क शेयर प्राप्त करने की कोशिश में बिताया। मैं उपयोगकर्ता को लॉक करना चाहता था ताकि यह संपूर्ण फ़ाइल सिस्टम के माध्यम से नेविगेट न कर सके, कोई ssh लॉगिन एक्सेस नहीं था और मैं नेटवर्क शेयर तक पहुंच लिखना चाहता था।

और यहाँ है कि मैं इसे कैसे काम कर रहा हूं:

पहले मैंने एक उपयोगकर्ता बनाया:

sudo useradd netdrive

फिर संपादित किया गया /etc/passwdऔर सुनिश्चित किया गया कि यह /bin/falseउपयोगकर्ता के लिए है इसलिए लाइन थी:

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false

मैंने /etc/ssh/sshd_configशामिल करने के लिए संपादित किया:

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

घर की निर्देशिका के स्वामी और अनुमतियां बदली गईं:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/

ठीक है, इस सब के बाद मैं का उपयोग कर कनेक्ट करने में सक्षम था, sshfsलेकिन केवल मोड में पढ़ा। मुझे एक योग्य फ़ोल्डर प्राप्त करने के लिए क्या करना था:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/

यह वह था, इसने बिना किसी और बदलाव के काम किया। ध्यान दें कि मेरे पास उपयोगकर्ता के लिए केवल लिखने योग्य अनुमति है , न कि समूह के रूप में कई अन्य समाधान ऑनलाइन। मैं समस्याओं के बिना फ़ाइलों / फ़ोल्डरों को बनाने / हटाने / संपादित / नाम बदलने में सक्षम था।

चेरोट कॉन्फ़िगरेशन के कारण नेटड्राइव उपयोगकर्ता के sshfsसाथ उपयोग करते समय मैं केवल सर्वर की निर्देशिका के अंदर संग्रहीत चीजों को देखूंगा , एकदम सही। दोहराया निर्देशिका संरचना है क्या यह मेरे लिए एक साफ chroot ssh योग्य समाधान होने में काम आता है ।/home/netdrive//home/netdrive/home/netdrive/

अब मैं नीचे दी गई समस्याओं के बारे में बताने जा रहा हूँ:

आपको संभवतः निम्नलिखित पैराग्राफों पर अमल नहीं करना चाहिए :

उपरोक्त समाधानों को देखने के बाद (और नेट पर कई अन्य लोगों ने भी जो acl (एक्सेस कंट्रोल लिस्ट) का उपयोग किया था ) मैं अभी भी इसे काम करने में सक्षम नहीं था क्योंकि मैंने जो किया वह था:

निम्नलिखित ने मेरे लिए काम नहीं किया :

sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/

क्योंकि netdrive उपयोगकर्ता अभी भी /home/netdrive/writable/फ़ोल्डर के मालिक होने और अनुमतियाँ होने के बावजूद उस निर्देशिका में लिखने में सक्षम नहीं था । तब मैंने किया था: sudo chmod 775 / home / netdrive / writable / और अब मैं एक निर्देशिका बना सकता हूं और इसे हटा सकता हूं लेकिन मैं इसे संपादित करने में सक्षम नहीं था क्योंकि यह समूह लेखन योग्य अनुमति के बिना बनाया जा रहा था। यहाँ से जो मैंने नेट पर देखा aclउसे ठीक करने के लिए लोग इस्तेमाल करते हैं। लेकिन मैं इससे खुश नहीं था क्योंकि मुझे इसे स्थापित करना था acl, फिर माउंट बिंदुओं को कॉन्फ़िगर करना, आदि। इसके अलावा मुझे नहीं पता कि मुझे उसी उपयोगकर्ता के स्वामित्व वाले फ़ोल्डर में लिखने के लिए समूह की अनुमति की आवश्यकता क्यों होगी ।

ऐसा लगता है कि किसी कारण /home/netdrive/home/netdriveसे पिछले netdriveफ़ोल्डर में स्वामित्व बनाने और देने के लिए मैं समूह अनुमतियों के साथ गड़बड़ किए बिना सब कुछ काम करने में सक्षम था ।


1

मैंने इस लेख का अनुसरण किया, लेकिन यह काम नहीं किया। मैंने यह परिवर्तन करने के बाद काम करना शुरू किया (उपरोक्त उत्तरों में सुझाव दिया गया है):

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

इसके अलावा रूट के योग्य घर निर्देशिका बनाई गई जिसके तहत मेरे पास उपयोगकर्ता के योग्य उप निर्देशिका थी (जैसा कि ऊपर वर्णित है)।

इस उत्तर के साथ मैं जो नई और उपयोगी बात जोड़ना चाहता हूं, वह यह है कि आप यूजर होम डायरेक्टरी के रूप में% h निर्दिष्ट करके विन्यास को सरल बना सकते हैं:

ChrootDirectory %h

मैंने इस लिंक की बदौलत इसे खोज लिया है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.