เหตุใด rsync + ssh cron job ให้ข้อผิดพลาด 'การอนุญาตที่ถูกปฏิเสธ (publickey)'


20

ฉันทำการสำรองข้อมูลบ่อยครั้งไปยังไดรฟ์ในระบบซึ่งฉันต้องการซิงค์รายวันกับเซิร์ฟเวอร์ระยะไกล

เซิร์ฟเวอร์เป้าหมายถูกกำหนดค่าสำหรับการเข้าถึงคีย์ SSH (ไม่มีรหัสผ่าน) เท่านั้น เนื่องจากคีย์ SSH หลักของฉันสำหรับเซิร์ฟเวอร์นั้นได้รับการป้องกันข้อความรหัสผ่านฉันได้สร้างคีย์ SSH ตัวที่สอง (ไม่ได้รับการป้องกันข้อความรหัสผ่าน) + ผู้ใช้เพื่อใช้สำหรับการสำรองข้อมูลแบบไม่ต้องใส่ข้อมูล - วิธีนี้ฉันไม่ต้องแสดงตน .

ฉันใช้ cron และ rsync และคำสั่งทั้งหมดทำงานแยกกัน แต่ล้มเหลวเมื่อรวมกัน

ที่ไกลที่สุดที่ฉันเคยได้รับขณะแก้ไขปัญหากำลังทำงานอยู่

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"

ซึ่งส่งกลับข้อผิดพลาด

Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]

มีคำแนะนำเกี่ยวกับวิธีแก้ไขปัญหานี้เพิ่มเติมอีกหรือไม่


นี่คือสิ่งที่ฉันได้ลองมาแล้วและฉันก็ไม่ได้คิด:

  1. Cron กำลังทำงานอย่างแน่นอน ps aux | grep cron
  2. ไม่มีอะไรผิดปกติใน / var / log / syslog Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)

  3. SSH ใน Terminal ไปยังเซิร์ฟเวอร์ระยะไกลในขณะที่ผู้ใช้สำรองทำงาน ssh backups-user@XX.XX.XX.XX

  4. การรันคำสั่งในเทอร์มินัลทำงานได้อย่างสมบูรณ์ rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/
  5. การระบุพา ธ ไปยังคีย์การสำรองข้อมูลผู้ใช้ด้วยตนเองจะไม่มีผลใด ๆ rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/

  6. การแทนที่คำสั่งที่ไม่สามารถใช้งานได้ด้วยคำสั่งทดสอบอย่างง่าย ๆ ทำงานได้ echo "Hello world" > ~/Desktop/test.txt

  7. การตะโกน / สบถที่คอมพิวเตอร์ไม่มีผลกระทบ (แต่ทำให้ฉันรู้สึกดีขึ้นชั่วคราว)


แก้ไข 1:

นี่คือไฟล์ crontab ของฉันและสคริปต์ที่เรียกใช้

...
# m h  dom mon dow   command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup

และ

#!/bin/bash

rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/

แก้ไข 2:

เพียงชี้แจงให้ชัดเจน/var/log/auth.logบนเซิร์ฟเวอร์เป้าหมายมีบรรทัดSep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user rootนี่เป็นความสับสนเพราะฉันไม่ได้ทำงาน cron ทุกนาทีในพื้นที่ แต่รายการใหม่ยังคงปรากฏทุกนาทีในบันทึกของเซิร์ฟเวอร์ ไฟล์ Crontab สำหรับผู้ใช้ทั้งหมด (รวมถึงรูท) บนเซิร์ฟเวอร์ว่างเปล่า & ไม่ทำอะไรเลย

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

ไฟล์ crontab ที่โพสต์ข้างต้นนั้นสำหรับฉันผู้ใช้ 'ทอม' บนเครื่องเดสก์ท็อปของฉัน ฉันตั้งใจจะให้มันเรียกสคริปต์ซึ่งควรเข้าสู่เซิร์ฟเวอร์ในฐานะผู้ใช้ 'สำรองข้อมูลเท่านั้น' ฉันพยายามเรียกใช้สคริปต์สำรอง (แทนที่จะสั่งภายใน) และเชื่อมต่อและใช้งานได้สำเร็จ ฉันวิ่งบนเดสก์ท็อปของฉันในฐานะผู้ใช้ 'ทอม' ผู้ใช้รายเดียวกันที่สร้างงาน cron ที่ไม่ทำงาน นี่คือผลลัพธ์จากบันทึกเซิร์ฟเวอร์ที่สอดคล้องกับการเข้าสู่ระบบที่ประสบความสำเร็จ

Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only

