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


10

हमारे पास गढ़ सर्वर बी है। हमें निजी कुंजी का उपयोग करके बी से सी के माध्यम से एसएसएच की आवश्यकता है।

बेहतर विकल्प क्या है:

  • सर्वर बी पर निजी SSH कुंजी रखो । हमने पढ़ा है कि उत्पादन के माहौल में ऐसा करना एक बुरा विचार है।

    से यहाँ :

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

  • SSH एजेंट अग्रेषण का उपयोग करें । एजेंट अग्रेषण स्थापित करने के लिए, मुझे टीसीपी अग्रेषण की अनुमति देने की आवश्यकता है। एजेंट फ़ॉरवर्डिंग सेट करते समय, एक सॉकेट फ़ाइल फ़ॉरवर्डिंग होस्ट पर बनाई जाती है, जो कि वह तंत्र है जिसके द्वारा कुंजी को गंतव्य पर भेजा जा सकता है। AWS में बैशन सेटिंग्स में:

    टीसीपी आगे: इस मान को सही पर सेट करने से टीसीपी अग्रेषण (एसएसएच टनलिंग) सक्षम हो जाएगा। यह बहुत उपयोगी हो सकता है लेकिन यह एक सुरक्षा जोखिम भी है, इसलिए हम अनुशंसा करते हैं कि जब तक आवश्यक न हो आप डिफ़ॉल्ट (अक्षम) सेटिंग रखें

    यहाँ से भी :

    SSH एजेंट अग्रेषण हानिकारक माना जाता है

क्या बेहतर है? दूसरे लिंक से विकल्प के बारे में क्या: ProxyCommand , मैं समझता हूं कि यह सॉकेट फ़ाइल समस्या के साथ मदद करता है, लेकिन फिर भी मुझे लगता है कि मुझे टीसीपी अग्रेषण सक्षम करना होगा, तो क्या यह पर्याप्त सुरक्षित है?


2
ProxyCommand के साथ आपको TCP अग्रेषण सक्षम करने की आवश्यकता नहीं है। अग्रेषण मध्यवर्ती मेजबान पर ssh द्वारा किया जाता है।
अप्रैल को

धन्यवाद। क्या विन्यास फाइल होनी चाहिए? मेरे कंप्यूटर में या बैस्टियन में?
user2503775

आपके स्थानीय सिस्टम पर, जहां आप ssh hostbकमांड दर्ज करेंगे , ताकि यह स्थानीय कॉन्फिग में होस्टब को देख सके और यह जान सके कि उसे होस्ट के माध्यम से कनेक्ट करने की आवश्यकता है। यदि आप
होस्ट

सर्वर C की निजी कुंजी कहाँ संग्रहीत की जाएगी? मेरे COMP में भी? मैं keeAgent के साथ Keepass का उपयोग कर रहा हूं
user2503775

2
मुझे डर है कि आप एजेंट अग्रेषण के साथ टीसीपी अग्रेषण को भ्रमित कर रहे हैं । वे अलग चीजें हैं।
एमएलयू

जवाबों:


13

ProxyCommand या ProxyJump का उपयोग करें

मैं उपयोग करने की सलाह दूंगा ProxyCommand(या ProxyJumpसिंटैक्स के रूप में भी बेहतर है लेकिन ओपनशिश की आवश्यकता है 7.3+ मुझे क्लाइंट की तरफ से लगता है), और आपको बैशन पर निजी कुंजी को तैनात करने की आवश्यकता नहीं है, सब कुछ स्थानीय रहता है।

ProxyJump के साथ उदाहरण

अपने क्लाइंट कंप्यूटर पर आप ~/.ssh/configएक ऐसी सामग्री के तहत एक फाइल लिखते हैं जिसमें bellow हो:

Host bastion
  HostName bastion.example.com
  User bastion-user
  Port 22
  IdentityFile ~/.ssh/id_bastion

Host srvC
  HostName srvC.local
  User server-user
  IdentityFile ~/.ssh/id_protected_lan
  ProxyJump bastion

फिर कर ssh srvCआपको C को B (गढ़) के माध्यम से बिना एजेंट अग्रेषण के कनेक्ट करेगा और न ही निजी कुंजी को गढ़ में तैनात करेगा।

