उपयोगकर्ता को SSH सुरंग स्थापित करने की अनुमति दें, लेकिन कुछ और नहीं


97

मैं किसी उपयोगकर्ता को किसी विशेष पोर्ट (विशेष रूप से, 5000) पर एक विशेष मशीन के लिए SSH सुरंग स्थापित करने की अनुमति देना चाहता हूं, लेकिन मैं इस उपयोगकर्ता को यथासंभव प्रतिबंधित करना चाहता हूं। (प्रमाणीकरण सार्वजनिक / निजी कीपर के साथ होगा)।

मुझे पता है कि मुझे प्रासंगिक ~ / .sh / अधिकृत_की फ़ाइल को संपादित करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि वहाँ क्या डाला जाए (सार्वजनिक कुंजी के अलावा)।

जवाबों:


91

उबंटू 11.10 पर, मैंने पाया कि मैं ssh कमांड को ब्लॉक कर सकता हूं, बिना और -T के साथ भेजा जा सकता है, और पोर्ट फॉरवर्डिंग की अनुमति देता है, जबकि पोर्ट फॉरवर्डिंग से गुजर सकता है।

विशेष रूप से मेरे पास स्थानीयहोस्ट के लिए बाध्य "somehost" पर एक रेडिस-सर्वर है: 6379 कि मैं ssh सुरंगों के माध्यम से अन्य मेजबानों के लिए सुरक्षित रूप से साझा करना चाहता हूं जिनके पास कीफ़ाइल है और साथ में ssh होगा:

$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost

यह रेडिस-सर्वर, "लोकलहोस्ट" पोर्ट 6379 को "somehost" पर स्थानीय रूप से ssh कमांड को निष्पादित करने वाले होस्ट पर प्रदर्शित होने के कारण, "लोकलहोस्ट" पोर्ट 16379 पर रीमेक किया जाएगा।

रिमोट पर "somehost" यहाँ वही है जो मैंने अधिकृत_की के लिए उपयोग किया है:

cat .ssh/authorized_keys   (portions redacted)

no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost

नो-पीटीआई अधिकांश ssh प्रयासों को पूरा करता है जो एक टर्मिनल खोलना चाहते हैं।

पर्मोपेन बताता है कि किस पोर्ट को आगे भेजने की अनुमति है, इस मामले में पोर्ट 6379 रेडिस-सर्वर पोर्ट जिसे मैं फॉरवर्ड करना चाहता था।

कमांड = "/ बिन / गूंज मत करो-भेजना-आदेश" गूँजना "वापस करना-नहीं-भेजना-आज्ञा देना" यदि कोई व्यक्ति या कोई व्यक्ति ssh -T के माध्यम से मेजबान को आदेश भेजने का प्रबंधन करता है या अन्यथा।

हाल ही के उबंटू से man sshd, अधिकृत_की / कमांड को निम्नानुसार वर्णित किया गया है:

कमांड = "कमांड" निर्दिष्ट करता है कि जब भी यह कुंजी प्रमाणीकरण के लिए उपयोग की जाती है तो कमांड निष्पादित होता है। उपयोगकर्ता द्वारा आपूर्ति की गई कमांड (यदि कोई है) को नजरअंदाज किया जाता है।

Scp सिक्योर फाइल कॉपी का उपयोग करने के प्रयास "डू-नॉट-सेंड-कमांड्स" की एक गूंज के साथ भी विफल होंगे I मैंने पाया है कि sftp भी इस कॉन्फ़िगरेशन के साथ विफल हो जाता है।

मुझे लगता है कि पिछले कुछ उत्तरों में किए गए प्रतिबंधित शेल सुझाव भी एक अच्छा विचार है। इसके अलावा, मैं इस बात से सहमत हूँ कि यहाँ विस्तृत सब कुछ "मैन sshd" पढ़ने और "अधिकृत_" के लिए खोज करने से निर्धारित किया जा सकता है


1
हालांकि no-ptyयह इंटरैक्टिव निष्पादन को खोलने की अनुमति नहीं देता है, यह कमांड निष्पादन को रोकने के लिए कुछ भी नहीं करता है, इसलिए उपयोगकर्ता authorized_keysफ़ाइल को संपादित कर सकता है यदि उसके पास कुछ ऐसा है ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'
सिंकडे

