ฉันจะติดตั้งเซิร์ฟเวอร์ openSSH SFTP บน Linux ได้อย่างไร


10

ฉันต้องการที่จะกำหนดค่า SFTP เซิร์ฟเวอร์ที่จะแบ่งปันไดเรกทอรี /etc/ssh/sshd_configแต่ผมไม่ทราบว่าวิธีการแก้ไข

ความต้องการของฉันคือ:

1) การเข้าสู่ระบบจะไม่ใช้ใบรับรองรหัสผ่านเท่านั้น (เช่นการอนุญาตใช้วิธีการรหัสผ่าน)

2) ฉันต้องการเข้าสู่ระบบด้วยผู้ใช้: ftp, รหัสผ่าน: foo และแชร์ไดเรกทอรี / home / ftp

3) ฉันมีแอปพลิเคชั่นที่ต้องการดาวน์โหลดไฟล์จากเซิร์ฟเวอร์เป็นระยะ ๆ ฉันไม่จำเป็นต้องลงชื่อเข้าใช้ด้วยไคลเอนต์ปฏิบัติการแบบเต็ม

จนถึงตอนนี้ฉันเพิ่มบรรทัดต่อไปนี้ใน / etc / ssh / sshd_config:

Protocol 2
Subsystem sftp /usr/libexec/sftp-server
Match User ftp
   ForceCommand internal-sftp
   ChrootDirectory /home/ftp

ทุกอย่างอื่นถูกแสดงความคิดเห็น

/home/ftp เป็นไดเรกทอรีว่างเปล่าในขณะนี้

Access ทำงานหากฉันพยายามดาวน์โหลดไฟล์โดยใช้ข้อมูลประจำตัวรูท แต่จะไม่ทำงานหากฉันใช้ข้อมูลรับรอง ftp ฉันจำเป็นต้องตั้งค่าล็อกอินเชลล์หรือไม่? ฉันจำเป็นต้องเติม / home / ftp อย่างใดหรือไม่?

แก้ไข: นี่คือบันทึก sshd ของฉัน:

subsystem request for sftp
debug1: subsystem: exec() internal-sftp
debug1: Forced command (config) 'internal-sftp '
debug2: fd 3 setting TCP_NODELAY
debug2: fd 9 setting O_NONBLOCK
debug2: fd 8 setting O_NONBLOCK
debug1: Received SIGCHLD.
debug1: session_by_pid: pid 17613
debug1: session_exit_message: session 0 channel 0 pid 17613
debug2: channel 0: request exit-status confirm 0
debug1: session_exit_message: release channel 0
debug2: channel 0: write failed
debug2: channel 0: close_write
debug2: channel 0: send eow
debug2: channel 0: output open -> closed
debug2: channel 0: read<=0 rfd 9 len 0
debug2: channel 0: read failed
debug2: channel 0: close_read
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug2: channel 0: input drain -> closed
debug2: channel 0: send close
debug2: notify_done: reading
debug3: channel 0: will not send data after close
debug3: channel 0: will not send data after close
User child is on pid 17611
debug3: mm_request_receive entering

* ลูกค้าค้างที่นี่ (จนกว่าจะหมดเวลา) *

โปรดทราบอีกครั้งว่าถ้าฉันเข้าสู่ระบบในฐานะ "รูท" ไฟล์จะดาวน์โหลดอย่างถูกต้อง นอกจากนี้ยังดาวน์โหลดอย่างถูกต้องหากฉันใส่เครื่องหมายสามบรรทัดสุดท้ายของไฟล์กำหนดค่า (เช่นMatchบรรทัดและ 2 ต่อไปนี้)


คุณได้ลองระบุตัวเลือกการจับคู่หนึ่งตัวเท่านั้นหรือไม่ จะเกิดอะไรขึ้นเมื่อคุณใช้ไคลเอนต์ SFTP จริง คุณยังสามารถเชื่อมต่อโดยใช้ไคลเอ็นต์ SSH ปกติเช่นsshหรือ PuTTY บน Windows ได้หรือไม่? คุณใช้ OpenSSH เวอร์ชันใดอยู่
Daniel Beck

คำตอบ:


7

คุณต้องการให้แน่ใจว่า/home/ftpเป็นเจ้าของโดยrootและว่ากลุ่มและคนอื่น ๆ chmod 0755ไม่ได้มีสิทธิ์ในการเขียนเช่น คุณต้องเพิ่มไดเรกทอรีย่อยftpเพื่อเพิ่มไฟล์


คุณต้องมีinternal-sftpระบบย่อยไม่เช่นนั้นคุณต้องจัดเตรียมchrootสภาพแวดล้อมที่เหมาะสมใน/home/ftp:

Subsystem sftp internal-sftp

หากต้องการไม่อนุญาตการล็อกอินชนิดที่ไม่ใช่รหัสผ่านให้ป้อน

ChallengeResponseAuthentication no
GSSAPIAuthentication no
PubkeyAuthentication no

สิ่งเหล่านี้ถูกเปิดใช้งานโดยค่าเริ่มต้น


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

ลองเพิ่มรายการการกำหนดค่าเดียวในทางกลับกันและทดสอบว่าคุณสามารถเชื่อมต่อเพื่อกำหนดว่าตัวเลือกใดมีข้อผิดพลาดหรืออาจเป็นการรวมกันของตัวเลือก คุณควรมีเอาท์พุทบาง/var/log/secureอย่างอย่างน้อยนั่นคือสิ่งที่ฉันได้รับมันในระบบของฉัน
Daniel Beck

ฉันเพิ่มระดับการเข้าสู่ระบบโดยใช้คำสั่ง LogLevel ฉันสามารถอ่านสตริง/var/log/messagesได้ ฉันได้ดังต่อไปนี้Failed none for ftp [...]ตามมาด้วยและAccepted password for ftp [...] User child is on pid 7658ลูกค้าค้างและหมดเวลา
Emiliano

@happy_emi ลองเพิ่มข้อมูลนั้นในคำถามของคุณ
Daniel Beck

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