उपरोक्त उदाहरण में, "बैस्टियन" आपके बैशन होस्ट के लिए एक उपनाम है और srvC आपके सर्वर C. के लिए एक अन्य नाम है। HostNameआपको अपने मेजबानों के लिए या तो आईपी या वास्तविक रूप से पूरी तरह से योग्य डोमेन नाम रखने की आवश्यकता है। उपयोगकर्ताओं के लिए, आपको Userबैस्टियन और सर्वर सी पर सही लॉगिन नाम के लिए अपडेट करने की आवश्यकता है । अंत में IdentityFileवैकल्पिक है यदि आप एक स्थानीय एजेंट (जैसे KeeAgent या ssh- एजेंट) का उपयोग करते हैं, लेकिन अगर यह नहीं चल रहा है तो यह भी होगा काम करें और आपको प्रत्येक प्रमुख पासफ़्रेज़ के लिए कहें।

सार्वजनिक कुंजी तैनात करना

बेशक आपको गढ़ और srvC दोनों के लिए सार्वजनिक कुंजियों को तैनात करने की आवश्यकता है । आप उपयोग कर सकते हैं ($ संकेत सिर्फ संकेत को दर्शाने के लिए है, इसे टाइप न करें):

$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   srvC

नोट: उपरोक्त केवल तभी काम करेगा जब पासवर्ड प्रमाणीकरण अभी भी अनुमति है। उपरोक्त परिनियोजन और पुष्टि करने के बाद कि सब कुछ इच्छानुसार काम करता है, आपको 2 सर्वरों पर पासवर्ड प्रमाणीकरण को अस्वीकार करना चाहिए।

ProxyJomm के बजाय ProxyCommand के साथ उदाहरण

यदि आपके पास OpenSSH का पुराना संस्करण है जो ProxyJump(क्लाइंट की तरफ) समर्थन नहीं करता है , तो प्रतिस्थापित करें:

ProxyJump bastion

द्वारा

ProxyCommand ssh -q -W %h:%p bastion

जहां तक ​​मैंने समझा, यह समान है।


धन्यवाद! मैं लिनक्स के साथ काम करता हूं, लेकिन हमारे पास कुछ टीम के सदस्य हैं जो खिड़कियों पर काम कर रहे हैं। यह वहाँ भी काम करना चाहिए, है ना?
user2503775

वे किस SSH क्लाइंट का उपयोग करने जा रहे हैं? OpenSSH (WSL, या cygwin या आदि के माध्यम से) या PuTTY (या PuTTY पर आधारित एक अन्य टूल) जैसे MobaXterm?
Huygens

उनमें से कुछ PuTTy का उपयोग करते हैं और अन्य लोग Git Shell के माध्यम से ssh का उपयोग करते हैं।
user2503775

@ user2503775 मैंने इसे PuTTY के साथ कभी नहीं आज़माया है, लेकिन ऐसा लगता है कि ProxyCommand दृष्टिकोण का उपयोग करना संभव है, यहां देखें: stackoverflow.com/a/28937185
Huygens

1
विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद!
user2503775

5

मैंने ProxyJump के बारे में जवाब देखा। चलिए बात करते हैं ProxyCommand की

लेकिन ठहरो, ठहरो! मैं आपको लिख सकता हूं कि एजेंट अग्रेषण का उपयोग करने वाले सर्वर को कैसे हैक किया जाए , जो अंतर को समझने में बहुत आसान होगा!

चलो हैक करो!

मूल चरणों के लिए: आप यहाँ मेरी पोस्ट पढ़ सकते हैं

मूल चरण निम्नलिखित हैं:

  1. गढ़ उपयोगकर्ता बनाएँ
  2. रूट लॉगिन अक्षम करें
  3. हैकिंग के प्रयासों को ब्लॉक करें
  4. पोर्ट बदलें
  5. फ़ायरवॉल कॉन्फ़िगर करें
  6. SELinux कॉन्फ़िगर करें

AgentForwarding का उपयोग कैसे करें

~ / .Ssh / config में -Create config

  Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

Ssh- एजेंट के लिए अपनी प्रमाणीकरण कुंजी जोड़ें

ssh-add ~/.ssh/name_rsa

-काटा जाना गढ़ना होस

ssh bast

