rsync ไฟล์ทั้งหมดของเครื่องระยะไกลผ่าน SSH โดยไม่มีผู้ใช้รูท?


68

ฉันมีคำสั่งนี้เพื่อสำรองเครื่องระยะไกล ปัญหาคือฉันต้องการสิทธิ์รูทในการอ่านและคัดลอกไฟล์ทั้งหมด ฉันไม่ได้เปิดใช้งานผู้ใช้รูทด้วยเหตุผลด้านความปลอดภัยและใช้sudoวิธีของ Ubuntu ฉันจะต้องมีการต่อท่อแบบเย็นหรือจะทำอะไรสักอย่าง?

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

3
เพียงใช้rootบัญชีในตอนแรก sudoเมื่อรวมกับNOPASSWDคำแนะนำในความคิดเห็นโดยเฉพาะอย่างยิ่งไม่ได้ปรับปรุงความปลอดภัยของเครื่องของคุณ
Martin von Wittich

คำตอบ:


88

ฉันอยากจะแนะนำให้คุณใช้บัญชีรูทตั้งแต่แรก หากคุณตั้งค่าเช่นนี้:

  • การกำหนดค่าของคุณบนเครื่องเป้าหมายsshd_configPermitRootLogin without-password
  • ใช้ssh-keygenบนเครื่องที่ดึงข้อมูลสำรองเพื่อสร้างคีย์ส่วนตัว SSH (เฉพาะในกรณีที่คุณยังไม่มีคีย์ 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? เดิน [m] e [ผ่าน] ที่โปรด

ง่ายดี ด้วยการกำหนดค่าที่แนะนำrsyncuserตอนนี้อาจทำงานrsyncเป็นรูทโดยไม่ต้องถามรหัสผ่าน rsyncเป็นเครื่องมือที่มีประสิทธิภาพมากในการจัดการไฟล์ดังนั้นตอนนี้rsyncuserมีเครื่องมือที่มีประสิทธิภาพมากในการจัดการไฟล์ที่มีสิทธิ์รูท การหาวิธีที่จะใช้ประโยชน์จากสิ่งนี้ทำให้ฉันใช้เวลาเพียงไม่กี่นาที (ทดสอบบน Ubuntu 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ระบุบัญชีของฉันเป็น root ฉันสามารถสร้างไฟล์ใน/etcและฉันสามารถอ่าน/etc/shadowได้ การหาประโยชน์ของฉันคือการตั้งค่าsetuidบิตบนdashไบนารี มันทำให้ Linux รันไบนารีนั้นเสมอโดยได้รับอนุญาตจากเจ้าของในกรณีนี้รูท

การมีรูทจริงนั้นไม่แนะนำให้ทำด้วยเหตุผลที่ดี - redanimalwar 15 ชั่วโมงที่ผ่านมา

ไม่การทำงานกับบัญชีรูทในสถานการณ์ที่เหมาะสมอย่างยิ่งที่จะใช้งานนั้นไม่ใช่เหตุผลที่ดี นี่เป็นอีกรูปแบบหนึ่งของการเขียนโปรแกรมลัทธิคาร์โก้ - คุณไม่เข้าใจแนวคิดที่อยู่เบื้องหลัง sudo vs root คุณเพียงแค่ใช้ความเชื่อ "root is bad, sudo is good" เพราะคุณอ่านสิ่งนั้น

ในอีกด้านหนึ่งมีสถานการณ์ที่sudoเป็นเครื่องมือที่เหมาะสมสำหรับงาน ตัวอย่างเช่นเมื่อคุณทำงานแบบโต้ตอบบนเดสก์ท็อป Linux แบบกราฟิกสมมติว่า Ubuntu แล้วการใช้งานsudoจะทำได้ดีในบางกรณีที่คุณจำเป็นต้องเข้าถึงรูท อูบันตูตั้งใจใช้บัญชีรูทที่ปิดการใช้งานและบังคับให้คุณใช้เป็นsudoค่าเริ่มต้นเพื่อป้องกันผู้ใช้จากการใช้บัญชีรูทเพื่อเข้าสู่ระบบเสมอเมื่อผู้ใช้เพียงต้องการใช้งานเช่นเว็บเบราว์เซอร์จากนั้นเข้าสู่ระบบ ดังนั้นจึงไม่มีบัญชีผู้ใช้รูทโดยค่าเริ่มต้นป้องกันไม่ให้คนโง่ทำเช่นนี้

ในทางกลับกันมีบางสถานการณ์ที่เป็นของคุณเช่นที่สคริปต์อัตโนมัติต้องการการอนุญาตรูทกับบางอย่างเช่นทำการสำรองข้อมูล ตอนนี้การใช้sudoเพื่อหลีกเลี่ยงบัญชีรูทไม่เพียง แต่ไร้ประโยชน์เท่านั้น แต่ยังเป็นอันตรายด้วย: เมื่อมองอย่างรวดเร็วครั้งแรกrsyncuserดูเหมือนว่าบัญชีธรรมดาที่ไม่มีสิทธิพิเศษ แต่อย่างที่ฉันได้อธิบายไปแล้วมันจะง่ายมากสำหรับผู้โจมตีที่จะเข้าถึงรูทแบบเต็มถ้าเขาได้รับrsyncuserการเข้าถึงแล้ว ตอนนี้คุณมีบัญชีรูทเพิ่มเติมที่ไม่เหมือนกับบัญชีรูทเลยซึ่งไม่ใช่สิ่งที่ดี


2
คำอธิบายที่ดี อีกเหตุผลหนึ่งที่ใช้ sudo บนรูทจะอยู่ในสถานการณ์ที่หลาย ๆ คนมีบทบาทดูแลระบบบนเซิร์ฟเวอร์หรือไม่? วิธีนี้แต่ละคนสามารถใช้คีย์ SSH ของตัวเองแทนที่จะแบ่งปันคีย์ SSH ของรูทได้หรือไม่
Nathan S. Watson-Haigh

2
@ NathanS.Watson-Haigh คุณสามารถใส่กุญแจ SSH ทั้งหมดได้อย่างง่ายดาย/root/.ssh/authorized_keysหรือสร้างบัญชีผู้ใช้หลายคนที่มีที่อยู่อาศัยที่แตกต่างกันเพื่อให้ผู้ใช้แต่ละคนสามารถมีเชลล์ที่บ้านและ.ssh/authorized_keys:)
Martin von Wittich

2
คุณสามารถ จำกัด ปุ่ม ssh ให้อนุญาตคำสั่งบางอย่างเท่านั้น เป็นความคิดที่ดีอย่างแน่นอนเนื่องจากถ้าคุณกำลังทำสิ่งอัตโนมัติคุณอาจจะสร้างคีย์ ssh เหล่านี้โดยไม่มีข้อความรหัสผ่านหรืออย่างน้อยก็เพื่อให้พวกเขาสามารถเข้าถึงได้ตลอดเวลาที่เครื่องกำลังทำงานอยู่ (หมายถึงรากที่บนว่าการเข้าถึงเครื่องทุนให้รากบนเครื่องอื่น ๆ .)
ปีเตอร์ Cordes

2
ข้อกังวลของมาร์ตินเกี่ยวกับการใช้รูท sudo นั้นถูกต้อง แต่ดูเหมือนว่าพวกมันสามารถบรรเทาได้ด้วยการระบุพารามิเตอร์ rsync ที่แน่นอนในไฟล์ sudoers ตามหน้า man sudoers (5) บน Ubuntu: "ถ้า Cmnd มีอาร์กิวเมนต์บรรทัดคำสั่งที่เกี่ยวข้องแล้วอาร์กิวเมนต์ใน Cmnd จะต้องตรงกับที่ได้รับจากผู้ใช้ในบรรทัดคำสั่ง (หรือตรงกับ wildcard หากมี) ." หากไฟล์ sudoers ระบุคำสั่ง rsync ที่แน่นอนด้วยตัวเลือกที่แน่นอน (รวมถึงแหล่งที่มาและปลายทาง) ดูเหมือนว่ามันจะปลอดภัย

4
ข้อควรพิจารณาประการหนึ่งที่ไม่ได้นำมาก่อนหน้านี้: sshdโดยทั่วไปจะไม่บันทึกรหัสการอนุญาตที่ใช้ในการเชื่อมต่อกับบัญชีดังนั้นหากคุณเชื่อมต่อในbobตอนนั้นsudoคุณจะได้รับหลักฐานการตรวจสอบที่ดีกว่าการเชื่อมต่อrootโดยตรงด้วยbobรหัสของกุญแจ
Coderer

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โดยหลักแล้วจะมีการอนุญาตรูทเสมอ อาจเป็นเรื่องง่ายมากที่จะได้รูทเชลล์แบบเต็มในบัญชีนั้น ฉันคิดว่ามันจะดีกว่าถ้าใช้บัญชีรูทจริงในตอนแรก
Martin von Wittich

1
คำตอบที่ไม่เคยพูดถึงecho "password" | somethingฉันไม่เคยใช้สิ่งนี้และเห็นด้วยกับปัญหาด้านความปลอดภัยที่เกิดขึ้นจากการปล่อยให้ rsync ทำงานอย่างไร้ความปราณี (ไม่แนะนำที่นี่) สิ่งที่tty_ticketsฉันไม่รู้จริง ๆ แล้วดูเหมือนว่าจำเป็นและปัญหาด้านความปลอดภัย นี้จะทำงานอย่างปลอดภัยโดยไม่ต้องปรับแต่งอะไรเพียงแค่เรียกใช้ sodo บน ssh แล้วดำเนินการคำสั่งใช่ไหม? แต่เนื่องจากฉันถามคำถามเพื่อวัตถุประสงค์ในการคัดลอกฉันเห็นด้วยอย่างยิ่งว่าคีย์ที่ใช้ ssh ที่ไม่มี pw นั้นปลอดภัยและถูกต้อง ฉันยอมรับคำตอบของมาร์ตินแทน
redanimalwar

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โปรแกรมจะต้องติดตั้งในตำแหน่งที่กำหนดและคุณต้องใช้งานเซสชัน X บนเครื่องที่คุณกำลังทำงานอยู่ มีหลายรูปแบบในssh-askpassโปรแกรมที่ควรใช้งานได้ (รุ่น Gnome / KDE) นอกจากนี้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]. โอ้อูบุนตูไม่เรือ gnome-SSH-askpass แต่มันแทน/usr/bin/ssh-askpass /usr/lib/ssh/x11...ดังนั้นมันจึงใช้ได้ :)
Peter Cordes

