ตัวเลือกคำสั่ง SSH authorized_keys: หลายคำสั่ง?


17

authorized_keys มีตัวเลือก command = "... " ที่ จำกัด คีย์ไว้ที่คำสั่งเดียว มีวิธี จำกัด คีย์ให้กับหลายคำสั่งหรือไม่? เช่นโดยมี regex ที่นั่นหรือแก้ไขไฟล์การกำหนดค่าอื่น ๆ ?

คำตอบ:


9

ไม่มันไม่ใช่คำสั่ง "อนุญาต" แต่คำสั่ง "บังคับ" (เป็นตัวเลือกForceCommand )

stdinความเป็นไปได้เพียงอย่างเดียวคือการใช้แป้นที่แตกต่างกันสำหรับคำสั่งที่แตกต่างกันหรือพารามิเตอร์อ่านจาก


27

คุณสามารถมีเพียงหนึ่งคำสั่งต่อหนึ่งคีย์เนื่องจากคำสั่งนั้น“ ถูกบังคับ”

แต่คุณสามารถใช้สคริปต์ตัวตัดคำ คำสั่งที่เรียกว่าได้รับบรรทัดคำสั่งเดิมเป็นตัวแปรสภาพแวดล้อม$SSH_ORIGINAL_COMMANDซึ่งสามารถประเมินได้

เช่นใส่ไว้ใน~/.ssh/allowed-commands.sh:

#!/bin/sh
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

case "$SSH_ORIGINAL_COMMAND" in
    "systemctl restart cups")
        systemctl restart cups
        ;;
    "shutdown -r now")
        shutdown -r now
        ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

จากนั้นอ้างอิง~/.ssh/authorized_keysด้วย

command="/home/user/.ssh/allowed-commands.sh",…

1
มีประโยชน์ อาจมีค่าที่ทำให้ชัดเจนยิ่งขึ้นว่าเป็น sshd ที่เพิ่มSSH_ORIGINAL_COMMAND(ต่อman sshd) เพื่อให้พร้อมใช้งานในสคริปต์ นอกจากนี้เพื่อให้ตัวอย่างสำหรับสคริปต์อัตโนมัติที่อนุญาตให้บางรูปแบบของSSH_ORIGINAL_COMMANDการทำงาน ดูเพิ่มเติมunixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight

7

ในSSHที่ยอดเยี่ยมThe Secure Shell: The Definitive Guide book โดย O'Reilly ในบทที่แปดมีตัวอย่างที่ดีที่ใช้สคริปต์ดังต่อไปนี้:

#!/bin/sh

/bin/echo "Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit"

/bin/echo "Your choice:"

read ans

while [ "$ans" != "q" ]
do
   case "$ans" in
      1)
         /bin/date
         ;;
      2)
         /usr/bin/who
         ;;
      3)
         /usr/bin/top
         ;;
      q)
         /bin/echo "Goodbye"
         exit 0
         ;;
      *)
         /bin/echo "Invalid choice '$ans': please try again"
         ;;
   esac
   /bin/echo "Your choice:"
   read ans
done
exit 0

ใช้สิ่งนี้ใน.authorized_keysไฟล์ของคุณเช่น:

command="/path/to/your/script.sh" <ssh-key>

... ช่วยให้คุณนี้เมื่อทำssh:

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:

แต่สคริปต์ดังกล่าวโดยทั่วไปแบ่งscp, sftpและสิ่งอื่น ๆ ที่คุณอาจพบว่ามีประโยชน์บางวัน
Jakuje

3
@Jakuje commandตัวเลือกนี้ใช้ไม่ได้ใช่ไหม
gf_

1

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

บทความอื่นอธิบายสคริปต์ทั่วไปซึ่งอนุญาตให้อาร์กิวเมนต์บรรทัดคำสั่งไปยังคำสั่งที่อนุญาต แต่อนุญาตให้ล็อกลงด้วยกฎที่แสดงเป็นนิพจน์ทั่วไป

ตัวอย่างนี้จะแสดงวิธีดังต่อไปนี้:

command="only systemctl shutdown"

และ.onlyrulesไฟล์จะถูกสร้างขึ้นด้วยเนื้อหานี้:

\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}

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


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

คุณสามารถใช้ "กระสุน จำกัด " เป็นForcedCommand
Georg Lehner

มันเกิดขึ้นกับฉันสำหรับสถานการณ์ที่บัญชีที่ใช้เป็นบัญชีผู้ใช้ปกติและการดำเนินการที่จำเป็นต้องมีสิทธิพิเศษที่สามารถพึ่งพา sudo เพื่อทำการตรวจสอบและตั้งค่าตัวเลือกคำสั่ง authorized_keys เป็น "sudo $ SSH_ORIGINAL_COMMAND"
สตีฟดี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.