-बैशन से एप्लिकेशन सर्वर को कनेक्ट करें

 ssh app@IP -p PORT

हैकिंग!

तुम, ठीक है, मुझसे सवाल पूछ सकते हैं:

  • क्या मेरा सर्वर सुरक्षित है? और जवाब काफी सरल है:

    • नहीं!
  • क्यों?

    • क्योंकि आप SSH Agent का इस्तेमाल कर रहे हैं!
  • और समस्या कहाँ है?

    • क्योंकि एजेंट अग्रेषण खतरनाक है और इसे हानिकारक माना जाता है।
  • क्यों?

    • चलो अंदर सब कुछ समझाते हैं: जब आप गढ़ को जोड़ते हैं तो मेजबान आपके शानदार ssh- एजेंट को अग्रेषित करता है। इसका मतलब है कि सॉकेट स्थापित किया जाएगा ताकि कोई आपके सर्वर तक पहुंचने के लिए इस सॉकेट डेटा का उपयोग कर सके। कल्पना करें कि आपके गढ़ सर्वर से छेड़छाड़ की जाती है, यदि किसी के पास आपके लिनक्स सर्वर पर पर्याप्त अनुमति है तो वह आपकी सॉकेट जानकारी का उपयोग करेगा। नतीजतन, आपके सभी सर्वर तक पहुँचा जा सकता है। मैं जानता हूं कि समझौता की खिड़की बहुत छोटी होती है क्योंकि यह इस बात पर निर्भर करता है कि आप कितने समय में गढ़ मेजबान से जुड़े हैं। लेकिन क्या आप वास्तव में जोखिम चाहते हैं जब आपके पास ProxyCommand जैसे अन्य विकल्प हैं? इसलिए, बस ProxyCommand का उपयोग करें!

यदि आप गढ़ होस्ट से समझौता करते हैं तो सर्वर कैसे हैक करें?

ट्रैक लक्ष्य

/ Tmp निर्देशिका में आप ऐसा कुछ देख सकते हैं:

[root@localhost tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo

अस्थायी फ़ाइल खोलें

[root@localhost tmp]# cd ssh-mKX88v0Vlo/
[root@localhost ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep  7 17:35 agent.10507

आइए इस प्रक्रिया आईडी से कनेक्शन देखें ।

netstat -nxp | grep  10507

परिणाम:

unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion

और कौन जुड़ा हुआ है

lsof -i -a -p 10507

परिणाम:

COMMAND  PID   USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd    10507 bastion  3u  IPv4 501301  0t0  TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)

हम सॉकेट फाइल भी देख सकते हैं:

cd /proc/10507/fd/
ls

परिणाम:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

और क्या होता है जब ग्राहक दूरस्थ सर्वर से जुड़ा होगा ? चलो देखते हैं:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

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

unix  3 [ ]  STREAM  CONNECTED  502267  10561/sshd: 
                     bastion  /tmp/ssh-oVoMXC6vb8/agent.10561
unix  3  [ ] STREAM     CONNECTED     502072   10561/sshd:  bastion 

सॉकेट जानकारी और आईपी पते को चोरी करें

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

netstat -tn

अंतिम चरण का उपयोग करने के अग्रेषित सॉकेट फ़ाइल

eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507

जांचें कि क्या कुंजी भरी हुई है

ssh-add -l

परिणाम कुछ इस तरह होना चाहिए :

2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)

सर्वर हैक किया गया है, सुरक्षा समस्या को कैसे ठीक करें?

प्रॉक्सी कमांड

Host app
    Hostname *.*.*.*
    IdentityFile ~/.ssh/your_rsa
    User *******
    Port ****
    ProxyCommand ssh -W %h:%p bast

Host bast
     Hostname *.*.*.*
     ForwardAgent no
     User ******

बुनियादी संचालन के लिए: सर्वर के माध्यम से फ़ाइलों को स्थानांतरित कैसे करें (क्लाइंट से सर्वर, सर्वर से क्लाइंट तक), आप यहां मेरी पोस्ट पर पढ़ सकते हैं