ถ้า 3. ทำงานโดยใช้ keyfile และ 6. ทำงานได้เช่นกันแล้ว ... เอ่อ ... sshd logfile บนปลายทางที่ได้รับพูดว่าอะไร?
Jan

@ Jan ฉันได้รับSep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Tom Brossman

นั่นเป็นสายบันทึกที่ไม่ถูกต้องหรือผู้ใช้ที่พยายามเชื่อมต่อผ่าน ssh คือรูท ... หรือว่าจากเครื่องที่เริ่มทำการสำรองข้อมูล
ม.ค.

1
ทอม 2 คำถามเพียงเพื่อให้แน่ใจในความคิดเห็นครั้งแรกของคุณ logline ได้ CRON [ ... ] Sep 7 16:06:02 <hostname> sshd[6747]...แต่ก็ควรมีลักษณะดังนี้ คุณมั่นใจ 100% ว่า logline นี้มาจากเซิร์ฟเวอร์และเป็นบรรทัดที่ถูกต้องหรือไม่ crontab ที่คุณโพสต์นั้นเป็น crontab ของการสำรองข้อมูลเท่านั้น ? นอกจากนี้ให้ลองเพิ่มไฟล์ข้อมูลประจำตัวด้วยตนเอง:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
มกราคม

1
นอกจากนี้บรรทัดนั้นที่auth.logคุณโพสต์ภายใต้แก้ไข 2 มีไว้สำหรับ cron ที่ทำงานบนเซิร์ฟเวอร์และไม่ควรเกี่ยวข้องกับความพยายามในการเข้าสู่ระบบของคุณ คุณสามารถลองtail -f /var/log/auth.logบนเซิร์ฟเวอร์ในขณะที่คุณพยายามเรียกใช้สคริปต์ผ่าน cron ได้หรือไม่ นอกจากนี้ฉันไม่แน่ใจว่าจะใช้งานได้หรือไม่ แต่คุณสามารถลองใช้envคำสั่งแรกของคุณด้วยrsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...เพื่อดูว่าข้อผิดพลาดเพิ่มเติมหรือไม่
Alaa Ali

คำตอบ:


15

เนื่องจากทุกอย่างทำงานได้ดีจากบรรทัดคำสั่งข้อผิดพลาดPermission denied (publickey)หมายความว่าส่วนของ SSH rsyncกำลังใช้ไฟล์ข้อมูลเฉพาะตัวที่แตกต่างจากชื่อผู้ใช้ที่ระบุ

จากความคิดเห็นของแจนกับคำถามเดิมเราสามารถระบุตัวตนของไฟล์ในคำสั่งใช้rsync-e 'ssh -i /path/to/identity.file' ...

ใช้คำสั่งด้านล่างเพื่อเริ่มต้นด้วยสภาพแวดล้อมที่สดใน cron และระบุเส้นทางที่สมบูรณ์ไปยังไฟล์ที่เห็นได้ชัดแก้ปัญหา:

env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"

ฉันยังคงสนใจในการค้นพบนี้ มันอาจจะเกี่ยวข้องกับ cron ความจริงที่ว่ามันเริ่มต้นด้วยตัวแปรสภาพแวดล้อมที่น้อยที่สุดและ ssh-agent ฉันจะตั้งค่าสถานการณ์เดียวกันภายในสองสามวันเพื่อทดสอบและรายงานกลับ


1
คุณหมายถึงคุณวิ่งหรือenv -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups/./ backups-only@XX.XX.XX.XX:/backups/desktop/"
เปล่า

@Problemania whops แก้ไขแล้ว
Alaa Ali