4
@synapse कमांड = "/ बिन / इको डू-नॉट-सेंड-कमांड्स", जो ऊपर भी सूचीबद्ध है, का उद्देश्य कमांड ब्लॉक करना है। और एक संदेश प्रदान करें। क्या आपने ऊपर दिए गए संपूर्ण सेटिंग्स को पराजित करने के लिए अपना उदाहरण दिया है या आप केवल बिना किसी टिप्पणी के टिप्पणी कर रहे हैं?
पॉल

यह उल्लेख करते हुए कि व्यवस्थापक किसी अधिकृत_की फ़ाइल या निर्देशिका वाले स्वामित्व के उपयोगकर्ताओं को देने के लिए बाध्य नहीं हैं, और न ही यह उपयोगकर्ताओं के होम निर्देशिका में मौजूद है (ssh सर्वर को इसके स्थान के लिए ठीक से कॉन्फ़िगर किया गया है)
डैनियल फैरेल

?? @DanFarrell रूट / अधिकृत_की जड़, या पहिया, या किसके स्वामित्व में होगा?
एंड्रयू वोल्फ

@AndrewWolfe आम तौर पर, के ~user/.ssh/authorized_keysस्वामित्व में होगा user, और userखाते तक पहुंचने के लिए उपयोग की जाने वाली अधिकृत कुंजी का प्रबंधन करेगा। SSH अनुमतियों के बारे में योग्य है ~/.ssh/और इसकी सामग्री पर अपेक्षाएँ लागू कर सकता है । मैंने किया sudo chown root: .ssh/authorized_keysऔर ऐसा लगता है कि मुझे लॉग इन करने से रोक दिया गया है, लेकिन मुझे पिछले अनुभव से पता है कि उपयोगकर्ता को उस फ़ाइल का मालिक नहीं होना चाहिए - rootयदि आप चाहें तो इसे प्रबंधित कर सकते हैं।
डैनियल फैरेल

18

आप संभवतः उपयोगकर्ता के शेल को प्रतिबंधित शेल में सेट करना चाहेंगे । उपयोगकर्ता के ~ / .bashrc या ~ / .bash_profile में पाथ चर को अनसेट करें, और वे किसी भी आदेश को निष्पादित करने में सक्षम नहीं होंगे। बाद में, यदि आप तय करते हैं कि आप उपयोगकर्ता (नों) को कमांड के सीमित सेट को निष्पादित करने की अनुमति देना चाहते हैं, जैसे lessया tailउदाहरण के लिए, तो आप अनुमत कमांड को एक अलग निर्देशिका (जैसे /home/restricted-commands) के लिए कॉपी कर सकते हैं और पीएटीएच को इंगित करने के लिए अपडेट कर सकते हैं। वह निर्देशिका।


1
लेकिन यह उपयोगकर्ता को ssh कमांड लाइन पर एक अलग कमांड निर्दिष्ट करने से नहीं रोकता है, जैसे ssh use@host "/bin/bash", क्या यह करता है?
फ्रिट्ज़

हाँ, ऐसा लगता है कि user@hostखोल के रूप में rbash है। प्रतिबंधित खोल
जेसन दिवस

ठीक है, मैंने इसकी कोशिश की और आप सही हैं। चूंकि निर्दिष्ट कमांड लॉगिन शेल द्वारा निष्पादित की /bin/bashजाती है, इसलिए निष्पादन विफल हो जाता है क्योंकि इसमें स्लैश होते हैं।
फ्रिट्ज़

3
हालांकि यह कहा जाना चाहिए कि अनुमति देना lessएक बुरा विचार है, क्योंकि वहां से आप एक अप्रतिबंधित शेल से बच सकते हैं !/bin/bash। अन्य उदाहरणों के लिए pen-testing.sans.org/blog/2012/06/06/… देखें । तो व्यक्तिगत आज्ञाओं की अनुमति बहुत, बहुत सावधानी से, अगर बिल्कुल भी हो।
फ्रिट्ज़

17

