คำถามที่ 1
คำถามของฉันคือฉันจะ จำกัด คำสั่งเฉพาะการถ่ายโอน SFTP นี้ในรหัสสาธารณะที่สร้างขึ้นได้อย่างไร
มี 2 วิธีในการทำเช่นนี้
1. - การ จำกัด ผ่าน sshd
วิธีนี้เกี่ยวข้องกับการตั้งค่าคุณสมบัติ SFTP ภายใน SSH daemon ของsshd
คุณ สิ่งนี้ถูกควบคุมผ่าน/etc/ssh/sshd_config
ไฟล์กำหนดค่า หมายเหตุ:สิ่งนี้จะ จำกัด ผู้ใช้backup
เพื่ออนุญาตให้ SFTP เข้าสู่เซิร์ฟเวอร์เท่านั้น
# /etc/ssh/sshd_config
Subsystem sftp internal-sftp
## You want to put only certain users (i.e users who belongs to sftpusers
## group) in the chroot jail environment. Add the following lines at the end
## of /etc/ssh/sshd_config
Match User backup
ForceCommand internal-sftp
2. - การ จำกัด ผ่าน authorized_keys
วิธีนี้ไม่เกี่ยวข้องกับการเปลี่ยนแปลงใด ๆ กับsshd_config
ไฟล์ คุณสามารถ จำกัด ผู้ใช้ + คีย์ SSH ให้กับคำสั่งเดียวผ่านcommand=
คุณสมบัติที่คุณได้กล่าวถึงไปแล้วในคำถามของคุณ เคล็ดลับอยู่ในสิ่งที่คุณรวมคำสั่ง คุณสามารถวางเซิร์ฟเวอร์ SFTP ในcommand=
บรรทัดนี้ซึ่งมีผลเช่นเดียวกับการตั้งค่าเซิร์ฟเวอร์ SFTP ในsshd_config
ไฟล์ของคุณ
# User backup's $HOME/.ssh/authorized_keys file
command="/usr/libexec/openssh/sftp-server" ssh-dss AAAAC8ghi9ldw== backup@host
หมายเหตุ:หากผู้ใช้มีการเข้าถึงเพื่อเขียน ~/.ssh/authorized_keys
พวกเขาสามารถอ่านและ / หรือแก้ไขได้ ตัวอย่างเช่นพวกเขาสามารถดาวน์โหลดแก้ไขและอัปโหลดซ้ำได้commmand=...
โดยอนุญาตให้เขาเข้าถึงคำสั่งที่ไม่ได้กรองรวมถึงเชลล์ หากผู้ใช้มีสิทธิ์เข้าถึงเพื่อเขียน~/.ssh
พวกเขาสามารถยกเลิกการเชื่อมโยงและสร้างไฟล์ใหม่หรือchmod
สร้างการเข้าถึงได้ มีวิธีแก้ปัญหาที่เป็นไปได้มากมายเช่นวาง~/.ssh/authorized_keys
ไฟล์ในที่ที่ผู้ใช้ไม่สามารถเขียนได้เช่นด้วย:
Match Group sftponly
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
คำถาม # 2
และเนื่องจากฉันอยู่ในที่อยู่ IP แบบไดนามิกฉันจะเอาชนะปัญหา "โฮสต์ที่ขาดหายไป" ปัญหาในแต่ละครั้งที่มีการเปลี่ยนแปลง IP ของฉันได้อย่างไร
นี่เป็นเรื่องยาก แต่ทำได้โดยใช้from=
คุณสมบัติภายในauthorized_keys
ไฟล์เช่นกัน ที่นี่เรา จำกัด การเข้าถึงจากโฮสต์เท่านั้น, somehost.dyndns.org
.
จาก = "somehost.dyndns.org", คำสั่ง = "/ usr / libexec / openssh / sftp-server", ไม่มีการส่งต่อพอร์ต, ไม่มีการส่งต่อ X11, ไม่มีการส่งต่อเอเจนต์, no-pty ssh-dss AAAAC8ghi9ldw == backup @ host
การตั้งค่าเพิ่มเติมหลังจากนั้นcommand=
มีความสำคัญเท่าเทียมกันเนื่องจากจะ จำกัด การใช้คีย์ SSH ยิ่งขึ้น
รายละเอียดของคุณสมบัติ
from='hostname1,hostname2,''
- จำกัด การเข้าถึงจาก IP หรือรูปแบบชื่อโฮสต์ที่ระบุ
command='command'
- รันคำสั่งที่ระบุหลังจากการพิสูจน์ตัวตน
no-pty
- ไม่จัดสรร pty (ไม่อนุญาตการล็อกอินแบบโต้ตอบ)
no-port-forwarding
- ไม่อนุญาตให้ส่งต่อพอร์ต
no-X11-forwarding
- ผู้ใช้จะไม่สามารถลบจอแสดงผล X11 GUIs
no-agent-forwarding
- ผู้ใช้จะไม่สามารถส่งต่อผ่านโฮสต์นี้ไปยังโฮสต์ภายในอื่น ๆ
หากต้องการกำจัดข้อความเกี่ยวกับ "โฮสต์ที่ขาดหายไป" คุณสามารถเพิ่มตัวเลือก SSH นี้ให้กับลูกค้าเมื่อเชื่อมต่อดังนี้:
$ ssh -o StrictHostKeyChecking=no ....
ดู man page ssh_config
สำหรับรายละเอียดทั้งหมดเกี่ยวกับสวิตช์นี้
การ จำกัด เปลือกของผู้ใช้
สำหรับโซลูชันทั้งสองข้างต้นคุณอาจต้องการล็อกbackup
ผู้ใช้โดย จำกัด เชลล์ของผู้ใช้รายนี้ใน/etc/passwd
ไฟล์ด้วย โดยทั่วไปแล้วคุณจะต้องการตั้งค่าเป็นscponly
แต่มีตัวเลือกอื่นสำหรับสิ่งนี้เช่นกัน ดูคำถาม & คำตอบ U & L นี้: " คุณต้องการกระสุนสำหรับ SCP หรือไม่ " เพื่อทำสิ่งนี้
การใช้/sbin/nologin
ยังสามารถใช้ถ้าคุณเลือกที่จะใช้คุณลักษณะ chroot จากsshd_config
ที่ระบุไว้ใน# 1ข้างต้น แต่ถ้าคุณเลือกที่จะใช้วิธีการที่ระบุไว้ใน# 2แล้วคุณมีแนวโน้มที่จะมีการใช้หรือสิ่งอื่นสำหรับเปลือกของผู้ใช้ในscponly
/etc/passwd
โบนัส - ขยาย # 2 ด้านบน
หากคุณต้องการแสดงชุดคำสั่งสำหรับผู้ใช้รายนี้คุณสามารถทำได้ สร้างสคริปต์เช่น/home/backup/commands.sh
:
#!/bin/sh
case $SSH_ORIGINAL_COMMAND in
"diskspace")
df -h
;;
"dirlist")
ls -1
;;
"apache_restart")
/etc/init.d/apache restart
;;
*)
echo "Unknown command"
esac
จากนั้นคุณตั้งค่าauthorized_keys
ไฟล์ดังนี้:
command="/bin/sh /home/user/commands.sh" ssh-dss AAAAC8ghi9ldw== user@host
backup
จากนั้นผู้ใช้สามารถเรียกใช้คำสั่งเหล่านี้เพื่อต้องการ:
# diskspace
$ ssh -q user@remote_host diskspace
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/dev-root 39G 2.2G 35G 6% /
# dirlist
$ ssh -q remote_host dirlist
commands.sh
dump.sql
อ้างอิง