रूट उपयोगकर्ता के बिना SSH पर दूरस्थ मशीन की सभी फाइलें rsync?


68

मेरे पास रिमोट मशीन का बैकअप लेने के लिए यह कमांड है। समस्या यह है कि मुझे सभी फ़ाइलों को पढ़ने और कॉपी करने के लिए रूट अधिकारों की आवश्यकता है। मेरे पास सुरक्षा कारणों से कोई रूट उपयोगकर्ता सक्षम नहीं है और sudoउबंटू के रास्ते का उपयोग करता है। क्या मुझे ऐसा करने के लिए कुछ शांत पाइपिंग या कुछ की आवश्यकता होगी?

rsync -chavzP --stats user@192.168.1.2:/ /media/backupdisk/myserverbackup/

3
बस rootपहली बार में खाते का उपयोग करें । sudo, विशेष NOPASSWDरूप से टिप्पणियों में अनुशंसित के साथ संयुक्त , वास्तव में आपकी मशीन की सुरक्षा में सुधार नहीं करता है।
मार्टिन वॉन विटिच

जवाबों:


88

मैं आपको सलाह दूंगा कि आप पहली बार रूट खाते का उपयोग करें। यदि आप इसे इस तरह सेट करते हैं:

  • अपने sshd_configको लक्ष्य मशीन पर कॉन्फ़िगर करें PermitRootLogin without-password
  • ssh-keygenSSH निजी कुंजी बनाने के लिए बैकअप खींचने वाली मशीन का उपयोग करें (केवल अगर आपके पास पहले से SSH कुंजी नहीं है)। एक पासफ़्रेज़ सेट न करें। Google एक ट्यूटोरियल अगर आपको इसके लिए विवरण की आवश्यकता है, तो बहुत कुछ होना चाहिए।
  • /root/.ssh/id_rsa.pubबैकअप मशीन की सामग्री /root/.ssh/authorized_keysको अपने लक्ष्य मशीन पर लागू करें।
  • अब आपके बैकअप मशीन में पासवर्ड प्रमाणीकरण का उपयोग किए बिना, आपके लक्ष्य मशीन के लिए रूट एक्सेस है।

तब परिणामी सेटअप बहुत सुरक्षित होना चाहिए।


sudo, विशेष NOPASSWDरूप से टिप्पणियों में सिफारिश के साथ संयुक्त , रूट खाते का उपयोग करने पर कोई सुरक्षा लाभ नहीं है। उदाहरण के लिए यह सुझाव:

अपनी /etc/sudoersफ़ाइल में निम्न जोड़ें :rsyncuser ALL= NOPASSWD:/usr/bin/rsync

अनिवार्य रूप से rsyncuserवैसे भी रूट अनुमति देता है। तुम पूछो:

@MartinvonWittich के rsyncसाथ निष्पादित होने के कारण एक पूर्ण रूट शेल हासिल करना आसान है sudo? कृपया [एम] ई [माध्यम से] चलें।

खैर, सरल। अनुशंसित कॉन्फ़िगरेशन के साथ, rsyncuserअब rsyncपासवर्ड के लिए पूछे बिना भी रूट के रूप में चल सकता है । rsyncफ़ाइलों में हेरफेर करने के लिए एक बहुत शक्तिशाली उपकरण है, इसलिए अब rsyncuserरूट अनुमतियों के साथ फ़ाइलों में हेरफेर करने के लिए एक बहुत शक्तिशाली उपकरण है। इसका फायदा उठाने का एक तरीका मुझे बस कुछ ही मिनटों में मिला (उबंटू 13.04 पर परीक्षण किया गया, आवश्यकता है dash, bashकाम नहीं किया):

martin@martin ~ % sudo rsync --perms --chmod u+s /bin/dash /bin/rootdash
martin@martin ~ % rootdash
# whoami
root
# touch /etc/evil
# tail -n1 /etc/shadow
dnsmasq:*:15942:0:99999:7:::