No-X11- फ़ॉरवर्डिंग जैसे अधिकृत_की ऑप्शन के अलावा, वास्तव में एक वही है जो आप के लिए पूछ रहे हैं: permopen = "host: port"। इस विकल्प का उपयोग करके, उपयोगकर्ता केवल निर्दिष्ट होस्ट और पोर्ट पर एक सुरंग स्थापित कर सकता है।

AUTHORIZED_KEYS फ़ाइल प्रारूप के विवरण के लिए आदमी sshd देखें।


13
आपको विकल्प सेट के भाग के रूप में "नो-पीटीआई" भी निर्दिष्ट करना होगा। यदि आप केवल "पेर्मोपेन" का उपयोग करते हैं, तो आप दिए गए होस्ट / पोर्ट पर सुरंगों को प्रतिबंधित करेंगे ... लेकिन आप अभी भी इंटरैक्टिव गोले की अनुमति देंगे।
जॉन हार्ट

क्या पर्मोपेन के साथ पोर्ट फॉरवर्डिंग को प्रतिबंधित करने से भी एसएन-वाई के लिए उस तरह की सुरंग डिवाइस को लॉक किया जाता है जो फॉरवर्ड करता है?
फ्लैबलिबल

5
@ जॉनहार्ट: no-ptyशेल एक्सेस को प्रतिबंधित नहीं करता है, आप अभी भी शेल पर पहुंचेंगे , यह सिर्फ आपको संकेत नहीं दिखाएगा; आप अभी भी कमांड दे सकते हैं और आउटपुट को ठीक देख सकते हैं। command="..."यदि आपको शेल एक्सेस को प्रतिबंधित करना है तो आपको विकल्प की आवश्यकता होगी .ssh/authorized_keys
अलेक्सी तोरामो

9

मेरा समाधान उस उपयोगकर्ता को प्रदान करना है जो केवल एक इंटरैक्टिव शेल के बिना सुरंग बना सकता है, उस शेल को / etc / passwd में / usr / bin / tunnel_shell में सेट करने के लिए

बस एक अनंत लूप के साथ निष्पादन योग्य फ़ाइल / usr / bin / tunnel_shell बनाएं

#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0

यहाँ पूरी तरह से समझाया गया है: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/


9
CTRL + Z स्क्रिप्ट से बचकर आपको bash तक पूरी पहुंच प्रदान करेगा ... स्क्रिप्ट की बहुत शुरुआत में "ट्रैप '' 20" (बिना उद्धरण के) जोड़ने की कोशिश करें
बिग पापू

1
संकेत के लिए धन्यवाद, मैंने कुछ बाधित संकेतों के जाल को जोड़ा
डैनियल डब्ल्यू।

1
मैं सिर्फ एक "शेल" के लिए / बिन / बिल्ली का उपयोग करता हूं। ठीक काम करने लगता है। बिल्ली के खिलाफ किसी भी कारनामे के बारे में पता नहीं है, और यहां तक ​​कि अगर आपको कुछ इनपुट पैटर्न मिला जो इसे क्रैश करने का प्रबंधन करता है, तो आपका ssh सत्र समाप्त हो जाएगा।
flabdablet

4
@BigPapoo: क्या आपने वास्तव में इसका परीक्षण किया? मैं नहीं देख सकता कि यह कहाँ से बच जाएगा। यदि आप एक शेल में हैं और आप दौड़ते हैं tunnel_shell, तो आपके पास shell -> /bin/bash tunnel_shellइतना जरूर होगा कि आप शेल से वापस बच सकते हैं, लेकिन यदि आपने उपयोगकर्ता के शेल के tunnel_shell रूप में सेट किया है, तो आपके पास केवल शेल ही /bin/bash tunnel_shellरहेगा, जिससे बचने के लिए कोई शेल नहीं है , जहा तक मै देख सकता हू। मैंने इसका परीक्षण किया और ctrl-z से बच नहीं सका। यदि आपने इसे आज़माया और बच सकते हैं, तो क्या आप सेटअप पोस्ट कर सकते हैं? इसी तरह, यदि आप किसी भी प्रलेखन के बारे में जानते हैं जो कहता है कि इसे उसी तरह काम करना चाहिए, तो क्या आप इसे पोस्ट कर सकते हैं?
अलेक्सी तोराहो