ฉันเห็นว่าคุณมีคำตอบ แต่ฉันอยากรู้ว่าคุณใช้ 'sudo crontab -e' นั่นคือราก cron หรือไม่ จะเกิดอะไรขึ้นถ้าคุณ 'crontab -e' ในขณะที่เข้าสู่ระบบในฐานะผู้ใช้ "สำรอง"
wlraider70

ฉันคิดว่าคุณหมายถึงสิ่งนี้สำหรับคนที่ถามคำถาม แต่เขาใช้ crontab ของชื่อผู้ใช้ไม่ใช่รูทและฉันคิดว่าเขาไม่ต้องการใช้ crontab ของผู้ใช้สำรอง
Alaa Ali

เมื่อฉันเรียกใช้สคริปต์ที่คล้ายกันกับผู้ใช้ของฉันมันใช้คีย์ ssh ผ่าน X11 ดังนั้นฉันต้องการสำเนาโลคัลหากคีย์และตรวจสอบให้แน่ใจว่าไฟล์นี้มีเจ้าของและสิทธิ์ที่ถูกต้องรวมกับข้างต้นทำงานได้ดีสำหรับฉัน
Sverre

1

ฉันเพิ่งแก้ไขปัญหานี้ที่ทำให้ฉันยุ่งอยู่ ..

ไม่สามารถเชื่อมต่อใน RSYNC ผ่าน SSH แม้จะมีการระบุตัวตนสำหรับ SSH ... ไม่มีอะไรทำ ... Rsync พูดว่า "สิทธิ์ถูกปฏิเสธ" และ ssh บอกฉันว่า "read_passphrase: ไม่สามารถเปิด / dev / tty: ไม่มีอุปกรณ์หรือที่อยู่ของ ประเภทนี้"

แต่ฉันอ่านโพสต์ที่อธิบายว่า crontab มีสภาพแวดล้อมของตัวเองที่ไม่เหมือนกับรูท ฉันรู้แล้ว แต่ไม่เข้าใจถึงผลกระทบที่อาจเกิดขึ้นกับ SSH เมื่อใช้ SSH-AGENT

แต่การแลกเปลี่ยนคีย์ SSH ของฉันทำได้ด้วย PassPhrase ... ดังนั้นหากสภาพแวดล้อมแตกต่างกันและ RSYNC ของฉันเหนือ SSH คาดว่าข้อความรหัสผ่านที่ไม่สามารถป้อนได้ => ข้อมูลการดีบัก SSH ยังบ่งบอกถึงข้อผิดพลาด:

"debug1: read_passphrase: ไม่สามารถเปิด / dev / tty: ไม่มีอุปกรณ์หรือที่อยู่" => ใช่แล้วไม่มี TTY = ไม่มีวลีรหัสผ่าน = ไม่อนุญาต

ในเครื่องของฉันฉันใช้ "Keychain" เพื่อเปิดใช้งานตัวแทน SSH ดังนั้นฉันไม่ต้องป้อนข้อความรหัสผ่านใหม่ทุกครั้งที่ฉันลองเชื่อมต่อระยะไกล Keychain สร้างไฟล์ที่มีข้อมูลต่อไปนี้

SSH_AUTH_SOCK = /tmp/ssh-PWg3yHAARGmP/agent.18891; ส่งออก SSH_AUTH_SOCK; SSH_AGENT_PID = 18893; ส่งออก SSH_AGENT_PID;

==> คำสั่ง SSH-AGENT ส่งคืนข้อมูลเดียวกัน

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

==> การแก้ปัญหาคือมี ...มันเพียงพอในสคริปต์ที่เปิดตัวโดย crontab และ "แหล่งที่มา" ไฟล์ที่มีข้อมูลนี้หรือจะทำในบรรทัดคำสั่ง ds crontab ...

ตัวอย่าง: 14 09 * * * /home/foo/.keychain/foo.serveur.org-sh && scp -vvv -P 22 /tmp/mon_fic/toto.sh foo@my-server.fr: >> / var / log / check_connexion.log 2> & 1 หรือใช้คำสั่ง "source /home/foo/keychain/foo.server.org-sh" ในสคริปต์ที่เริ่มการเชื่อมต่อโดยใช้ SSH

