Linux: สร้างบัญชี SSH“ สาธารณะ” ที่ดำเนินการไบนารีที่เฉพาะเจาะจงแล้วปิด?


1

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

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

คำเตือนคือ:

  1. ฉันไม่ต้องการใช้เชลล์สคริปต์เช่น. bash_profile มีโอกาสมากเกินไปที่จะถูกแฮ็ก!
  2. ยิ่งฉันไม่ต้องการบัญชีผู้ใช้ที่จะได้รับ "เปลือก" ที่ถูกต้อง กล่าวอีกนัยหนึ่งฉันต้องการให้เชลล์ผู้ใช้เป็นแบบ / bin / false ดังนั้น FTP, SFTP และอื่น ๆ ที่เหลือจะไม่ได้รับอนุญาต สิ่งเดียวที่ฉันต้องการได้รับอนุญาตจากบัญชีคือการเข้าถึงแอปพลิเคชันคอนโซลนี้โดยเฉพาะซึ่งทำงานในโหมดที่ไม่มีสิทธิ์ใช้งานในฐานะผู้ใช้รายนี้
  3. ฉันอาจต้องการเสนอแอปพลิเคชันมากกว่าหนึ่งรายการในชื่อผู้ใช้ที่แตกต่างกัน ตัวอย่างเช่น "ค้นหา" จะแสดงแอปคอนโซลหนึ่งแอปขณะที่ "เรียกดู" จะแสดงแอปอื่นขึ้นอยู่กับวิธีที่ผู้ใช้ลงชื่อเข้าใช้
  4. ไม่จำเป็นต้องใช้รหัสผ่านสำหรับเซสชัน SSH มันจะดีถ้ามันเพิกเฉยต่อการพิสูจน์ตัวตนทั้งหมด แต่ต้องให้รหัสผ่าน SSH แก่ผู้ใช้ปลายทางไม่ใช่ตัวจัดการดีล สิ่งเดียวที่แน่นอนคือการรักษาความปลอดภัย - ฉันไม่ต้องการให้บัญชีได้รับอนุญาตให้ทำสิ่งอื่น
  5. ผู้ใช้ไม่ควรทำอะไรเป็นพิเศษในตอนท้าย พวกเขาควรจะสามารถแค่ "ssh search@ip.of.host" และรับบริการ
  6. โปรแกรมที่ดำเนินการอาจจำเป็นต้องมีอาร์กิวเมนต์บรรทัดคำสั่ง ฉันสบายดีกับการเขียนเสื้อคลุมเพื่อทำสิ่งนี้ แต่นั่นสร้างความไม่มั่นคงหรือไม่? เช่น. หากคำสั่งคือ "/ usr / local / bin / myapp --mode = search" และฉันเขียนสคริปต์เช่น:

    ! / bin / ทุบตี

    / usr / local / bin / myapp --mode = search

... สิ่งนี้สร้างสถานการณ์ที่ไม่ปลอดภัยหรือไม่ สมมติว่าสิทธิ์ไฟล์ทั้งหมดได้รับการตั้งค่าอย่างเหมาะสมผู้ใช้ไม่สามารถแก้ไขไฟล์ได้

เป็นไปได้ที่จะทำ? ถ้าเป็นเช่นนั้นจะทำอย่างไรและที่สำคัญจะทำอย่างไรให้ปลอดภัย?

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

ขอบคุณ!

F


หากคุณตั้งค่าเชลล์ของผู้ใช้เป็นโปรแกรม Linux จะดำเนินการไบนารีนั้นเป็น 'เชลล์' ซึ่งอาจเป็นของคุณ search โครงการ คุณเคยลองไหม
Lawrence

คำตอบ:


0

มีสามตัวเลือก:

  1. ตั้งค่าแอปพลิเคชัน (หรือ wrapper ที่เหมาะสมสำหรับมัน) เป็นเชลล์สำหรับบัญชี

    วิธีนี้บัญชีไม่มีเชลล์ เมื่อผู้ใช้ผ่านคำสั่งมันจะถูกส่งเป็นอาร์กิวเมนต์บรรทัดคำสั่งไปที่ "เปลือก" นำหน้าด้วย -c ธง. ทำทุกสิ่งที่คุณต้องการด้วย

  2. ใช้การรับรองความถูกต้องของกุญแจสาธารณะและกำหนดสิ่งที่ผู้ใช้แต่ละคนสามารถเรียกใช้โดยใช้ command ตัวเลือกใน .ssh/authorized_keys.

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

    คำสั่งรับคำสั่งที่ส่งผ่านไปที่บรรทัดคำสั่ง ssh SSH_ORIGINAL_COMMAND ตัวแปรสภาพแวดล้อมดังนั้นคุณสามารถใช้งานได้หากคุณต้องการ

    ในกรณีนี้บัญชีต้องการเชลล์ที่ถูกต้องเพราะ ssh ใช้เพื่อรันคำสั่งที่ตั้งค่าไว้

  3. มันต้องเป็น ssh จริงๆเหรอ? คุณพูดถึงมันไม่จำเป็นต้องมีการรับรองความถูกต้องซึ่งในกรณีนี้อาจเริ่มต้นโดยตรง inetd ทำได้ หรือ telnet หากคุณต้องการเทอร์มินัลมากกว่าแค่ stdin / stdout โปรดทราบว่าตัวเลือก 1 จะทำงานกับ telnet ด้วย

