ssh- एजेंट अग्रेषण और अन्य उपयोगकर्ता के लिए sudo


152

अगर मेरे पास एक सर्वर है जिसमें मैं अपनी ssh कुंजी के साथ लॉगिन कर सकता हूं और मेरे पास "sudo su - otheruser" की क्षमता है, तो मैं कुंजी अग्रेषण खो देता हूं, क्योंकि env चर हटा दिए जाते हैं और सॉकेट केवल अपने मूल उपयोगकर्ता द्वारा पठनीय होता है। क्या कोई ऐसा तरीका है जिससे मैं "सुडो सु - अन्यर" के माध्यम से कुंजी अग्रेषित कर सकता हूं, इसलिए मैं अपनी अग्रेषित कुंजी (git क्लोन और मेरे मामले में rsync) के साथ सर्वर B पर सामान कर सकता हूं?

एकमात्र ऐसा तरीका है जिसके बारे में मैं सोच सकता हूं कि अन्य लोगों के अधिकृत_की और "ssh otheruser @ localhost" के लिए मेरी कुंजी जोड़ रहा है, लेकिन यह मेरे लिए हर उपयोगकर्ता और सर्वर संयोजन के लिए बोझिल है।

संक्षेप में:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 

जवाबों:


182

जैसा कि आपने उल्लेख किया है, sudoसुरक्षा कारणों से पर्यावरण चर को हटा दिया जाता है।

लेकिन सौभाग्य sudoसे काफी विन्यास योग्य है: आप इसे ठीक से बता सकते हैं कि कौन सा पर्यावरण चर आप env_keepविन्यास विकल्प में धन्यवाद रखना चाहते हैं /etc/sudoers

एजेंट फ़ॉरवर्डिंग के लिए, आपको SSH_AUTH_SOCKपर्यावरण परिवर्तनशील रखना होगा । ऐसा करने के लिए, बस अपनी /etc/sudoersकॉन्फ़िगरेशन फ़ाइल (हमेशा उपयोग करते हुए visudo) को संपादित करें और env_keepउचित उपयोगकर्ताओं के लिए विकल्प सेट करें । यदि आप चाहते हैं कि यह विकल्प सभी उपयोगकर्ताओं के लिए सेट किया जाए, तो Defaultsइस तरह से लाइन का उपयोग करें:

Defaults    env_keep+=SSH_AUTH_SOCK

man sudoers अधिक जानकारी के लिए।

