ฉันจะ chroot ผู้ใช้ SSH อย่างเดียวในบ้านได้อย่างไร


123

ฉันต้องการให้ลูกค้าเข้าถึงเซิร์ฟเวอร์ของฉัน แต่ฉันต้องการ จำกัด ผู้ใช้เหล่านั้นไปยังโฮมไดเร็กตอรี่ของพวกเขา ฉันจะผูกไฟล์ใด ๆ ที่ฉันต้องการให้พวกเขาเห็น

ฉันได้สร้างผู้ใช้ที่เรียกว่าและเพิ่มเขาไปยังกลุ่มใหม่ที่เรียกว่าbob พวกเขามีไดเรกทอรีบ้านที่sftponly /home/bobฉันเปลี่ยนเชลล์/bin/falseเป็นหยุดการเข้าสู่ระบบ SSH นี่คือ/etc/passwdสายของพวกเขา:

bob:x:1001:1002::/home/bob:/bin/false

ฉันได้เปลี่ยน/etc/ssh/sshd_configไปรวมถึงต่อไปนี้:

Match Group sftponly
        ChrootDirectory /home/%u
        ForceCommand internal-sftp
        AllowTcpForwarding no

เมื่อฉันพยายามเข้าสู่ระบบในฐานะพวกเขานี่คือสิ่งที่ฉันเห็น

$ sftp bob@server
bob@server's password: 
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer

ถ้าฉันใส่ความคิดเห็นในChrootDirectoryบรรทัดฉันสามารถ SFTP แต่แล้วพวกเขามีบังเหียนฟรีผ่านเซิร์ฟเวอร์ ฉันพบว่าใช้ChrootDirectory /homeงานได้ แต่ก็ยังช่วยให้พวกเขาสามารถเข้าถึงไดเรกทอรีบ้านได้ ฉันพยายามอย่างชัดเจนChrootDirectory /home/bobแต่ก็ไม่ได้ผล

ผมทำอะไรผิดหรือเปล่า? ฉันbobจะจำกัด ได้/home/bob/อย่างไร

---- แก้ไข -----

ตกลงดังนั้นฉันเพิ่งดู/var/log/auth.logและเห็นสิ่งนี้:

May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session opened for user bob by (uid=0)
May  9 14:45:48 nj sshd[5091]: fatal: bad ownership or modes for chroot directory component "/home/bob/"
May  9 14:45:48 nj sshd[5074]: pam_unix(sshd:session): session closed for user bob

ฉันไม่แน่ใจว่ามีอะไรเกิดขึ้นบ้าง แต่มันแสดงให้เห็นว่ามีบางอย่างผิดปกติกับไดเรกทอรีผู้ใช้ นี่คือls -h /homeผลลัพธ์:

drwxr-xr-x 26 oli      oli      4096 2012-01-19 17:19 oli
drwxr-xr-x  3 bob      bob      4096 2012-05-09 14:11 bob

2
ผมเชื่อว่าจะถูกแทนที่ChrootDirectory /home/%u ChrootDirectory %h
Franck Dernoncourt

คำตอบ:


119

ความเจ็บปวดทั้งหมดนี้ต้องขอบคุณปัญหาด้านความปลอดภัยหลายอธิบายไว้ที่นี่ โดยทั่วไปแล้วไดเรกทอรี chroot จะต้องเป็นของrootและไม่สามารถเข้าถึงกลุ่มการเขียนใด ๆ น่ารัก ดังนั้นคุณจำเป็นต้องเปลี่ยน chroot ของคุณให้เป็นเซลล์โฮลดิ้งและภายในนั้นคุณสามารถมีเนื้อหาที่แก้ไขได้

sudo chown root /home/bob
sudo chmod go-w /home/bob
sudo mkdir /home/bob/writable
sudo chown bob:sftponly /home/bob/writable
sudo chmod ug+rwX /home/bob/writable

/writableและแบคุณสามารถเข้าสู่ระบบและเขียน


3
ขอบคุณที่มีประโยชน์จริงๆ แม้ว่าสองปัญหา 1. ) แม้ว่าฉันไม่สามารถเขียนได้ แต่ฉันก็ยังสามารถเรียกดูระบบไฟล์ทั้งหมดได้ 2. ) การเปลี่ยนเชลล์เป็น / bin / false ป้องกัน SFTP อย่างสมบูรณ์ ฉันกำลังทำอะไรผิดหรือเปล่า?
kim3er

1
ขอขอบคุณ! บทความอื่น ๆ ในหัวข้อนี้พลาดรายละเอียดนี้ไปบ้างและทำให้บางอย่างทำให้เซิร์ฟเวอร์ไม่สามารถยอมรับการเชื่อมต่อ ssh ได้ (ชนิดของ sucks เมื่อคุณอยู่ใน EC2 และ ... นั่นเป็นวิธีเดียว)
Tom Harrison Jr