जैसा कि आप देख सकते हैं, मैंने खुद को एक मूल खोल बनाया है; whoamiअपने खाते को रूट के रूप में पहचानता है, मैं फ़ाइलों को बना /etcसकता हूं और मैं इससे पढ़ सकता हूं /etc/shadow। मेरा शोषण बाइनरी पर सेट्यूड बिट सेट करना था dash; यह लिनक्स को हमेशा इस मामले में स्वामी की अनुमति के साथ उस बाइनरी को चलाने का कारण बनता है।

अच्छे कारणों से वास्तविक जड़ का होना [अनुशंसित] नहीं है। - 15 घंटे पहले रेडानिमलवार

नहीं, अनाड़ी रूप से उन स्थितियों में रूट खाते के आसपास काम करना जहां यह उपयोग करने के लिए बिल्कुल उपयुक्त है यह अच्छे कारणों के लिए नहीं है। यह कार्गो पंथ प्रोग्रामिंग का सिर्फ एक और रूप है - आप वास्तव में sudo बनाम रूट के पीछे की अवधारणा को नहीं समझते हैं, आप बस इस धारणा को "मूल रूप से बुरा है, sudo अच्छा है" लागू करते हैं क्योंकि आपने कहीं पढ़ा है।

एक तरफ, ऐसी परिस्थितियां हैं जहां sudoनिश्चित रूप से नौकरी के लिए सही उपकरण है। उदाहरण के लिए, जब आप अंतःक्रियात्मक रूप से एक ग्राफ़िकल लिनक्स डेस्कटॉप पर काम कर रहे हैं, तो हम उबंटू कहते हैं, तो उपयोग करने के लिए sudoउन दुर्लभ मामलों में ठीक है जहां आपको कभी-कभी रूट एक्सेस की आवश्यकता होती है। उबंटू जानबूझकर एक निष्क्रिय रूट खाता है और आपको sudoउपयोगकर्ताओं को हमेशा लॉग इन करने के लिए रूट खाते का उपयोग करने से रोकने के लिए डिफ़ॉल्ट रूप से उपयोग करने के लिए मजबूर करता है। जब उपयोगकर्ता बस वेब ब्राउज़र जैसे उदा का उपयोग करना चाहता है, तो रूट के रूप में लॉग इन करना एक खतरनाक बात होगी। , और इसलिए डिफ़ॉल्ट रूप से रूट खाता नहीं होना बेवकूफ लोगों को ऐसा करने से रोकता है।

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


2
अच्छी व्याख्या। क्या किसी अन्य सर्वर पर sysadmin भूमिकाएँ होने की स्थिति में sudo ओवर रूट का उपयोग करने का एक और कारण होगा? इस तरह से प्रत्येक रूट के SSH कुंजी को साझा करने के बजाय अपनी स्वयं की SSH कुंजी का उपयोग कर सकते हैं?
नाथन एस। वाटसन-हाई

2
@ NathanS.Watson-Haigh आप बस के रूप में आसान सभी SSH चाबियाँ डाल सकता है /root/.ssh/authorized_keys, या यहां तक ​​कि अलग-अलग घरों के साथ कई रूट खाते बना सकते हैं ताकि प्रत्येक उपयोगकर्ता का अपना शेल, घर और .ssh/authorized_keys:) हो
मार्टिन वॉन विटिच

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

2
सूदो रूट का उपयोग करने के बारे में मार्टिन की चिंताएं मान्य हैं, लेकिन ऐसा लगता है कि उन्हें सूडो फाइल में सटीक rsync मापदंडों को निर्दिष्ट करके कम किया जा सकता है। Ubuntu पर sudoers (5) मैन पेज के अनुसार: "यदि एक Cmnd के पास कमांड लाइन आर्ग्युमेंट्स हैं, तो Cmnd में दिए गए तर्क कमांड लाइन पर उपयोगकर्ता द्वारा दिए गए उन लोगों से बिल्कुल मेल खाने चाहिए (या यदि कोई हो तो वाइल्डकार्ड से मिलान करें) । " यदि sudoers फ़ाइल सटीक rsync कमांड को सटीक विकल्पों (स्रोत और गंतव्य सहित) के साथ निर्दिष्ट करती है, तो ऐसा लगता है कि यह सुरक्षित होना चाहिए।