अब आप इस तरह कुछ करने के लिए सक्षम होना चाहिए (बशर्ते user1'सार्वजनिक कुंजी रों में मौजूद है ~/.ssh/authorized_keysमें user1@serverAऔर user2@serverB, और serverAकी /etc/sudoersफ़ाइल के रूप में ऊपर संकेत सेटअप है):

user1@mymachine> eval `ssh-agent`  # starts ssh-agent
user1@mymachine> ssh-add           # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA    # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2     # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB         # goto user2@serverB w/o typing pwd again...
user2@serverB>                     # ...because forwarding still works

1
यह सही उत्तर है, चिह्नित किया जाना चाहिए।
Xealot

41
यह केवल काम करता है, अगर user2ऊपर है root! अन्यथा, user2SSH_AUTH_SOCK सही तरीके से सेट हो user2जाएगा , लेकिन उदाहरण के लिए / tmp / ssh-GjglIJ9337 / तक पहुंचने में सक्षम नहीं होगा। rootउस तक पहुँच है। तो यह समस्या का हिस्सा हल कर सकता है, लेकिन ओपी नहीं: " और सॉकेट केवल मेरे मूल उपयोगकर्ता द्वारा पठनीय है"
पीटर वी। मॉरर्च

6
Defaults>root env_keep+=SSH_AUTH_SOCKयह सुनिश्चित करना चाहिए कि यह केवल आगे की ओर हो जब जड़ से सुडोल हो । आप सुरक्षा कारणों से अन्य उपयोगकर्ताओं के लिए वैसे भी ऐसा नहीं करना चाहते हैं। बेहतर है कि अन्य अभिभावकों के लिए एक अलग ssh- एजेंट चलाएं, और उचित कुंजियाँ जोड़ें।
पॉल स्काइस्का

1
sudo su -मेरे लिए काम नहीं करता है, संभवतः यह पर्यावरण को संरक्षित नहीं कर सकता क्योंकि यह sudoशेल स्टार्टअप समय पर नहीं है । sudo suकाम करने लगता है।
एलेक्स फोर्टुना

3
मैंने कभी नहीं समझा कि लोग sudo suवैसे भी क्यों इस्तेमाल करते हैं । यदि आपको एक रूट शेल की आवश्यकता है, तो यह वही है जो sudo -sया sudo -iउसके लिए है।
ईजे

68
sudo -E -s
  • -पर्यावरण को संरक्षित करेगा
  • -s एक कमांड चलाता है, एक शेल में डिफॉल्ट करता है

यह आपको मूल कुंजियों के साथ एक रूट शेल देगा जो अभी भी लोड है।


2
जैसा कि ऊपर टिप्पणी के साथ, यह केवल इस सवाल को संबोधित करता है कि क्या आप रूट बन रहे हैं, क्योंकि उस स्थिति में रूट $ SSH_AUTH_SOCK पर सामान्य पहुंच अनुमतियों के आसपास प्राप्त करने में सक्षम है।
doshea

35

फ़ाइल को एक्सेस करने के लिए दूसरे को अनुमति दें $SSH_AUTH_SOCKऔर यह सही ACL द्वारा उदाहरण के लिए, उन्हें स्विच करने से पहले। मेजबान मशीन Defaults:user env_keep += SSH_AUTH_SOCKमें उदाहरण मानता है /etc/sudoers:

$ ssh -A user@host
user@host$ setfacl -m otheruser:x   $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$

अधिक सुरक्षित और गैर-रूट उपयोगकर्ताओं के लिए भी काम करता है ;-)


6
इस पद्धति का उपयोग करते समय याद रखें, अन्य लोग लॉग इन के रूप में otheruserभी आपके ssh प्रमाणीकरण का उपयोग कर सकते हैं।
गीताकार

यह मेरे लिए काम करता है, सिवाय इसके कि मुझे "सुडो सु - ऑन्सर" को "सुडो सु अन्सुसर" (- हटाकर) बदलना पड़ा।
चार्ल्स फिंकेल

1
क्यों rwxऔर क्यों rw(या rबिल्कुल)?
अनातोली टेकटोनिक

3
@anatolytechtonik From man 7 unix- सॉकेट से कनेक्ट करने वाले लिनक्स पर उस सॉकेट पर रीडिंग और परमिशन लिखना होता है। इसके अलावा, आपको उस निर्देशिका पर खोज (निष्पादित करना) और लिखने की अनुमति है जहां आप सॉकेट बनाते हैं या केवल खोज (निष्पादित) अनुमति देते हैं जब आप इस सॉकेट से कनेक्ट करते हैं। तो उपरोक्त उत्तर में सॉकेट पर निष्पादन की अनुमति बेमानी है।
मिश्रण

संपादित करने के लिए / etc / sudoers के बजाय आप उपयोग कर सकते हैंsudo -u otheruser --preserve-env=HOME -s
Sec

14

मैंने पाया है कि यह भी काम करता है।

sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

जैसा कि अन्य ने उल्लेख किया है, यह तब काम नहीं करेगा जब आप जिस उपयोगकर्ता पर स्विच कर रहे हैं, वह $ SSH_AUTH_SOCK (जो रूट के अलावा किसी भी उपयोगकर्ता के लिए बहुत अधिक है) पर पढ़ने की अनुमति नहीं है। आप इसे $ SSH_AUTH_SOCK सेट करके प्राप्त कर सकते हैं और यह निर्देशिका 777 की अनुमति के लिए है।

chmod 777 -R `dirname $SSH_AUTH_SOCK`
sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