निष्कर्ष

  • यदि आप गढ़ होस्ट का उपयोग करते हैं, तो AgentForwarding का उपयोग न करें बल्कि ProxyCommand का उपयोग करें
  • प्रमाणीकरण के लिए हमेशा गैर-रूट उपयोगकर्ता का उपयोग करें
  • एक फ़ायरवॉल का उपयोग करें और सभी अनावश्यक कनेक्शन को ब्लॉक करें।
  • SELinux का उपयोग करें (सामान्य रूप से)
  • IP पते को ब्लॉक करें जो कई बार गलत क्रेडेंशियल के साथ लॉग इन करने की कोशिश करता है
  • यदि यह आवश्यक नहीं है तो उपयोगकर्ता को sudo की अनुमति न दें
  • अपने सर्वर की निगरानी करें
  • सुरक्षा पैच के लिए अपने सर्वर को अपडेट करें

अधिक जानकारी, मेरे को देखने के ब्लॉग । इसके अतिरिक्त मेरे पास कुछ स्क्रीन्सशॉट्स हैं, इसलिए यह आपके लिए उपयोगी हो सकता है।


आपका बहुत बहुत धन्यवाद! वास्तव में, हम लॉगिन पर भी Google प्रमाणक का उपयोग करते हैं।
user2503775

मैं ssh ऐप को कॉल करने का प्रयास करते समय एक त्रुटि प्राप्त कर रहा हूं channel 0: open failed: administratively prohibited: open failed. stdio forwarding failed. :। क्या आपको अंदाजा है कि क्यों? सुरक्षित लॉग में मैं देखता हूं:refused local port forward: originator 127.0.0.1 port 65535, target *app-ip* port 22
user2503775

कूल जानकारी। आपके उत्तर की पठनीयता में सुधार के लिए एक छोटी सी सलाह। यहां अपने ब्लॉग की सामग्री को कॉपी / पेस्ट न करें। लिंक और सिर्फ एक सारांश प्रदान करें। फिर वास्तविक उत्तर भाग को उजागर करें (जो कि आप ProxyCommand का उपयोग कर रहे हैं)। मैंने आपको शुरुआत में इसे देखने की कोशिश की, लेकिन कॉपी / पेस्ट के हिस्से को देखते हुए यह भ्रमित करने वाला था। वैसे भी +1
Huygens

@ user2503775 यह एक अलग समस्या होनी चाहिए, संबंधित ssh- एजेंट अग्रेषण / प्रॉक्सी कमांड नहीं। लॉग के साथ एक नया प्रश्न खोलें।
ग्रीप

मैंने किया: serverfault.com/questions/958768/…
user2503775

4

बस SSH एजेंट का उपयोग करें जो अधिकांश अन्य करते हैं।

  • चाबियाँ आपके लैपटॉप पर ssh एजेंट में होंगी ।
  • आप एजेंट के माध्यम से प्रमाणित, गढ़ में प्रवेश करते हैं।
  • वहाँ से, आप अपने लैपटॉप पर वापस अग्रेषित प्रमाणीकरण अनुरोध के साथ, मेजबान को लक्षित करें

लाभ: गढ़ पर कोई भी कुंजी संग्रहीत नहीं है जिसका दुरुपयोग किया जा सकता है।

उम्मीद है की वो मदद करदे :)


नमस्ते, यह मूल रूप से ओपी अपनी दूसरी गोली में क्या वर्णन करता है। मैं आपको सलाह देता हूं कि प्रश्न में दिए गए दूसरे लिंक की जांच करें।
Huygens

@ ह्युजेंस सच मैंने अब गौर किया। मैंने कहा कि जब वह एजेंट को अग्रेषित करने के साथ टीसीपी अग्रेषण को मिलाता है।
एम एल

वास्तव में यह मिलाजुला है :-)
Huygens

यह मिश्रित नहीं है। मुझे फर्क समझ आता है। मैंने इसे स्पष्ट करने के लिए प्रश्न का संपादन किया।
user2503775

मैंने एक जवाब लिखा, एजेंट को कैसे हैक किया जाए (कोई चाबी नहीं है लेकिन सॉकेट खुला है)। आम तौर पर, एजेंट अग्रेषण ठीक है क्योंकि चाबियाँ चोरी करने की संभावना बहुत कम है - सबसे पहले, आपको गढ़ होस्ट को हैक करना होगा। वैसे भी आप मेरा जवाब देख सकते हैं: serverfault.com/a/958466/476642
grep
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.