4
एक विचार जो पहले नहीं लाया गया था: sshdआम तौर पर लॉग नहीं होता है कि किसी खाते से कनेक्ट करने के लिए किस अधिकृत कुंजी का उपयोग किया गया था, इसलिए यदि आप bobतब कनेक्ट करते हैं sudo, तो आपको एक बेहतर ऑडिट ट्रेल मिलता है यदि आप rootसीधे bobकुंजी से जुड़ते हैं ।
कोडर

71

--rsync-pathरिमोट rsyncकमांड को sudoविशेषाधिकारों के साथ चलाने के लिए विकल्प का उपयोग करें । आपकी कमांड तब होनी चाहिए जैसे:

rsync -chavzP --rsync-path="sudo rsync" --stats user@192.168.1.2:/ .

यदि sudoआप किसी पासवर्ड के लिए संकेत देते हैं, तो आपको NOPASSWDदूरस्थ उपयोगकर्ता खाते के साथ विशेषाधिकार का उपयोग करके (या रूट के लिए व्यर्थ), अन्य उपयोग के मामलों में समझ में आने से बचना होगा , या यदि आप ऐसा नहीं करना चाहते हैं:

  • सुनिश्चित करें कि tty_ticketsआपके द्वारा उपयोग किए जा रहे उपयोगकर्ता के लिए विकल्प अक्षम है, उदाहरण के लिए sudo visudo -f /etc/sudoers.d/local-rsync और दर्ज करके:

    Defaults:your.username.for.rsync !tty_tickets
    
  • सुनिश्चित करें कि requirettyआपके द्वारा उपयोग किए जा रहे उपयोगकर्ता के लिए विकल्प अक्षम है - यह डिफ़ॉल्ट रूप से बंद हो सकता है। विधि ऊपर की तरह ही है।

  • sudoरिमोट मशीन पर पासवर्ड को बीज , जैसे कि चल रहा है ssh -t user@192.168.1.2 sudo


1
@scai पासवर्ड कि के लिए कहा जाता है सबसे अधिक संभावना है sudoपासवर्ड, नहीं sshपासवर्ड
umläute

2
@redanimalwar sudo /usr/bin/rsyncबिना पासफ़्रेज़ के आपके उपयोगकर्ता को अनुमति देता है ; man sudoersयह कैसे करें के लिए जाँच करें; आप इसके लिए एक अतिरिक्त बैकअप उपयोगकर्ता बनाना चाहते हैं।
umläute

5
sudo /usr/bin/rsyncपासवर्ड को अपनी /etc/sudoersफ़ाइल में जोड़े बिना चलाने की अनुमति देने के लिए : rsyncuser ALL= NOPASSWD:/usr/bin/rsyncयह उपयोगकर्ता को उपयोगकर्ता नाम के साथ rsyncuser (जैसा कि ऊपर बताया गया है एक समर्पित बैकअप उपयोगकर्ता बनाने के लिए सबसे अच्छा होगा) की अनुमति देगा।
M_dk

4
@M_dk अब rsyncअनिवार्य रूप से हमेशा रूट अनुमतियाँ हैं; उस खाते में एक पूर्ण रूट शेल हासिल करना बहुत आसान है। मुझे लगता है कि पहले स्थान पर वास्तविक रूट खाते का उपयोग करना बेहतर है।
मार्टिन वॉन विटिच

