Score:3

การตั้งค่า sftp บน Amazon Linux 2 ด้วยคีย์ ssh การแยกผู้ใช้ (sftp vs ssh) พอร์ตต่างๆ และข้อจำกัดไดเรกทอรีผู้ใช้

ธง pk

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

pk flag
@anx ขอบคุณสำหรับความคิด สคริปต์ eic_run_authorized_keys โดย AWS กำลังพยายามตรวจสอบคีย์ในข้อมูลเมตาของอินสแตนซ์ EC2 เพื่อดูว่ามีการใช้ EC2 Instance Connect หรือไม่ มีการระบุสคริปต์นั้นในไฟล์ sshd_config ภายใต้ AuthorizedKeysCommand หน้าคู่มือที่ระบุว่า: "หากคีย์ที่ให้มาโดย AuthorizedKeysCommand ไม่สามารถตรวจสอบสิทธิ์และอนุญาตผู้ใช้ได้สำเร็จ การตรวจสอบสิทธิ์คีย์สาธารณะจะดำเนินการต่อไปโดยใช้ไฟล์ AuthorizedKeysFile ปกติ" ดังนั้นจึงล้มเหลวด้วยสถานะ 22 ในคำสั่ง curl ที่ส่งคืนสถานะ 401 จากนั้นดำเนินการปกติด้วย ~user1/.ssh/authorized_keys go
pk flag
ตามคำแนะนำของ @ anx ฉันสร้างเคสที่เรียบง่ายขึ้นซึ่งใช้งานได้ สถานการณ์การทำงานคือการลบคำสั่ง ChrootDirectory ออกจาก sshd_config และ user1 ที่เป็นเจ้าของ /sftp-data/user1 แน่นอนว่าไม่ได้ทำในสิ่งที่ฉันต้องการ หากต้องการเพิ่มใน Chroot รูทต้องเป็นเจ้าของ /sftp-data/user1 ไม่เช่นนั้นจะเกิดข้อผิดพลาดขึ้น เมื่อ root เป็นเจ้าของไดเร็กทอรีนั้น การรับรองความถูกต้อง SSH จะล้มเหลว
Michael Hampton avatar
cz flag
ข้อผิดพลาดใดที่บันทึกโดย sshd สำหรับชุดสิทธิ์เฉพาะนั้น
pk flag
คำถามที่อัปเดต - พร้อมรายละเอียดนั้น @MichaelHampton
Michael Hampton avatar
cz flag
ChrootDirectory ของคุณต้องได้รับสิทธิ์ในการค้นหาขั้นต่ำ (`a+x`) เพื่อให้ผู้ใช้ที่ไม่มีสิทธิ์เข้าถึงไดเร็กทอรีระดับล่าง
pk flag
@MichaelHampton คุณเข้าใจแล้ว สร้างคำตอบหากคุณต้องการ ฉันอ่านมากเกินไปในสิ่งที่ man page พูดเกี่ยวกับ ChrootDirectory: "เมื่อเริ่มต้นเซสชัน sshd(8) ตรวจสอบว่าส่วนประกอบทั้งหมดของชื่อพา ธ เป็นไดเร็กทอรีที่เป็นของ root ซึ่งผู้ใช้หรือกลุ่มอื่นไม่สามารถเขียนได้" เห็นได้ชัดว่าสิ่งที่เราได้เรียนรู้คือ sshd กำลังตรวจสอบไฟล์ที่ได้รับอนุญาตซึ่งสามารถอ่านได้เมื่อผู้ใช้พยายามตรวจสอบสิทธิ์ ขอบคุณมาก!
Score:3
ธง cz

ของคุณ ChrootDirectory เป็น /sftp-data/user1ซึ่งต้องเป็นของรูท และมันก็เป็น:

# 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

อย่างไรก็ตาม ณ จุดนี้ sshd ได้เปลี่ยนผู้ใช้เป็น user1 และยกเลิกสิทธิ์แล้ว ดังนั้น user1 จึงไม่สามารถลงไปยังไดเร็กทอรีระดับล่างได้ ในการทำเช่นนั้นไดเร็กทอรีจำเป็นต้องได้รับอนุญาตในการค้นหา (ก+x).

chmod a+x /sftp-data/user1

ขณะนี้ user1 สามารถลงไปยังไดเร็กทอรีย่อยและ .ssh ไดเร็กทอรีควรอ่านได้

Score:1
ธง ve

ฉันคิดว่านี่เป็นปัญหาหลักในการอนุญาตโฟลเดอร์ ฉันคิดว่า /sftp-data/user1/.ssh และไดเรกทอรีด้านล่างต้องเป็นของ ผู้ใช้1แต่ดูเหมือนว่าพวกเขาเป็นเจ้าของโดย ราก. ลองทำดังนี้ ราก:

ตรวจสอบรหัสสาธารณะใน /sftp-data/user1/.ssh/authorized_keys มีความถูกต้อง หลังจากนั้น ฉันคิดว่านี่คือการอนุญาตที่คุณอาจต้องเปลี่ยน:

chmod 700 /sftp-data/user1/.ssh
chmod 600 /sftp-data/user1/.ssh/authorized_keys
chown root:sftpusers /sftp-data
chown -R user1:user1 /sftp-data/user1/.ssh

รีสตาร์ท SSH และฉันคิดว่าคุณพร้อมแล้ว

pk flag
ขอบคุณสำหรับคำตอบ. น่าเสียดายที่ฉันได้ลองอนุญาตเหล่านั้นแล้ว ในกรณีที่ฉันได้รันคำสั่งที่แนะนำของคุณและพบผลลัพธ์เดียวกัน การตรวจสอบสิทธิ์ SSH ล้มเหลว ฉันคิดว่ามีเหตุผลอะไรที่แตกต่างจากทางเลือกอื่น โดยที่ user1 เป็นเจ้าของ /sftp-data/user1 เป็นไปได้ไหมที่ sshd (ทำงานในฐานะรูท) ไม่สามารถเข้าถึงคีย์ที่อนุญาตของผู้ใช้ได้เนื่องจากกำลังเดินไปยังไดเร็กทอรี

โพสต์คำตอบ

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