1
นี่เป็นหนึ่งในโซลูชันที่ดีกว่าเนื่องจากไม่ต้องการการตั้งค่าใหม่ที่ปลายด้านอื่น ๆ เพียงแค่ต้องติดตั้ง askpass และเปิดใช้งานการส่งต่อ X ซึ่งทั้งสองอย่างนี้ควรเป็นเรื่องธรรมดา
David Gardner

1
ssh-askpassทำงานเหมือนจับใจหลังจากติดตั้ง ฉันแค่ต้องค้นหาความหมายของ-chavzPeมันจะเป็นการดีที่จะสะกดตัวเลือกเหล่านี้ออกมาเป็นเวลานาน
krlmlr

ฉันลองทำสิ่งนี้ แต่พรอมต์กำลังเปิดขึ้นบนเครื่องระยะไกลและไม่ได้ถูกส่งต่อไปยังเครื่องท้องถิ่น X11Forwarding ทำงานได้ตามที่คาดไว้ซึ่งฉันยืนยันโดยxeyesใช้ SSH
จอยซ์บาบู

7

หากผู้ใช้ของคุณมีสิทธิ์ sudo ซึ่งได้รับการป้องกันด้วยรหัสผ่านฉันจะเก็บไว้ตามเดิมและเพิ่ม stanza เพื่อใช้ 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