1
echo "password" | somethingमैं वास्तव में कभी भी इसका इस्तेमाल नहीं करने का जवाब देता था और rsync के निर्दोष निष्पादन (यहाँ भी नहीं सुझाया गया) को लागू करने के साथ आने वाली सुरक्षा समस्याओं से सहमत था। मुझे tty_ticketsवास्तव में क्या पता है, क्या जरूरत है और एक सुरक्षा मुद्दा है। यह ssh पर सिर्फ sodo चलाकर और फिर कमांड को सही से निष्पादित किए बिना कुछ भी सुरक्षित रूप से काम करेगा? लेकिन जब से मैंने विभाजन के उद्देश्यों के लिए यह प्रश्न पूछा है, मैं पूरी तरह सहमत हूं कि बिना pw के कुंजी आधारित ssh सुरक्षित और सही करना है। मैंने इसके बजाय मार्टिंस के उत्तर को स्वीकार किया।
लालनिमलवार

17

ऐसा करने का एक सरल तरीका यह है कि ग्राफिकल ssh-askpassप्रोग्राम का उपयोग करें sudo, यह इस तथ्य के आसपास मिलता है कि sudoटर्मिनल से जुड़ा नहीं है और आपको पासवर्ड सुरक्षित रूप से दर्ज करने की अनुमति देता है:

rsync -chavzPe 'ssh -X' --stats \
  --rsync-path='SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A rsync' \
  user@192.168.1.2:/ .

बेशक ssh-askpassकार्यक्रम को दिए गए स्थान पर स्थापित किया जाना चाहिए और जिस मशीन पर आप काम कर रहे हैं, उस पर आपको एक एक्स सत्र चलाना होगा। ssh-askpassकार्यक्रम पर कुछ विविधताएं हैं जो काम भी करना चाहिए (ग्नोम / केडीई संस्करण)। इसके अलावा एक चित्रमय sudoप्रतिस्थापन कार्यक्रम की तरह gksuया kdesudoभी काम करना चाहिए।


rsync --rsh='ssh -X' --rsync-path='gksudo -- rsync' user@host:/ .काम नहीं करता है। rsync error: syntax or usage error (code 1) at main.c(1634) [server=3.1.1]। ओह, उबंटु सूक्ति-एसश-अस्सेपास को जहाज करता है, लेकिन यह /usr/bin/ssh-askpassइसके बजाय है /usr/lib/ssh/x11...। तो यह काम किया :)
पीटर कॉर्डेस

1
यह बेहतर समाधानों में से एक है क्योंकि इसके दूसरे छोर पर किसी भी पुन: संयोजन की आवश्यकता नहीं होती है - बस ज़रूरत है कि स्थापित किया गया और एक्स अग्रेषण सक्षम हो, जिसमें से दोनों को काफी सामान्य होना चाहिए।
डेविड गार्डनर

1
स्थापित करने के बाद एक आकर्षण की तरह काम करता है ssh-askpass। मुझे सिर्फ इसका अर्थ देखना था -chavzPe, इनको लंबे विकल्पों के रूप में प्रस्तुत करना बहुत अच्छा होगा।
krlmlr

मैंने यह कोशिश की, लेकिन प्रॉम्प्ट रिमोट मशीन पर खुल रहा है और इसे स्थानीय मशीन को भेजा नहीं जा रहा है। X11Forwarding काम कर रहा है उम्मीद है, जिसे मैंने xeyesSSH का उपयोग करके सत्यापित किया है ।
जायसी बाबू

7

यदि आपके उपयोगकर्ता के पास पहले से ही sudo विशेषाधिकार है जो एक पासवर्ड के साथ सुरक्षित है तो मैं उन्हें अपने पास रखूंगा और केवल पासवर्ड के बिना rsync का उपयोग करने के लिए एक श्लोक जोड़ूंगा:

%admin ALL=(ALL) ALL
%admin ALL= NOPASSWD:/usr/bin/rsync 

5

