ssh ได้รับอนุญาตถูกปฏิเสธเฉพาะในงาน cron


13

มีปัญหาแปลก ๆ ฉันได้สร้างสคริปต์ทุบตีเล็ก ๆ ซึ่งเรียกใช้คำสั่งบนโฮสต์ระยะไกลผ่าน ssh (โดยใช้การตรวจสอบกุญแจสาธารณะ)

เมื่อฉันเรียกใช้สคริปต์นี้ด้วยตนเองจากบรรทัดคำสั่งมันทำงานได้ดี แต่เมื่ออยู่ใน /etc/cron.hourly มันล้มเหลวด้วยPermission denied, please try again.ข้อผิดพลาด

  • ฉันอย่างชัดเจนตั้งสำคัญในสคริปต์ที่ใช้ssh -i /root/.ssh/id_rsa user@remote "command";
  • สคริปต์กำลังทำงานในฐานะรูท (ฉันได้เพิ่มการecho `id` > /tmp/whoami.logตรวจสอบอีกครั้ง); และ
  • รหัส ssh ไม่ได้รับการป้องกันด้วยรหัสผ่าน ...

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

มีความคิดว่าทำไมสิ่งนี้ถึงเกิดขึ้นหรือจะแก้ไขได้อย่างไร?

ปรับปรุง

ปรากฎว่าฉันเข้าใจผิดและรหัส ssh ได้รับการป้องกันด้วยรหัสผ่าน (ด้วยการโหลดพวงกุญแจ ssh-agent) ดังนั้นทำไมมันล้มเหลวจากสคริปต์ แต่ไม่เมื่อทำงานจากเซสชันทุบตี การเพิ่ม. ~/.keychain/$HOSTNAME-shสคริปต์ของฉันแก้ไขปัญหาได้ (ด้วย @grawity ที่ชี้ให้ฉันไปในทิศทางที่ถูกต้องและให้คำตอบที่ครอบคลุม)


คุณแน่ใจหรือว่าเรียกใช้ด้วยตนเองโดยใช้คีย์นั้น ทดสอบอีกครั้งหลังจากไม่ได้ตั้งค่าSSH_AUTH_SOCKและKRB5CCNAMEตัวแปรสภาพแวดล้อม
user1686

ขอบคุณสำหรับคำแนะนำ ไม่แน่ใจว่าฉันเข้าใจคุณอย่างเต็มที่ ฉันค่อนข้างมั่นใจว่าใช้คีย์นั้นเพราะฉันสามารถเชื่อมต่อ / รันคำสั่งบนรีโมตโฮสต์เมื่อทำงานด้วยตนเอง ฉันควรทดสอบอะไรอีกครั้งหลังจากยกเลิกการตั้งค่าตัวแปรเหล่านั้น
Yoav Aner

นอกจากนี้ - ฉันไม่ได้ใช้ ssh-agent ดังนั้นไม่แน่ใจว่าSSH_AUTH_SOCKเกี่ยวข้องอย่างไร (แม้ว่าฉันยินดีที่จะลองทำอะไร) ฉันกำลังเข้าถึงไฟล์กุญแจโดยตรงและไฟล์คีย์ไม่ได้รับการป้องกันด้วยรหัสผ่าน สำหรับKRB5CCNAMEการค้นหาอย่างรวดเร็วพบว่านี่เป็นสิ่งที่ต้องทำกับ Kerberos อีกครั้ง - ไม่เห็นการเชื่อมต่อกับปัญหานี้ แต่บางทีฉันอาจจะพลาดบางสิ่งบางอย่างที่นี่ ...
Yoav Aner

ทดสอบสคริปต์ของคุณแน่นอน คุณไม่สามารถ "ค่อนข้างแน่ใจว่าใช้คีย์นั้น" จนกว่าคุณจะทำเช่นนั้นเพราะงาน cron ทำงานในสภาพแวดล้อมที่แตกต่างจากคำสั่งแบบโต้ตอบ มันจะดียิ่งขึ้นถ้าคุณเพิ่ม-vตัวเลือกในsshคำสั่งนั้น...
user1686

แต่ฉันทำเช่นนั้น ฉันใช้คีย์โดยใช้ssh -iคำสั่งอย่างชัดเจนทั้งสองกรณี ... ฉันจะลองยกเลิกการตั้งค่าตัวแปรเหล่านั้นในสคริปต์และดู คำแนะนำที่ดีในการเพิ่ม-v- ฉันจะเพิ่มด้วย
Yoav Aner

คำตอบ:


11

