อัปเดต: โค้ดด้านล่างได้รับการอัปเดตเพื่อแสดงถึงการเปลี่ยนแปลงที่ระบุในคำตอบที่ทำเครื่องหมายไว้ ดังนั้นจึงทำงานได้ตามที่คาดไว้
ฉันกำลังพยายามสร้างผู้ใช้ SFTP เท่านั้นบนเซิร์ฟเวอร์ของฉัน ซึ่งถูกจำคุกในโฮมไดเร็กตอรี่ของพวกเขา เมื่อพยายามเชื่อมต่อกับเซิร์ฟเวอร์ ฉันได้รับข้อผิดพลาดไปป์เสีย:
debug1: การรับรองความถูกต้องสำเร็จ (รหัสผ่าน)
xxxx.xxxxxxxxx.com ([XX.XX.XX.XX]:22)
debug2: fd 5 ตั้งค่า O_NONBLOCK
debug3: fd 6 คือ O_NONBLOCK
debug1: ช่อง 0: ใหม่ [ไคลเอ็นต์เซสชัน]
debug3: ssh_session2_open: channel_new: 0
debug2: ช่อง 0: ส่งเปิด
debug3: ส่งแพ็คเก็ต: ประเภท 90
debug1: ขอ [email protected]
debug3: ส่งแพ็คเก็ต: ประเภท 80
debug1: กำลังเข้าสู่เซสชันแบบโต้ตอบ
debug1: คำมั่นสัญญา: เครือข่าย
debug3: ส่งแพ็คเก็ต: ประเภท 1
packet_write_wait: การเชื่อมต่อกับพอร์ต XX.XX.XX.XX 22: ท่อแตก
ไม่สามารถอ่านแพ็คเก็ต: การเชื่อมต่อถูกรีเซ็ตโดยเพียร์
ฉันได้พิจารณาแล้วว่าสิ่งนี้เกี่ยวข้องกับความพยายามของฉันที่จะจำคุกผู้ใช้ ของฉัน sshd_config
รวมถึง:
ระบบย่อย sftp ภายใน-sftp
จับคู่กลุ่ม sftponly
ForceCommand ภายใน-sftp -d /%u
การตรวจสอบรหัสผ่านใช่
ChrootDirectory /home/sftp
ใบอนุญาตอุโมงค์เลขที่
AllowAgent หมายเลขการส่งต่อ
อนุญาตให้ Tcp ส่งต่อหมายเลข
X11หมายเลขการส่งต่อ
sftponly
เป็นชื่อของกลุ่มที่ฉันสร้างขึ้นสำหรับผู้ใช้ SFTP เจ้าของและกลุ่มของ /home/sftp
เป็น ราก
โดยได้รับอนุญาตเป็นลายลักษณ์อักษรสำหรับเจ้าของเท่านั้น (0711
).
$ chown root:root /home/sftp
$ chmod 0711 /home/sftp
นี่คือวิธีที่ฉันสร้างผู้ใช้ (ในตัวอย่างนี้ แบทแมน
) -- โปรดทราบว่าฉันทำสิ่งนี้ผ่านสคริปต์ Perl ดังนั้นฉันจึงใช้ รหัสผ่าน
:
$ adduser --quiet --disabled-password --shell /bin/false --no-create-home --gecos "ผู้ใช้" แบทแมน
$ echo "แบทแมน:แบทแมน123" | รหัสผ่าน
$ usermod -a -G sftponly แบทแมน
$ ติดตั้ง -d -m 0755 /home/sftp/batman -o แบทแมน -g sftponly
หมายเหตุ: ฉันกำลังสร้างโฮมไดเร็กทอรีของผู้ใช้ด้วยตนเองแทนที่จะส่ง --ระบบ
หาเรื่อง ผู้ใช้ที่เพิ่มเนื่องจากฉันได้รับข้อผิดพลาดเมื่อฉันพยายามเปลี่ยนความเป็นเจ้าของไดเร็กทอรีในภายหลัง:
chown: กลุ่มไม่ถูกต้อง: âbatman:batmanâ
ถ้าฉันปรับปรุงของฉัน sshd_config
และเปลี่ยนไดเร็กทอรี chroot เป็น:
ChrootDirectory /home/sftp
ฉันสามารถเข้าถึงเซิร์ฟเวอร์ได้สำเร็จและไม่ได้รับข้อผิดพลาดไปป์เสียอีกต่อไป อย่างไรก็ตามฉันลงจอด /home/sftp
เมื่อเข้าสู่ระบบ ฉันเห็นรายการไดเร็กทอรีผู้ใช้อื่นๆ ทั้งหมด แทนที่จะเข้าไปอยู่ในนั้น /home/sftp/แบทแมน
อย่างที่ฉันคาดว่าจะเกิดขึ้น
ฉันจะปรับปรุง/แก้ไขปัญหานี้ได้อย่างไร เพื่อให้ผู้ใช้:
- มีสิทธิ์เข้าถึงไดเร็กทอรีของตนเองเท่านั้น (
/home/sftp/แบทแมน
)
- เมื่อเข้าสู่ระบบจะปรากฏเป็นภายใน
/
(ซึ่งจริงๆแล้ว /home/sftp/แบทแมน
)
- ไม่สามารถนำทางไปยัง
/home/sftp
(เพื่อไม่ให้เห็นรายชื่อผู้ใช้รายอื่น)