मैं आज इस समस्या में भाग गया और कॉन्फ़िगरेशन फ़ाइलों को संशोधित करने या उपयोगकर्ता खातों के लिए रूट-स्तर की अनुमति देने की आवश्यकता के बिना इसे हल किया। मेरा विशेष सेट-अप यह था कि Aमशीन पर मौजूद उपयोगकर्ता को उपयोगकर्ता fooकी सभी निर्देशिकाओं fooको मशीन barसे उस backupनिर्देशिका में कॉपी करना था जो उपयोगकर्ता के Aस्वामित्व में थी। (उपयोगकर्ता Aपर sudo विशेषाधिकार है foo।)

मेरे द्वारा उपयोग की जाने वाली कमांड नीचे है। यह उपयोगकर्ता द्वारा निर्देशिका Aमें इनवॉइस किया गया था ।/homefoo

sudo rsync -avu -e "ssh -i /home/A/.ssh/id_rsa -l A"  * B:/home/backup

यह sudo के रूप में rsync चलाता है ताकि सभी उपयोगकर्ता निर्देशिकाओं को fooएक्सेस किया जा सके लेकिन यह rsync को barउपयोगकर्ता Aके क्रेडेंशियल्स का उपयोग करके मशीन तक पहुंच का उपयोग करने के लिए कहता है । ऊपर दिए गए सवाल से मेरी ज़रूरतें थोड़ी अलग थीं, लेकिन इससे मुझे सिस्टम के कॉन्फ़िगरेशन के साथ मैकिंग किए बिना किसी विशेष मशीन पर सभी उपयोगकर्ता निर्देशिकाओं का बैकअप जल्दी से प्राप्त करने की अनुमति मिली।


2
ये जबरदस्त है। मैं -iविकल्प के बारे में भूल गया ssh--rsync-path="sudo /usr/bin/rsync" यदि आपके पास मशीन पर सूडो है तो आप इसका उपयोग कर सकते हैं bar। यह तब के रूप में पढ़ने root@fooऔर लिखने के रूप में करता है root@bar, लेकिन के माध्यम से स्थानांतरण A@foo-> B@bar। धन्यवाद!
ctbrown

यह मालिक (जैसे रूट) को संरक्षित नहीं करेगा, क्या मैं सही हूं?
एंड्रीस

3

लक्ष्य मशीन पर डेमॉन के रूप में rsync चलाना आपको वह करने की अनुमति देता है जो आप चाहते हैं।


1
मैंने इस उत्तर को उकेरा, लेकिन यह बेहतर होगा कि w / रूट एक्सेस कैसे प्राप्त करें, और आप इसे w / रूट एक्सेस का उपयोग कैसे करें के बारे में कुछ व्याख्या करेंगे।
माइक लिपर्ट

rsync के रूप में डेमॉन इस मामले से मेल नहीं खाता, क्योंकि rsync रूट अनुमतियाँ छोड़ देगा जब रूट के रूप में भी शुरू किया जाता है तो सभी फ़ाइलों को स्थानांतरित नहीं किया जा सकता है।
टीसलर

2

मेरा समाधान उपयोग करना है, --rsync-path="sudo rsync"लेकिन यह पासवर्ड, वर्कअराउंड के लिए कहता है:

rsync -chavzP --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  user@192.168.1.2:/ .

1
यह आमतौर पर एक कमांड लाइन वन-लाइनर में पासवर्ड डालने के लिए एक अच्छा विचार नहीं है; उदाहरण के लिए, वे प्रक्रिया पेड़ में दिखाई देते हैं। मैं कभी-कभी इस तरह के बयान में वास्तविक पासवर्ड को बदल देता हूं $( cat my_password.txt ), जिसके साथ थोड़ा बेहतर होता है, लेकिन आमतौर पर या तो एंड पर अनुमतियों को कॉन्फ़िगर करना पसंद किया जाता है, और / या एसएसएच कुंजी का उपयोग करते हैं, ऐसे में सीएलआई पर पासवर्ड की आवश्यकता नहीं होती है।
JDS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.