การเพิ่มผู้ใช้ที่สามารถเรียกใช้สคริปต์จากระยะไกลเท่านั้น


14

ฉันต้องการสร้างผู้ใช้ที่สามารถทำได้เพียงสิ่งเดียวเท่านั้น: ผ่าน ssh ระบุสคริปต์ (และอาร์กิวเมนต์บรรทัดคำสั่งของสคริปต์) ที่อยู่ในโฟลเดอร์เดียว (สำหรับวัตถุประสงค์ของคำถามนี้ให้เราเรียกมัน/local/remote_only_scripts/foo) และให้สคริปต์ดำเนินการ แล้วส่งคืนเอาต์พุต

เพื่อให้ชัดเจนบางตัวอย่างของสิ่งที่ฉันไม่ต้องการให้ผู้ใช้สามารถทำได้:

  • เข้าสู่ระบบในบัญชี /bin/loginการประยุกต์ใช้เข้าสู่ระบบเป็น ไม่ใช่สคริปต์ใน/local/remote_only_scripts/fooโฟลเดอร์ดังนั้นจึงไม่ควรเรียกใช้โดยผู้ใช้
  • ลงชื่อเข้าใช้บัญชีจากระยะไกล ล็อกอินอีกครั้ง (นั่นคือสิ่งที่เรียกว่าโดย ssh?) ไม่ใช่สคริปต์ในโฟลเดอร์ที่เกี่ยวข้อง
  • แสดงรายการเนื้อหาของไดเรกทอรี LS /bin/lsอยู่ใน ไม่ใช่สคริปต์ในไดเรกทอรีที่เหมาะสม
  • แก้ไขไฟล์ในไดเรกทอรีนั้น emacs, vi, แก้ไขอื่น ๆ ส่วนใหญ่ไม่ได้เป็นสคริปต์ใน directoy นั้น
  • ดูเนื้อหาของไฟล์ในไดเรกทอรีนั้น
  • ดำเนินการไฟล์ในไดเรกทอรีนั้นว่าเขาไม่ได้รับอนุญาตให้ดำเนินการ

โปรดทราบว่านี่เป็นตัวอย่างที่มีการดำเนินการอื่น ๆ อีกมากมายที่ฉันไม่ต้องการให้ผู้ใช้สามารถทำได้ ในการพิจารณาการกระทำให้ถามว่า "สคริปต์นี้ใช้งาน/local/remote_only_scripts/fooหรือไม่" ถ้าคำตอบคือไม่มีผู้ใช้ไม่ควรทำ หากคำตอบคือใช่ผู้ใช้ควรจะสามารถทำได้

PS: ให้ฉันอธิบายสิ่งที่ฉันหมายถึงโดย "การเพิ่มผู้ใช้" ฉันไม่ได้หมายถึงการเพิ่มผู้ใช้ไปยังระบบย่อย ssh แต่ฉันหมายถึงการเพิ่มผู้ใช้ไปยังระบบคอมพิวเตอร์ ตัวอย่างเช่นฉันมีระบบที่ใช้เดเบียนเสถียรเรียกมันตามที่อยู่ของมัน www.hg.bar.com ฉันต้องการที่จะเพิ่มผู้ใช้ (ผ่าน kuser ผู้ใช้ผู้ดูแลระบบหรือ useradd หรือวิธีที่คล้ายกัน) เรียกเขาว่า hg_guest hg_guest ไม่สามารถเข้าสู่ระบบในเครื่องหรือทำสิ่งใด ๆ ในรายการด้านบน hg_guest ทั้งหมดสามารถทำได้คือเรียกใช้สคริปต์ "จากระยะไกล" ฉันบอกว่าเขาควรจะสามารถทำได้ผ่านทาง ssh แต่คิดว่าตอนนี้อาจจะอนุญาตให้เขาใช้ ssh อาจอนุญาตให้เขาเข้าสู่ระบบในท้องถิ่นดังนั้นกลไกอื่น ๆ อาจจำเป็นต้องใช้