สคริปต์ตัวตัดคำมีความปลอดภัยหากคุณใช้ความระมัดระวัง หากไม่ยอมรับอินพุตใด ๆ ก็ควรจะตกลง หากคุณต้องการใช้อินพุต (อาร์กิวเมนต์บรรทัดคำสั่งใน 1, SSH_ORIGINAL_COMMAND envvar ใน 2. ) คุณจะต้องทำการฆ่าเชื้ออย่างระมัดระวังและพูดให้ถูกต้อง

แน่นอนขึ้นอยู่กับว่าคุณเชื่อถือแอปพลิเคชันมากแค่ไหนคุณยังอาจต้องการใส่ไว้ใน chroot หรือ namespace ที่แยกต่างหาก


นี่เป็นการเริ่มต้นที่ดี ฉันได้พิจารณาตั้งค่าเชลล์แล้วและดูเหมือนว่าอาจเป็นวิธีที่เร็วที่สุดในการทำให้เชลล์ทำงานได้อย่างถูกต้อง ตราบใดที่สิ่งนี้ปิดใช้งานการใช้ SFTP และบริการอื่น ๆ ก็ควรมีความปลอดภัย นอกจากนี้ SSH ยังดีที่สุดเพราะในที่สุดฉันวางแผนที่จะขยายสิ่งนี้ไปยังระบบที่ผู้ใช้สามารถลงชื่อเข้าใช้บริการผ่าน SSH ได้ แต่บัญชีผู้ใช้จะถูกเก็บไว้ในฐานข้อมูล - ตัวอย่างที่ดีของการทำเช่นนี้คือ MUD คุณต้องการความปลอดภัยที่พร้อมใช้งานเพื่อให้ผู้คนไม่ต้องส่งรหัสผ่านในที่ชัดเจน (แอพพลิเคชั่นไม่ใช่ลีนุกซ์จะพิสูจน์ตัวตน)
fdmillion

ฉันควรมีความชัดเจนมากขึ้น - คู่คีย์สาธารณะ / ส่วนตัวจะไม่เหมาะสมเพราะในทางทฤษฎีแล้วผู้ใช้อินเทอร์เน็ตแบบสุ่มที่ไม่น่าเชื่อถืออาจทำให้เกิดการเข้าสู่ระบบ (ยกตัวอย่างเช่นคิดว่า MUD) คุณสามารถทำสิ่งที่คุณมีเว็บไซต์และผู้คนต้องอัพโหลดกุญแจของพวกเขา แต่นั่นทำให้สับสนกับคนที่ไม่ได้ "เข้าใจ" วิธีที่ SSH จัดการกุญแจ โดยทั่วไปฉันไม่กังวลเกี่ยวกับโฮสต์ การรับรอง อย่างที่ฉันเป็น ความปลอดภัยการขนส่ง เช่นไม่มีแพ็คเก็ตดมกลิ่นของเซสชั่นและรับ cleartext ไม่ใช่สิ่งที่มีความอ่อนไหวสูงไม่ต้องการให้ง่ายเกินไป
fdmillion

@fdmillion: Ssh ใช้เชลล์เพื่อทำทุกอย่างรวมถึงการเริ่มเซิร์ฟเวอร์ sftp ดังนั้นการ จำกัด การปิดใช้งานเชลล์
Jan Hudec

0

ใช่ .... ใช้คู่กุญแจสาธารณะ / ส่วนตัว ในไฟล์ authorized_key ถ้าคุณทำวิจัยของคุณคุณจะทราบว่าคุณสามารถ จำกัด ไพรเวตคีย์ให้กับคีย์เฉพาะและแม้แต่ปกป้องมันจากการได้รับอนุญาตจากหมายเลข IP ที่แน่นอนเท่านั้น


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