3

मैं लॉग इन करने के लिए सार्वजनिक कुंजी के साथ अधिकृत_की फ़ाइल स्थापित करने में सक्षम हूं। मुझे यकीन नहीं है कि अतिरिक्त जानकारी के लिए मुझे उस खाते को प्रतिबंधित करने की आवश्यकता है जो करने की अनुमति है। उदाहरण के लिए, मुझे पता है कि मैं इस तरह के आदेश डाल सकते हैं:

no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding

आप अपनी अधिकृत_की फ़ाइल में एक पंक्ति चाहते हैं जो इस प्रकार दिखे।

permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache 

3

यदि आप केवल एक विशिष्ट कमांड के लिए एक्सेस की अनुमति देना चाहते हैं - जैसे कि svn - आप उस कमांड को अधिकृत कीज फाइल में भी निर्दिष्ट कर सकते हैं:

command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]

से http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks


3

यहाँ आपके पास एक अच्छा पोस्ट है जो मुझे उपयोगी लगा: http://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/

यह विचार है: (नए प्रतिबंधित उपयोगकर्ता नाम के साथ "sshtunnel")

useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel

ध्यान दें कि हम उपयोगकर्ता जो कर सकते हैं उसे प्रतिबंधित करने के लिए rbash (प्रतिबंधित-बैश) का उपयोग करते हैं: उपयोगकर्ता सीडी (परिवर्तन निर्देशिका) नहीं कर सकता है और किसी भी पर्यावरण चर को सेट नहीं कर सकता है।

फिर हम उपयोगकर्ता के PATH env वैरिएबल /home/sshtunnel/.profileको कुछ भी नहीं संपादित करते हैं - एक ऐसी चाल जिससे bash को निष्पादित करने के लिए कोई कमांड नहीं मिलेगी:

PATH=""

अंत में हम निम्नलिखित अनुमतियों को सेट करके किसी भी फाइल को संपादित करने के लिए उपयोगकर्ता को हटा देते हैं:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile

0

मैंने एक सी प्रोग्राम बनाया जो इस तरह दिखता है:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
    if (signo == SIGHUP)
        exit(0);
}

int main()
{
    signal(SIGINT, &sig_handler);
    signal(SIGTSTP, &sig_handler);

    printf("OK\n");
    while(1)
        sleep(1);
    exit(0);
}

मैंने इस कार्यक्रम के लिए उपयोगकर्ता का प्रतिबंधित खोल दिया।

मुझे नहीं लगता कि प्रतिबंधित उपयोगकर्ता कुछ भी निष्पादित कर सकता है, भले ही वे करते हों ssh server command, क्योंकि कमांड शेल का उपयोग करके निष्पादित किए जाते हैं, और यह शेल कुछ भी निष्पादित नहीं करता है।


-1

सार्वजनिक कुंजियों को प्रमाणित करने पर इस पोस्ट को देखें ।

आपको जिन दो मुख्य बातों को याद रखना चाहिए, वे हैं:

  1. सुनिश्चित करें कि आप chmod 700 ~/.ssh
  2. सार्वजनिक कुंजी ब्लॉक को अधिकृत-कुंजियों में जोड़ें

-3

आप जो भी ssh क्लाइंट उपयोग कर रहे हैं, उसके माध्यम से आप उपयोगकर्ता मशीन पर एक कुंजी उत्पन्न करेंगे। उदाहरण के लिए इस सटीक काम को करने के लिए एक उपयोगिता है। यह एक निजी और सार्वजनिक कुंजी दोनों उत्पन्न करेगा।

सार्वजनिक कुंजी फ़ाइल की सामग्री को अधिकृत_की फ़ाइल में रखा जाएगा।

आगे आपको यह सुनिश्चित करने की आवश्यकता है कि ssh क्लाइंट को सार्वजनिक कुंजी उत्पन्न करने वाली निजी कुंजी का उपयोग करने के लिए कॉन्फ़िगर किया गया है। यह काफी सीधा है, लेकिन इस्तेमाल किए जा रहे क्लाइंट के आधार पर थोड़ा अलग है।

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