คำตอบ:


12

มีตัวเลือกคำสั่งในไฟล์ authorized_keys ตัวเลือกนี้ดูเหมือนจะทำสิ่งที่คุณต้องการ

โปรดทราบว่าไม่ใช่ chroot หรือ shell ที่ จำกัด มันอนุญาตให้รันคำสั่งเหล่านั้นผ่าน ssh เท่านั้น ด้วยตัวอย่างของคุณมันจะเป็น:

ssh somehost /local/remote_only_scripts/foo

สำหรับไฟล์ authorized_keys นี้:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

มีหลายวิธีถ้าคุณไม่ต้องการให้ผู้ใช้ของคุณสามารถเข้าสู่ระบบในเครื่อง คุณสามารถ:

  • เพียงตั้งค่าเชลล์เป็น/ bin / false (บางทีคุณอาจต้องการ/ bin / trueเนื่องจาก ssh ต้องการการล็อกอินที่ถูกต้อง)
  • ล็อครหัสผ่านดู passwd -l

แก้ไข : เพิ่มตัวเลือกข้อ จำกัด เพิ่มเติมและชี้แจงวิธีลบการเข้าถึงในท้องถิ่น


ฉันไม่คิดว่าคุณต้องระบุคำสั่งนั้นใน ssh ทางฝั่งไคลเอ็นต์มันเป็นคำสั่ง 'บังคับ' ดังนั้นมันจะถูกดำเนินการเสมอ) ผู้ใช้บนไซต์ระยะไกลยังคงต้องการเชลล์ที่ถูกต้องที่กำหนดใน / etc / passwd
jirib

1
นอกจากcommand=นี้ยังno-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptyมีตัวเลือกที่จำเป็นสำหรับการ จำกัด บัญชี
กรกฎาคม

ตกลง. ฉันตื่นกลางดึกและตัดสินใจตรวจสอบคำตอบ ตั้งแต่ฉันง่วงนอนฉันจะไม่ดูดซึมคำตอบทั้งหมด แต่ถามสิ่งที่ทำให้ฉันสับสน วิธีนี้ป้องกัน hg_quest ไม่ให้ลงชื่อเข้าใช้จาก tty ได้อย่างไร
HandyGandy

@HandGandy นี่คือส่วนที่ง่ายที่สุด ฉันได้เพิ่มวิธีการทำ 2 วิธี แต่ฉันคิดว่ามีอีกมาก
Coren

0

ลองใช้นี่เป็นเชลล์ล็อกอินสำหรับผู้ใช้:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

คุณอาจจะต้องการสิ่งนี้ในauthorized_keysไฟล์อย่างชัดเจนเหมือนในคำตอบของ Coren แต่แทนที่ '... / foo; ด้วยโปรแกรมที่นี่ ที่จะป้องกันไม่ให้คำสั่งจาก SSH เหมือนsftp, และscpssh hostname command


หากคุณต้องการให้ผู้ใช้สามารถรันคำสั่งจากไดเรกทอรีของคุณ (และมีไม่มากเกินไป) คุณสามารถนำ "prog" ออกจากการอ่านด้านบนและใช้คำสั่ง select เพื่อเสนอเมนูข้อความของตัวเลือก ของโปรแกรมเหล่านั้นแล้วทำการอ่านเพื่อหาข้อโต้แย้ง ฉันจะทดสอบสิ่งนี้เพื่อให้แน่ใจว่าจะเกิดอะไรขึ้นถ้าคุณพิมพ์ Ctrl-Cs จำนวนมากที่จุดต่าง ๆ ในสคริปต์ คุณอาจต้องการคำสั่ง trap ด้วยเช่นกัน
Joe

0

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

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest: x: 2002: 100 :: / home / hg_guest: /local/remote_only_scripts/foo/script.sh

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