Linux ssh: อนุญาตให้ใช้การพิสูจน์ตัวตนด้วยรหัสสาธารณะโดยไม่ให้สิทธิ์การอ่านแก่ผู้ใช้ในรหัสส่วนตัว


14

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

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

ฉันจะอนุญาตให้ผู้ใช้เปิดการเชื่อมต่อ ssh โดยไม่ให้สิทธิ์การเข้าถึงแบบอ่านแก่ไพรเวตคีย์ได้อย่างไร?

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

  • นี่เป็นวิธีที่ดีหรือไม่?
  • ฉันจะใช้การส่งต่อได้อย่างไร
  • ผู้ใช้จะเริ่มต้นการเชื่อมต่อได้อย่างไร (นั่นคือการดำเนินการของ ssh โดยผู้ใช้ที่มีสิทธิ์อ่านบนคีย์)
  • มีช่องโหว่ความปลอดภัยหรือไม่? - หากผู้ใช้สามารถรัน ssh ในฐานะผู้ใช้รายอื่นพวกเขาสามารถทำทุกสิ่งที่ผู้ใช้รายอื่นสามารถทำได้ (รวมถึงการอ่านคีย์ส่วนตัว) หรือไม่

ดูเหมือนว่าจะซ้ำซ้อนกับstackoverflow.com/questions/9286622/protecting-ssh-keys
wenzul

1
กำหนดค่ารีโมตเซิร์ฟเวอร์เพื่อยอมรับการเชื่อมต่อด้วยคีย์นั้นจาก IP ของเซิร์ฟเวอร์ของคุณหรือไม่ ด้วยวิธีนี้แม้ว่าพวกเขาจะขโมยกุญแจพวกเขาไม่สามารถทำอะไรได้

@ AndréDanielเป็นอย่างดีบางทีพวกเขาสามารถเข้าสู่ระบบคอมพิวเตอร์อื่นที่ไม่เกี่ยวข้องอย่างสมบูรณ์ซึ่งได้รับการกำหนดค่าให้ยอมรับการลงชื่อเข้าใช้แบบไม่ใช้รหัสผ่านจากเซิร์ฟเวอร์ นั่นเป็นเหตุผลเดียวที่ฉันคิดว่าจะมีการตั้งค่าเช่นนี้; ถ้าไม่ใช่อย่างนั้นฉันก็อยากรู้ว่ามันคืออะไร (ไม่ใช่ว่ามันสำคัญจริงๆ)
David Z

@DavidZ ฉันไม่เข้าใจจริง ๆ ... คีย์ไม่น่าเชื่อถือที่ใดก็ได้แต่บนเซิร์ฟเวอร์เป้าหมายโดยสมมติว่า IP ตรงกับเซิร์ฟเวอร์ตัวแรก (กับที่ที่ผู้ใช้เชื่อมต่อ)

2
หากคุณต้องการล็อคมันด้วยวิธีนี้ฉันคิดว่าคุณได้ใช้มาตรการเพื่อไม่อนุญาตให้ผู้ใช้เพิ่มกุญแจสาธารณะใหม่ให้กับ~/.ssh/authorized_keysไฟล์หรือไม่?
mpontillo

คำตอบ:


31

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

#/etc/sudoers
%users ALL = (some_uid) NOPASSWD: /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

ตั้งค่าsudoเพื่อให้สมาชิกทั้งหมดของกลุ่มusersสามารถเรียกใช้คำสั่ง ssh ในฐานะผู้ใช้ some_uid โดยไม่ต้องป้อนรหัสผ่านของตนเอง (หรือบัญชี some_uid ของบัญชี) เมื่อพวกเขาทำงาน:

sudo -u some_uid /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

ลบNOPASSWD:ตัวเลือกเพื่อบังคับให้ผู้ใช้ป้อนรหัสผ่านของตนเองก่อนเข้าสู่รีโมตโฮสต์
อาจตั้งค่าสคริปต์ alias หรือ wrapper เพื่อความสะดวกสำหรับผู้ใช้ของคุณเนื่องจากsudoค่อนข้างจะพิถีพิถันในการใช้อาร์กิวเมนต์ที่ถูกต้อง


ทำงานเหมือนจับใจ นี่ควรเป็นคำตอบที่แนะนำสำหรับสำเนาที่กล่าวถึงโดย wenzul
ฟิลิปป์

10

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

หากต้องการตั้งค่านี้คุณจะต้องสร้างไฟล์ที่ชื่อ.shostsบนเครื่องระยะไกลในไดเรกทอรีหลักของผู้ใช้ที่คุณต้องการให้ผู้ใช้ลงชื่อเข้าใช้ด้วย (ไม่ใช่ใน~/.ssh) ไฟล์ควรมีเนื้อหา

server-hostname +

ที่server-hostnameเป็นชื่อของเซิร์ฟเวอร์ของคุณและ+เป็นเครื่องหมายบวกแท้จริงที่ทำหน้าที่เป็นตัวแทนความหมายว่า "ผู้ใช้ใด ๆ "

คุณจะต้องตรวจสอบให้แน่ใจว่าเครื่องระยะไกลสามารถตรวจสอบรหัสโฮสต์ของเซิร์ฟเวอร์ได้ซึ่งหมายความว่าจะต้องระบุรหัสโฮสต์ของเซิร์ฟเวอร์ในเครื่องระยะไกล/etc/ssh/ssh_known_hostsหรือ~/.ssh/known_hostsบนเครื่องระยะไกล หากไม่ได้เป็นเช่นนั้นคุณสามารถตั้งค่าได้โดยลงชื่อเข้าใช้เครื่องระยะไกลและเรียกใช้

ssh-keyscan server-hostname >> /etc/ssh/ssh_known/hosts

เมื่อคุณตั้งค่าขั้นตอนเหล่านี้แล้วคุณสามารถลบคีย์ส่วนตัวบนเซิร์ฟเวอร์ทั้งหมดได้หากคุณไม่ต้องการสิ่งอื่นใด (และถ้าคุณทำคุณสามารถกำหนดให้เป็นแบบอ่านอย่างเดียวrootหรืออะไรก็ได้)

คุณสามารถทำสิ่งต่าง ๆ เช่นอนุญาตหรือปฏิเสธผู้ใช้บางคนที่เข้าถึงเครื่องระยะไกลได้อย่างง่ายดาย ดู man page ของsshและhosts.equivสำหรับรายละเอียด

ปัญหาหนึ่งของการตั้งค่านี้คือผู้ใช้ที่เข้าสู่ระบบเครื่องระยะไกลสามารถแก้ไข.shostsได้ ไม่มีสิ่งใดที่พวกเขาสามารถทำได้เพื่ออนุญาตให้พวกเขาเข้าสู่เครื่องระยะไกลในฐานะผู้ใช้คนอื่น แต่พวกเขาสามารถตัดการเข้าถึงเครื่องระยะไกลของตนเองหรือของผู้อื่น หากนี่เป็นข้อกังวลคุณอาจสามารถ.shostsเขียนได้โดยrootหรือบางสิ่งบางอย่าง - ฉันไม่แน่ใจว่าใช้งานได้หรือไม่ แต่คุณสามารถลองดูได้ (วิธีการอื่น ๆ เช่นที่sudoมีความเสี่ยงต่อความเสี่ยงเดียวกันเนื่องจากผู้ใช้สามารถลบได้เสมอ~/.ssh/authorized_keys)


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