สิ่งนี้รัน rsync เป็น sudo เพื่อให้ไดเรกทอรีผู้ใช้ทั้งหมดfooสามารถเข้าถึงได้ แต่มันบอก rsync ให้ใช้ ssh เพื่อเข้าถึงเครื่องbarโดยใช้Aข้อมูลประจำตัวของผู้ใช้ ความต้องการของฉันแตกต่างจากคำถามข้างต้นเล็กน้อย แต่สิ่งนี้ทำให้ฉันได้รับการสำรองข้อมูลของไดเรกทอรีผู้ใช้ทั้งหมดบนเครื่องเฉพาะที่ฉันจัดการได้อย่างรวดเร็วโดยไม่รบกวนกับการกำหนดค่าของระบบ


2
อันนี้ยอดเยี่ยม ฉันลืมเกี่ยวกับตัวเลือกในการ-i sshคุณสามารถใช้--rsync-path="sudo /usr/bin/rsync" ถ้าคุณมี sudo barบนเครื่อง นี้ก็ไม่เป็นอ่านroot@fooและการเขียนเป็นroot@barแต่การถ่ายโอนผ่านทาง->A@foo B@barขอบคุณ!
ctbrown

มันจะไม่รักษาเจ้าของ (เช่นราก) ใช่ไหม?
Andris

3

การเรียกใช้ rsync as daemon บนเครื่องเป้าหมายช่วยให้คุณทำสิ่งที่คุณต้องการ


1
ฉัน upvoted คำตอบนี้ แต่มันจะดีกว่าด้วยคำอธิบายบางอย่างของวิธีการ rsynch daemon ทำงานและวิธีที่คุณใช้มันด้วยการเข้าถึง w / root
Mike Lippert

rsync as daemon จะไม่ตรงกับกรณีนี้เนื่องจาก rsync จะปล่อยสิทธิ์การใช้งานรูทแม้เมื่อเริ่มเป็น root แล้วไฟล์ทั้งหมดอาจไม่สามารถถ่ายโอนได้
teissler

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 )ซึ่งดีกว่าเล็กน้อย แต่มักจะต้องการกำหนดค่าสิทธิ์ที่ปลายทั้งสองและ / หรือใช้คีย์ SSH ในลักษณะที่ไม่จำเป็นต้องใช้รหัสผ่านใน CLI
JDS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.