คำสั่งแบบโต้ตอบและงาน cron รันในสภาพแวดล้อมที่แตกต่างกัน - โดยเฉพาะอย่างยิ่งเซสชันแบบโต้ตอบอาจมีเอเจนต์ SSH ทำงานอยู่หรือ Kerberos TGT จัดเก็บไว้ เนื่องจากวิธีการsshสั่งซื้อวิธีการรับรองความถูกต้องคุณไม่สามารถมั่นใจได้ว่าคีย์ของคุณถูกใช้เพียงเพราะคุณเพิ่ม-iตัวเลือก

  • หากเอเจนต์ SSH ทำงานอยู่sshลูกค้าจะลองใช้คีย์เอเจนต์เสมอก่อนใช้คีย์ที่ระบุอย่างชัดเจน

  • หากเครือข่ายใช้ Kerberos และ Kerberos TGT มีอยู่ OpenSSH จะใช้ก่อนที่จะลองใช้การพิสูจน์ตัวตนแบบพับลิกคีย์

ฉันไม่รู้อะไรเกี่ยวกับสภาพแวดล้อมของคุณ แต่ความเป็นไปได้ทั้งสองอย่างนี้ง่ายต่อการตรวจสอบ:

  1. เพิ่มunset SSH_AUTH_SOCKและunset KRB5CCNAMEก่อนsshคำสั่งจากนั้นเรียกใช้สคริปต์ที่ปรับเปลี่ยนด้วยตนเอง

    สิ่งนี้จะป้องกันไม่ให้สคริปต์เห็นตัวแทนหรือตั๋ว Kerberos และจะใช้คีย์ที่ระบุอย่างชัดเจนเท่านั้น

  2. เพิ่มตัวเลือกในการ-v sshสิ่งนี้จะแสดงรายละเอียดเพิ่มเติมเกี่ยวกับการรับรองความถูกต้องเกิดขึ้น

นอกจากนี้คุณยังสามารถเพิ่ม-oIdentitiesOnly=yesไปยังsshคำสั่ง; นี้จะบังคับให้ใช้คีย์ที่ระบุ


และถ้าคุณเพิ่มเคล็ดลับในการเข้าถึงตัวแทนจาก cron - ดียิ่งขึ้น

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

คุณพูดถึง "Keychain" - นี่เป็นโปรแกรม OS X หรือสคริปต์ Linux หรือไม่ (ผมไม่ทราบว่ามากเกี่ยวกับสถาปัตยกรรมของ Mac OS X แต่ AFAIK มันทำให้มากยากที่จะเข้าถึงตัวแทน ssh ของผู้ใช้จาก cronjob คุณ ... )


1
คุณสามารถใช้ ssh-cron เพื่อตั้งค่าการเชื่อมต่อ SSH ตามกำหนดเวลาเพื่อรักษาความปลอดภัยเซิร์ฟเวอร์โดยไม่ต้องเปิดเผยคีย์ SSH ของคุณ แต่ใช้ตัวแทน SSH superuser.com/questions/463540/…
Luchostein

5

วิธีแก้ปัญหาอื่นของปัญหานี้คือตั้ง cron เป็น ssh ไปที่กล่องภายในเพื่อเปิดใช้คำสั่ง ssh แทนการเรียกใช้ไฟล์หรือคำสั่งโดยเส้นทางท้องถิ่นและแน่นอนของมัน สิ่งนี้แคช KRB5CCNAME และทำงานโดยที่ / path / คำสั่งไม่ทำงาน

# Fails:
0 * * * * /home/user/sshscript.sh

# Works:
0 * * * * /usr/bin/ssh user@localhost /home/user/sshscript.sh

#!/bin/bash
# Works:
unset SSH_AUTH_SOCK
unset KRB5CCNAME
/usr/bin/ssh user@localhost /home/user/sshscript.sh

1

คุณสามารถใช้ssh-cronเพื่อตั้งค่าการเชื่อมต่อ SSH ตามกำหนดเวลาเพื่อรักษาความปลอดภัยเซิร์ฟเวอร์โดยไม่ต้องเปิดเผยคีย์ SSH ของคุณ แต่ใช้ตัวแทน SSH


การอ้างอิงไม่พร้อมใช้งานบน Homebrew ดังนั้นการติดตั้งดูเหมือนจะซับซ้อน รหัสผ่านไม่มีรหัสผ่านฉันเดาว่า…: - /
Charlie Gorichanaz

-1

คุณสามารถเรียกใช้สคริปต์หรือคำสั่งของคุณใน crontab เช่น:

0 * * * * bash -c -l "/home/user/sshscript.sh"

หรือ

0 * * * * bash -c -l "ssh root @ yourhost 'echo $ HOSTNAME'"


1
OP อยู่แล้วพยายามที่จะเรียกใช้สคริปต์ผ่านcron; ดังนั้นนี่ดูเหมือนจะไม่ได้ให้คำตอบจริงๆ
bertieb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.