यह हालांकि बहुत जोखिम भरा है। आप मूल रूप से अपने SSH एजेंट (जब तक आप लॉग आउट नहीं करते हैं) का उपयोग करने के लिए सिस्टम अनुमति पर हर दूसरे उपयोगकर्ता को दे रहे हैं। आप समूह को सेट करने और अनुमतियों को 770 में बदलने में सक्षम हो सकते हैं, जो अधिक सुरक्षित हो सकता है। हालांकि, जब मैंने समूह को बदलने की कोशिश की, तो मुझे "ऑपरेशन की अनुमति नहीं थी"।


6
यह बेहद जोखिम भरा है। अपने SSH एजेंट का उपयोग करने के लिए हर दूसरे उपयोगकर्ता की अनुमति देना उन्हें आपके सभी क्रेडेंशियल्स देने के बराबर है (और यदि आप कभी sudo या su का उपयोग करते हैं, तो उन्हें सिस्टम पर अन्य सभी उपयोगकर्ताओं पर रूट पावर देने के साथ-साथ अन्य सभी सिस्टम जिन्हें आप करना चाहते हैं!) । यह कभी नहीं किया जाना चाहिए!
मतिजा नालिस

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

6

यदि आप इसके लिए अधिकृत हैं sudo su - $USER, तो संभवतः आपके पास ssh -AY $USER@localhostUSER के होम डायरेक्टरी में आपकी मान्य सार्वजनिक कुंजी के बजाय इसकी अनुमति देने के लिए एक अच्छा तर्क होगा । फिर आपका प्रमाणीकरण अग्रेषण आपके माध्यम से किया जाएगा।


उन्होंने उल्लेख किया कि उनके सवाल के नीचे, और कहा कि यह करना मुश्किल होगा।
फहद सदह

यह शायद सबसे अच्छा समाधान है, लेकिन यह बालों वाला हो जाता है यदि $ USER एक वास्तविक व्यक्ति (tm) है - वे SA की कुंजी को
अधिकृत_की

आप अधिकृत करने के लिए उनकी लिखी पहुंच को निकाल सकते हैं_ हालांकि (अगर वे वास्तव में फ्लोरियन पहुंच से इनकार करने पर सेट हैं, तो वे इसे हटा सकते हैं और इसे फिर से बना सकते हैं, यह एक निर्देशिका में है जो वे खुद करते हैं)
फहद सदा

4

आप हमेशा sudo का उपयोग करने के बजाय एजेंट अग्रेषण के साथ लोकलहोस्ट के लिए ssh कर सकते हैं:

ssh -A otheruser@localhost

नुकसान यह है कि आपको फिर से लॉग इन करने की आवश्यकता है, लेकिन यदि आप इसे स्क्रीन / tmux टैब में उपयोग कर रहे हैं, तो यह केवल एक बार का प्रयास है, हालांकि, यदि आप सर्वर से डिस्कनेक्ट करते हैं, तो सॉकेट (निश्चित रूप से) फिर से टूट जाएगा । इसलिए यह आदर्श नहीं है यदि आप अपनी स्क्रीन / tmux सत्र को हर समय खुला नहीं रख सकते हैं (हालाँकि, SSH_AUTH_SOCKयदि आप शांत हैं तो आप अपने env var को मैन्युअल रूप से अपडेट कर सकते हैं)।

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


यह काम नहीं करता है यदि आपके पास केवल SSH (जैसे आप एससीपी सामान के रूप में चाहते हैं ) के बजाय इसके otheruserमाध्यम से पहुंच हैsudowww-data
गर्ट वैन डेन बर्ग

3

उपयोग न करें sudo su - USER, बल्कि करें sudo -i -u USER। मेरे लिये कार्य करता है!


आपके पास सूडो का कौन सा संस्करण है? मेरा (1.6.7p5, CentOS 4.8) अपने मैन पेज में -i नहीं है।
डेविड मैकिन्टॉश

Sudo version 1.6.9p17डेबियन लेनी पर चल रहा है। कोशिश करो sudo -s?
फहद सदा

6
मेरे लिए काम नहीं करता है।