4
kim3er: นี่เป็นเพราะคุณต้องตั้งค่าเชลล์ของผู้ใช้เป็น / sbin / nologin - / bin / false ปิดการใช้งานการเข้าถึงใด ๆ

8
ฉันยังต้องการที่จะทราบว่าโฟลเดอร์ทั้งหมดที่นำไปสู่โฟลเดอร์ chroot rootของคุณควรจะเป็นเจ้าของโดย ในตัวอย่างนี้/homeควรเป็นเจ้าของโดย root
ชิกิ

2
ในวันที่ 14.04 ฉันต้องเปลี่ยนSubsystem sftp /usr/lib/openssh/sftp-serverบรรทัดเป็น Subsystem sftp internal-sftp -f AUTH -l VERBOSEก่อนที่จะใช้งานได้
บางสิ่งบางอย่าง

57

เพื่อ chroot ไดเรกทอรี SFTP คุณต้อง

  1. สร้างผู้ใช้และบังคับให้รูทเป็นเจ้าของ

    cd /home
    mkdir john
    useradd -d /home/john -M -N -g users john
    sudo chown root:root /home/john
    sudo chmod 755 /home/john
    
  2. เปลี่ยนตำแหน่งระบบย่อยบน / etc / ssh / sshd_config:

    #Subsystem sftp /usr/lib/openssh/sftp-server
    Subsystem sftp internal-sftp
    

    และสร้างส่วนผู้ใช้ที่ท้ายไฟล์ (ssh สามารถตาย respawning หากวางไว้หลังบรรทัดระบบย่อย):

    Match User john
        ChrootDirectory /home/john
        ForceCommand internal-sftp
        AllowTCPForwarding no
        X11Forwarding no
    

3
ดูเหมือนจะไม่ทำงาน ในตัวอย่างของคุณผู้ใช้johnถูกล็อคไปยัง/home/johnไดเรกทอรี คุณได้รับ755อนุญาตให้กับไดเรกทอรี ดังนั้นเจ้าของได้อ่าน (4) เขียน (2) และดำเนินการ (1) และกลุ่มได้อ่าน (4) และดำเนินการ (1) คุณได้ตั้งยังเจ้าของและกลุ่มrootเพื่อให้johnเป็นของคนอื่น ๆ เขายังได้อ่านและดำเนินการ (4 + 1 = 5) แล้ว ดังนั้นคุณจึงล็อค john ไว้ในไดเรกทอรีที่เขาไม่มีสิทธิ์เขียน จะแก้ไขได้อย่างไร? การเปลี่ยนสิทธิ์เป็น757หรือ777แบ่งการเข้าสู่ระบบ การเปลี่ยนกลุ่มหรือเจ้าของเป็น john จะทำให้การเข้าสู่ระบบหยุดชะงัก
แดเนียล

หมายเหตุ: ใน / etc / ssh / sshd_config configs จะถูกอ่านตามลำดับ ดังนั้นหากคุณมีกฎสำหรับผู้ใช้ทั่วไปและคุณต้องการเขียนทับหนึ่งในนั้นให้วางกฎเฉพาะของผู้ใช้ไว้ด้านบน
rwenz3l

ฉันต้องการ chroot ไดเรกทอรี SFTP ในโฟลเดอร์บ้านของผู้ใช้อื่น ฉันมี userx at /home/userx/sftproot/uploadsและ sftpuser at / home / sftpuse ฉันได้ตั้งค่า chroot ที่/home/usex/sftprootจะเป็นเจ้าของโดย root: root และ chmod 755 The /home/usex/sftproot/uploadschown-ed โดย sftpuser: sftpuser ฉันพบข้อผิดพลาดเดียวกับคำถามเริ่มต้นด้านบน chroot และโฟลเดอร์พาเรนต์ทั้งหมดจำเป็นต้องเป็นเจ้าของโดย root: root หรือไม่เพื่อให้ sftp ทำงานได้หรือไม่
Primoz Rome

6

ฉันใช้เวลาทั้งวันในการรับเครือข่ายร่วมกับราสเบอร์รี่ ฉันต้องการล็อคผู้ใช้เพื่อที่จะไม่สามารถนำทางผ่านระบบไฟล์ทั้งหมดไม่มีการเข้าสู่ระบบ ssh และฉันต้องการให้มีการเข้าถึงเพื่อเขียนเพื่อแชร์เครือข่าย

และนี่คือวิธีที่ฉันทำให้มันทำงาน:

ก่อนอื่นฉันสร้างผู้ใช้:

sudo useradd netdrive

จากนั้นแก้ไข/etc/passwdและทำให้แน่ใจว่ามี/bin/falseไว้สำหรับผู้ใช้ดังนั้นบรรทัดคือ:

netdrive:x:1001:1004:Net Drive User,,,:/home/netdrive:/bin/false

ฉันแก้ไข/etc/ssh/sshd_configเพื่อรวม:

Match User netdrive
  ChrootDirectory /home/netdrive
  ForceCommand internal-sftp
  AllowTcpForwarding no
  X11Forwarding no

