TDLR: ฉันมี Catch 22 ซึ่งขึ้นอยู่กับการอนุญาตในโฮมไดเร็กทอรีของผู้ใช้ ฉันสามารถทำให้การรับรองความถูกต้อง SSH ทำงานได้ หรือข้อจำกัดของไดเร็กทอรีผู้ใช้ แต่ไม่ใช่ทั้งสองอย่าง
BTW ฉันต้องการม้วนเซิร์ฟเวอร์ SFTP ของตัวเองจริงๆ โปรดอย่าแนะนำให้ฉันลองใช้บริการ AWS Transfer หรืออย่างอื่น ขอบคุณ.
นี่คือเนื้อหาที่เกี่ยวข้อง (เปลี่ยนจากค่าเริ่มต้น) ใน /etc/ssh/sshd_config:
ระบบย่อย sftp ภายใน-sftp
พอร์ต 22
พอร์ต 2299
จับคู่กลุ่ม sftpusers LocalPort 2299
ChrootDirectory /sftp-data/%u
ForceCommand ภายใน-sftp
จับคู่กลุ่ม sftpusers LocalPort 22
DenyGroups sftpusers
จับคู่ LocalPort 2299 Group *,!sftpusers
ปฏิเสธผู้ใช้ *
ฉันต้องการให้พอร์ต 22 ทำงานตามปกติ ssh แต่สำหรับผู้ใช้ที่ไม่ใช่ sftp เท่านั้น สำหรับผู้ใช้ sftp ในกลุ่ม "sftpusers" ฉันต้องการให้พอร์ต 2299 ทำงานเป็น sftp เท่านั้น ไม่ใช่ ssh สำหรับผู้ที่ไม่ใช่ sftpusers ฉันต้องการการเข้าถึงพอร์ต 2299 ที่ถูกปฏิเสธ
โอเค ฉันสร้างผู้ใช้ "user1" ด้วยโฮมไดเร็กทอรี /sftp-data/user1 และเชลล์ /sbin/nologin ฉันสร้าง /sftp-data/user1/.ssh/authorized_keys และเติมข้อมูลนั้นด้วยรหัส ssh สาธารณะ / sftp-data เป็นของ root ที่มีสิทธิ์ 700 /sftp-data/user1/.ssh และด้านล่างเป็นของ user1 และ /sftp-data/user1/.ssh/authorized_keys มีสิทธิ์ 600 ความเป็นเจ้าของ/สิทธิ์ของ /sftp-data/user1 อยู่ภายใต้คำถามที่นี่ เพิ่มเติมด้านล่าง
ฉันสร้างกลุ่มผู้ใช้ sftpusers และเพิ่ม user1 ลงในกลุ่มนั้น อย่างไรก็ตาม ผู้ใช้ ec2 ในตัวที่คุณได้รับจาก AWS ไม่ได้เป็นสมาชิกของกลุ่มนั้น การทดสอบกับผู้ใช้ ec2 นั้นใช้งานได้ดี: การเข้าถึงผ่าน ssh, พอร์ต 22 ทำงานได้ตามปกติ แต่ไม่มีการเข้าถึงพอร์ต 2299
ดังนั้น การทดสอบกับ user1 จึงเป็นจุดที่น่าสนใจ User1 ไม่สามารถเข้าถึงพอร์ต 22 ได้ - เยี่ยมมาก! เมื่อ user1 เป็นเจ้าของ /sftp-data/user1 การตรวจสอบคีย์สาธารณะ ssh จะสำเร็จบนพอร์ต 2299 แต่ผู้ใช้ออกจากระบบทันที โดยข้อความนี้บันทึกไว้ใน /var/log/secure:
2 ก.ย. 19:21:38 น. ip-192-168-0-25 sshd[10369]: ยอมรับคีย์สาธารณะสำหรับผู้ใช้ 1 จาก <ip-address redacted> พอร์ต 61110 ssh2: ECDSA SHA256:<sha redacted>
2 ก.ย. 19:13:23 น. ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): เซสชันเปิดสำหรับผู้ใช้ user1 โดย (uid=0)
2 ก.ย. 19:13:23 น. ip-192-168-0-25 sshd[9803]: ร้ายแรง: ความเป็นเจ้าของหรือโหมดที่ไม่ดีสำหรับไดเร็กทอรี chroot "/ sftp-data/user1" [postauth]
2 ก.ย. 19:13:23 น. ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): ปิดเซสชันสำหรับผู้ใช้ user1
แน่นอนว่ามันสมเหตุสมผลแล้ว Chroot ต้องการให้ /sftp-data/user1 เป็นเจ้าของโดยรูท สิทธิ์ 700 ดังนั้น ทำเช่นนั้น และตอนนี้การตรวจสอบสิทธิ์ sftp (คีย์ ssh) ล้มเหลว
2 กันยายน 19:41:00 น. ip-192-168-0-25 sshd[11693]: ข้อผิดพลาด: AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys user1 SHA256: <sha redacted> ล้มเหลว สถานะ 22
BTW, eic_run_authorized_keys เป็น wrapper ที่ AWS ใช้การรับรองความถูกต้อง ssh มาตรฐานเพื่อเปิดใช้งาน AWS Instance Connect
สำหรับเครดิตเพิ่มเติม... หากปัญหาข้างต้นยังไม่ท้าทายพอ คุณสามารถสร้างโครงการที่ฉันสามารถให้ผู้ใช้ SFTP บางรายเข้าถึงไดเร็กทอรีโครงการเฉพาะและเฉพาะเหล่านั้น โดยไม่ต้องสร้างกลุ่มสำหรับทุกโครงการได้หรือไม่ ลิงก์จากโฮมไดเร็กทอรีของผู้ใช้แต่ละคนไปยังไดเร็กทอรีโปรเจ็กต์จะดีมาก
ข้อมูลเพิ่มเติมที่ร้องขอโดย @anx:
# รับรหัสผ่าน wd user1
user1:x:1001:1001::/sftp-data/user1:/sbin/nologin
# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-data/user1/.ssh/authorized_keys
ราก dr-xr-xr-x ราก /
drwxr-xr-x ราก root sftp-ข้อมูล
drwx------ รูท ผู้ใช้รูท1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers ที่ได้รับอนุญาต_keys
ฉันเปิดการบันทึก DEBUG สำหรับ sshd การใช้คำสั่ง ChrootDirectory โดยมี /sftp-data/user1 เป็นเจ้าของโดย root และการตรวจสอบสิทธิ์ SSH ล้มเหลว ฉันเห็นสิ่งนี้ใน /var/log/secure:
debug1: ไม่สามารถเปิดคีย์ที่ได้รับอนุญาต '/sftp-data/user1/.ssh/authorized_keys': ปฏิเสธการอนุญาต
ps แสดงให้ฉันเห็นอย่างชัดเจนว่ารูทกำลังเรียกใช้กระบวนการ sshd