उबंटू पर, Sudo 1.8.9p5 का उपयोग कर, न तो sudo -sहै और न ही sudo -iमेरे लिए काम ...
जॉन एल

2

इसके साथ आए अन्य उत्तरों की जानकारी को मिलाकर:

user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i

मुझे यह पसंद है क्योंकि मुझे sudoersफ़ाइल को संपादित करने की आवश्यकता नहीं है ।

Ubuntu 14.04 पर परीक्षण किया गया ( aclपैकेज स्थापित करना था )।


1

मुझे लगता है कि आपके आदेश के -बाद (डैश) विकल्प में कोई समस्या है su:

sudo su - otheruser

यदि आप su का मैन पेज पढ़ते हैं , तो आप पा सकते हैं कि विकल्प -, -l, --loginशेल एनवायरमेंट को लॉगिन शेल के रूप में शुरू करता है। यह पर्यावरण के लिए पर्यावरण के otheruserचर के बिना जहां आप चलाते हैं su

सीधे शब्दों में कहें तो डैश आपके द्वारा पास की गई किसी भी चीज़ को कम कर देगा sudo

इसके बजाय, आपको यह आदेश आज़माना चाहिए:

sudo -E su otheruser

जैसा कि @ joao-costa ने बताया, -Eपर्यावरण में सभी चरों को संरक्षित करेंगे जहां आप भागे थे sudo। फिर बिना डैश के, suसीधे उस वातावरण का उपयोग करेंगे।


0

दुर्भाग्य से जब आप किसी अन्य उपयोगकर्ता पर मुकदमा करते हैं (या यहां तक ​​कि sudo का उपयोग करते हैं) तो आप अपनी अग्रेषित कुंजी का उपयोग करने की क्षमता खो देंगे। यह एक सुरक्षा विशेषता है: आप यादृच्छिक उपयोगकर्ताओं को अपने ssh- एजेंट से कनेक्ट नहीं करना चाहते हैं और अपनी कुंजियों का उपयोग कर रहे हैं :)

"Ssh -Ay $ {USER} @localhost" विधि थोड़ा बोझिल है (और जैसा कि डेविड के जवाब में मेरी टिप्पणी में विखंडित होने का खतरा है), लेकिन यह शायद सबसे अच्छा आप कर सकते हैं।


1
हम्म, लेकिन अगर मैं ssh के साथ ऐसा करता हूं, तो मेरा एजेंट उस उपयोगकर्ता द्वारा वैसे भी सुलभ है, या क्या मैं गलत हूं?

यदि आप एजेंट को अग्रेषित करने वाले एजेंट के साथ लक्ष्य उपयोगकर्ता में SSH करते हैं, तो "वास्तविक" एजेंट जहां भी है, वहां चेन को उछाल देगा। जब आप मूल उपयोगकर्ता से दूर या सूडो करते हैं तो आपका SSH एजेंट सॉकेट नहीं होगा (या नहीं) सुलभ होना चाहिए - यह जिस निर्देशिका में रहता है वह मोड 700 है और मूल उपयोगकर्ता के स्वामित्व में है। (स्पष्ट कैविएट: यदि आप SSH_AUTH_SOCK वातावरण को रूट और रीसेट कर रहे हैं तो यह काम कर सकता है, लेकिन मैं इस पर भरोसा नहीं
करूंगा

1
अपने सर्वर (Ubuntu 12.04, ssh संस्करण OpenSSH_5.9p1 डेबियन-5ubuntu1.1 जो OpenSSL 1.0.1 14 मार्च 2012) पर, ssh है -aऔर -Aतर्क। -aजो इरादा है उसके ठीक विपरीत है, यह एजेंट अग्रेषण को निष्क्रिय करता है! इसलिए, उबंटू के हालिया (और संभवतः सभी) संस्करण के तहत, -Aएजेंट अग्रेषण को सक्षम करने के लिए उपयोग करें।
नाइट

@knite आप सही हैं - मेरे उत्तर में एक (3 वर्ष पुराना!) टाइपो है। अब नियत :-)
voretaq7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.