เปลี่ยนเจ้าของโฮมไดเร็กตอรี่และการอนุญาต:

sudo chown root:root /home/netdrive/
sudo chmod 755 /home/netdrive/

ตกลงหลังจากทั้งหมดนี้ฉันสามารถเชื่อมต่อโดยใช้sshfsแต่ในโหมดอ่านอย่างเดียว สิ่งที่ฉันต้องทำเพื่อให้ได้โฟลเดอร์ที่เขียนได้:

sudo mkdir -p /home/netdrive/home/netdrive/
sudo chown netdrive:netdrive /home/netdrive/home/netdrive/
sudo chmod 755 /home/netdrive/home/netdrive/

นั่นคือมันทำงานได้โดยไม่มีการเปลี่ยนแปลงใด ๆ เพิ่มเติม โปรดทราบว่าฉันมีสิทธิ์ในการเขียนได้เฉพาะผู้ใช้ไม่ใช่กลุ่มอื่น ๆ ตามแนวทางออนไลน์อื่น ๆ ฉันสามารถสร้าง / ลบ / แก้ไข / เปลี่ยนชื่อไฟล์ / โฟลเดอร์ได้โดยไม่มีปัญหา

เมื่อเข้าถึงโดยใช้sshfsกับผู้ใช้netdriveเนื่องจากการกำหนดค่า chroot ฉันจะเห็นเฉพาะสิ่งที่เก็บไว้ใน/home/netdrive/ไดเรกทอรีของเซิร์ฟเวอร์ที่สมบูรณ์แบบ /home/netdrive/home/netdrive/โครงสร้างไดเรกทอรีซ้ำแล้วซ้ำอีกเป็นสิ่งที่ทำให้ฉันมีโซลูชันchroot ssh แบบเขียนได้ที่สะอาด

ตอนนี้ฉันจะอธิบายปัญหาที่ฉันมีด้านล่าง:

คุณไม่ควรรันย่อหน้าต่อไปนี้ :

หลังจากดูโซลูชันข้างต้น (และอื่น ๆ อีกมากมายบนเน็ตที่ใช้แม้แต่ acl (รายการควบคุมการเข้าถึง)) ฉันยังไม่สามารถใช้งานได้เพราะสิ่งที่ฉันทำต่อไปคือ:

ต่อไปนี้จะไม่ไม่ทำงานสำหรับฉัน:

sudo mkdir /home/netdrive/writable/
sudo chown netdrive:netdrive /home/netdrive/writable/
sudo chmod 755 /home/netdrive/writable/

เนื่องจากผู้ใช้netdriveยังคงไม่สามารถเขียนใน/home/netdrive/writable/ไดเรกทอรีนั้นแม้จะเป็นเจ้าของโฟลเดอร์และมีสิทธิ์ จากนั้นฉันก็ทำ: sudo chmod 775 / home / netdrive / เขียนได้ / และตอนนี้ฉันสามารถสร้างไดเรกทอรีและลบมันได้ แต่ฉันไม่สามารถแก้ไขได้เพราะมันถูกสร้างขึ้นโดยไม่มีสิทธิ์ในการเขียนกลุ่ม ที่นี่จากสิ่งที่ฉันเห็นในคนเน็ตใช้aclในการแก้ไข แต่ฉันไม่พอใจกับสิ่งนั้นเนื่องจากฉันต้องติดตั้งaclแล้วกำหนดค่าจุดเชื่อมต่อเป็นต้นนอกจากนี้ฉันไม่รู้ว่าทำไมฉันต้องได้รับอนุญาตจากกลุ่มเพื่อเขียนไปยังโฟลเดอร์ที่เป็นของผู้ใช้เดียวกัน

ดูเหมือนว่าด้วยเหตุผลบางอย่างในการสร้าง/home/netdrive/home/netdriveและให้สิทธิ์การเป็นเจ้าของnetdriveโฟลเดอร์สุดท้ายฉันสามารถทำให้ทุกอย่างทำงานได้โดยไม่ต้องยุ่งกับการอนุญาตกลุ่ม


1

ผมทำตามนี้บทความ แต่มันไม่ได้ทำงาน มันเริ่มทำงานหลังจากที่ฉันทำการเปลี่ยนแปลงนี้ (แนะนำในคำตอบข้างต้น):

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

บวกทำไดเรกทอรีบ้านรากเป็นเจ้าของซึ่งฉันมีไดเรกทอรีย่อยผู้ใช้เขียนได้ (ตามที่อธิบายไว้ข้างต้น)

สิ่งใหม่และมีประโยชน์ที่ฉันต้องการเพิ่มด้วยคำตอบนี้คือคุณสามารถทำให้การกำหนดค่าง่ายขึ้นเพียงแค่ระบุ% h เป็นโฮมไดเร็กตอรี่ของผู้ใช้:

ChrootDirectory %h

ฉันได้ค้นพบมันขอบคุณที่นี้การเชื่อมโยง

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