=> ด้วยการจัดหานี้ไม่ต้องกังวลอีกต่อไป ข้อมูลของ SSH_AUTH_SOCK และ SSH_AGENT_PID ถูกโหลดในสภาพแวดล้อมของ Crontab และเป็นที่รู้จักกันดีว่า RSYNC บน SSH ทำงานได้โดยไม่มีปัญหาใด ๆ

มันทำให้ฉันยุ่ง แต่ตอนนี้มันใช้งานได้ :)


1

คำเตือนสำหรับผู้ที่ใช้การส่งต่อตัวแทน SSH:

หากคุณเห็นพฤติกรรมนี้เมื่อทำการดีบั๊กสคริปต์บนโฮสต์ระยะไกลนั่นเป็นเพราะถึงแม้จะมีการ-e "ssh -i /path/to/key"ตั้งค่าสถานะ ssh จะใช้รหัสท้องถิ่น (ส่งต่อ) ของคุณแทนที่จะเป็นหนึ่งในเซิร์ฟเวอร์

ตัวอย่างที่เป็นรูปธรรม: ฉันมีสคริปต์บนเซิร์ฟเวอร์ dev ที่ดึงข้อมูลจาก "เซิร์ฟเวอร์ข้อมูล" โดยใช้ rsync บน ssh เมื่อฉันเข้าสู่เซิร์ฟเวอร์ dev และเรียกใช้ทั้งหมดเป็นสิ่งที่ดี แต่เมื่อทำงานจาก cron ฉันได้รับอนุญาตปฏิเสธ การเพิ่มคำฟุ่มเฟื่อยบางส่วนให้กระบวนการ SSH (ธง-vv) ฉันสังเกตเห็นดังต่อไปนี้:

debug2: key: /home/nighty/.ssh/id_rsa (0x562d8b974820),
debug2: key: /home/juanr/.ssh/id_rsa (0x562d8b962930), explicit
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/nighty/.ssh/id_rsa
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug2: input_userauth_pk_ok: fp 1a:19:08:9f:80:16:b1:db:55:42:9a:52:b2:49:9b:0a
debug1: Authentication succeeded (publickey).

สิ่งที่ฉันปิดบังที่นี่คือโดยบังเอิญฉันมีชื่อผู้ใช้ที่แตกต่างกันในโฮสต์ท้องถิ่น ("nighty") มากกว่าบนเซิร์ฟเวอร์ dev ("juanr")

สังเกตว่ามันทำเครื่องหมายคีย์บนเซิร์ฟเวอร์ dev เป็น "ชัดเจน" แต่ยังคงใช้คีย์ส่งต่อจากแล็ปท็อปของฉันเพื่อเข้าสู่ระบบการทำssh-copy-idณ จุดนี้แก้ไขอะไรเพราะมันเพียงแค่ติดตั้งคีย์ส่งต่อมากกว่าหนึ่งจาก dev เซิร์ฟเวอร์ ถ้าคุณใช้ SSH สำเนา-ID ที่มีการส่งต่อตัวแทนคุณจะต้องระบุว่ากุญแจสำคัญในการติดตั้งกับ -i ssh-copy-id -i ~/.ssh/id_rsa.pub user@hostธง:


0

คุณได้ลองใช้เคล็ดลับเก่าของการล้างไฟล์โฮสต์แล้วหรือยัง? ฉันหมายถึง:

rm ~/.ssh/known_hosts

มันคุ้มค่าที่จะลองเพราะ ssh จะสร้างใหม่และคุณจะกำจัดสิ่งเก่า ๆ แน่นอนคุณสามารถลบส่วนที่เป็นของ IP / โฮสต์ที่กำหนด

คำถามเพิ่มเติม: งาน cron ของคุณทำงานภายใต้ UID ของคุณหรือมันทำงานในฐานะผู้ใช้ cron หรือรูท?


1
คำสั่งแต่ละรายการทำงานแยกกันดังนั้นฉันไม่เห็นว่าการลบ~/.ssh/known_hostsจะเปลี่ยนแปลงอะไรได้อย่างไร และ cron วิ่งเป็นผู้ใช้ของฉัน 'ทอม' บนเดสก์ทอปด้วยความตั้งใจในการเข้าสู่เซิร์ฟเวอร์เป็นผู้ใช้สำรองข้อมูลเท่านั้น 'ด้วยที่สอดคล้องกัน (passwordless) คีย์ SSH ~/.sshซึ่งอยู่ในของผู้ใช้ทอม
Tom Brossman

3
@ runlevel0 ทั้ง-rหรือ-fธงที่จำเป็นในการลบknown_hosts--it เป็นแฟ้มปกติ (ไม่ได้เป็นไดเรกทอรี) และมันไม่ได้อ่านได้อย่างเดียว rm .ssh/known-hostsจะปลอดภัยกว่ามากหากพิจารณาว่าพิมพ์ตัวอักษรตัวเดียว - โดยไม่ได้ตั้งใจเพิ่มช่องว่างระหว่าง.และssh/known_hostsหลังrm -rf(หรือrm -r) มักจะลบเนื้อหาทั้งหมดของโฟลเดอร์บ้านของผู้ใช้!
Eliah Kagan

สวัสดีเอลียาจุดยอดเยี่ยมแน่นอน !! ฉันใช้แฟล็ก -rf เป็นภาพสะท้อน แต่คุณพูดถูก ฉันไม่ดี
runlevel0

0

ใช้rrsyncสคริปต์พร้อมกับคีย์ ssh เฉพาะดังต่อไปนี้:

เซิร์ฟเวอร์ระยะไกล

mkdir ~/bin
gunzip /usr/share/doc/rsync/scripts/rrsync.gz -c > ~/bin/rrsync
chmod +x ~/bin/rrsync

คอมพิวเตอร์ในพื้นที่

ssh-keygen -f ~/.ssh/id_remote_backup -C "Automated remote backup"      #NO passphrase
scp ~/.ssh/id_remote_backup.pub devel@10.10.10.83:/home/devel/.ssh

คอมพิวเตอร์ระยะไกล

cat id_remote_backup.pub >> authorized_keys

ต่อท้ายบรรทัดที่เพิ่มใหม่ดังต่อไปนี้

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding

เพื่อให้ผลลัพธ์ดูเหมือน

command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding ssh-rsa AAA...vp Automated remote backup

ท้องถิ่น

ใส่ในcrontabสคริปต์ของคุณต่อไปนี้xได้รับอนุญาต:

#!/bin/sh
echo ""
echo ""
echo "CRON:" `date`
set -xv
rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -avzP devel@10.10.10.83:/ /home/user/servidor 

ที่มา: http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/


0

หากต้องการลองและแก้ไขข้อบกพร่องให้เพิ่มส่วน ssh "ssh -v" ด้วยวิธีนี้คุณจะได้รับโหมด verbose พร้อมข้อมูลที่เป็นประโยชน์

แก้ไข:จากหน้าคน:

-v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This is helpful in debugging connection,
             authentication, and configuration problems.  Multiple -v options increase the verbosity.  The maximum is 3.

-1

ฉันคิดว่าคุณไม่ได้กำหนดค่าไฟล์ sshd_config อย่างถูกต้อง ตรวจสอบว่าPermitRootLogin yesและPubkeyAuthentication yes สำหรับการบำรุงรักษาระยะไกล


1
เขาไม่ได้พยายามเข้าสู่ระบบในฐานะ root และเขาอาจมีการตั้งค่าการรับรองความถูกต้องของรหัสสาธารณะอย่างถูกต้องเพราะเขาสามารถ ssh และแม้แต่เรียกใช้คำสั่งสำรองจากเทอร์มินัลได้สำเร็จ
Alaa Ali

1
ขอบคุณสำหรับคำแนะนำ แต่ฉันไม่ได้PermitRootLoginเปิดใช้งานและไม่มีแผนที่จะเปลี่ยนสิ่งนั้น วิธีปฏิบัติที่ดีที่สุดคือปิดใช้งานและ ssh เป็นผู้ใช้ปกติเท่านั้น (เพิ่มไปยัง 'sudoers' ของคุณหากจำเป็น) และไม่เคยเป็นรูท
Tom Brossman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.