วิธีการปิดการใช้งาน SFTP สำหรับผู้ใช้บางคน แต่ยังคงเปิดใช้งาน ssh?


12

โครงการของฉันต้องการให้ฉันปิดการใช้งาน SFTP สำหรับผู้ใช้บางคน แต่ผู้ใช้เหล่านั้นยังคงต้องเชื่อมต่อผ่าน ssh ไม่มีใครรู้วิธีการใช้งานนี้

ฉันเห็นคำแนะนำให้เปลี่ยนไฟล์ที่/etc/ssh/sshd_configแต่ไม่แน่ใจว่าจะเปลี่ยนแปลงอะไร


วิธีเดียวที่ฉันสามารถจินตนาการได้ว่าทำเช่นนี้คือการใช้นโยบาย MLS ใน SELinux และ จำกัด ว่าไฟล์ไดเรกทอรีและซ็อกเก็ตที่บุคคลสามารถเข้าถึงดำเนินการได้ ฯลฯ ฉันจะทำเช่นนี้ร่วมกับนโยบาย iptables ที่เข้มงวดสูงซึ่งใช้ โมดูลownerสำหรับการเข้าถึงขาออก สิ่งนี้ถือว่าคุณกำลังจะได้รับการทดสอบปากกาโดยทีมสีแดง หากทุกคนที่เข้าถึงระบบของคุณปฏิบัติตามกฎและไม่เคยมีเจตนาร้ายวิธีการของฉันจะหนักและซับซ้อนเกินไป
แอรอน

คำตอบ:


7

โดยทั่วไปแล้วการทำเช่นนี้เป็นการรักษาความปลอดภัยที่ไม่ดีด้วยเหตุผลที่คนอื่น ๆ ระบุ อย่างไรก็ตามฉันคิดว่าจุดที่ได้รับมอบหมายของคุณคือการสอนคุณว่าคุณสามารถมีส่วนกำหนดเงื่อนไขตามเกณฑ์ต่าง ๆ ได้

วิธีการทำเช่นนี้คือการใช้Matchบล็อกแบบมีเงื่อนไข *

Match User bob
Subsystem   sftp  /bin/false

ดูsshd_config(5)ภายใต้ส่วนสำหรับข้อมูลเพิ่มเติมและการจับคู่ในMatchGroup

* มีมากกว่าหนึ่งวิธีที่จะทำ


7
มันไม่ทำงานสำหรับฉัน ข้อผิดพลาด: Directive 'Subsystem' ไม่ได้รับอนุญาตภายในบล็อก Match
ChrW

คำตอบที่ไม่ถูกต้องเนื่องจากระบบย่อยไม่ได้รับอนุญาตในการจับคู่บล็อก
mikep

6

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

ตัวอย่างเช่นคุณสามารถดาวน์โหลด / etc / passwd ผ่าน ssh โดยใช้วิธีการต่อไปนี้ (ไม่จำเป็นต้องใช้เซสชัน scp / sftp): ssh foo@bar.com "cat / etc / passwd"> passwdcopy

หากคุณสามารถเห็นมันบนหน้าจอของคุณผ่าน SSH จากนั้นคุณสามารถคัดลอกมันเป็นไฟล์

วิธีเดียวที่จะทำให้เข้าใจได้คือถ้าคุณมีเชลล์ จำกัด แบบกำหนดเองที่บังคับใช้นโยบายความปลอดภัย

อย่างไรก็ตามการผกผันของสิ่งนี้เหมาะสม (ปิดการใช้งานเชลล์ ssh แต่เปิดใช้งานการเปิดใช้งาน scp / sftp) เนื่องจากคุณไม่สามารถเรียกใช้คำสั่งโดยพลการผ่าน sftp / scp ที่คุณสามารถทำได้ผ่านเชลล์ ssh

PS: ฉันสมมติว่าเชลล์ SSH ที่คุณให้สิทธิ์เป็นเชลล์มาตรฐานที่อนุญาตการดำเนินการโดยพลการ หากไม่ใช่กรณีนี้ให้ดูสิ่งนี้: วิธีปิดการใช้งานระบบย่อย sftp สำหรับผู้ใช้หรือกลุ่มเฉพาะได้อย่างไร และดูที่ตัวเลือกการตั้งค่าระบบย่อยของ sshd_config


4
Match Group nosft
Subsystem   sftp  /bin/false

ฉันชอบที่จะใช้กลุ่มสำหรับสิ่งนี้

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


3
Directive 'Subsystem' is not allowed within a Match block
Patryk

คำตอบที่ไม่ถูกต้องเนื่องจากระบบย่อยไม่ได้รับอนุญาตในการจับคู่บล็อก
mikep

4

เป็นไปได้ที่จะเปิดใช้งาน SFTP ทั่วโลกและปิดการใช้งาน SFTP สำหรับผู้ใช้บางคนเท่านั้น

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

ฉันต้องการสิ่งนี้เป็นการส่วนตัวเพราะฉันต้องการให้สิทธิ์การเข้าถึงที่เก็บ git บน SSH และฉันชอบที่จะปิดการใช้งานระบบที่ไม่จำเป็น ในกรณีนั้นไม่จำเป็นต้องใช้ SFTP

การจับคู่

เพื่อให้ตรงกับชุดของผู้ใช้คุณสามารถกำหนดค่า SSH กับMatchคำหลัก จากsshd_config(5)คู่มือ:

Match
        ...

        The arguments to Match are one or more criteria-pattern pairs or the
        single token All which matches all criteria.  The available criteria
        are User, Group, Host, LocalAddress, LocalPort, and Address.  The
        match patterns may consist of single entries or comma-separated
        lists and may use the wildcard and negation operators described in
        the PATTERNS section of ssh_config(5).

        ...

ตัวอย่างสองตัวอย่าง:

  • Match User eva ตรงกับผู้ใช้ "eva"
  • Match User stephen,maria ตรงกับผู้ใช้ "stephen" และ "maria"
  • Match Group wheel,adams,simpsons ตรงกับกลุ่ม "wheel", "adams", "simpsons"

หากคุณต้องการข้อมูลเพิ่มเติมมีโหลดอยู่ในsshd_config(5)คู่มือ

คำสั่งบังคับ

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

คำสั่งเพื่อบังคับสามารถกำหนดค่าด้วยForceCommandคำสำคัญ จาก sshd_config(5)คู่มือ:

ForceCommand
        Forces the execution of the command specified by ForceCommand,
        ignoring any command supplied by the client and ~/.ssh/rc if
        present.  The command is invoked by using the user's login shell
        with the -c option.  This applies to shell, command, or subsystem
        execution.  It is most useful inside a Match block.  The command
        originally supplied by the client is available in the
        SSH_ORIGINAL_COMMAND environment variable.  Specifying a command of
        “internal-sftp” will force the use of an in-process sftp server that
        requires no support files when used with ChrootDirectory.  The
        default is “none”.

ดังนั้นคุณสามารถบังคับคำสั่ง จำกัด ForceCommand <your command>ที่คุณต้องการใช้ ตัวอย่างเช่น:

Match User kim
        ForceCommand echo 'successful login man, congrats'

ตัวอย่าง

git-shellในกรณีของฉันที่ฉันต้องการที่จะให้การเข้าถึงคอมไพล์ผมจะต้องให้ผู้ใช้มีการเข้าถึง นี่คือส่วนที่ปิดใช้งาน SFTP สำหรับผู้ใช้ git ของฉันพร้อมด้วยตัวเลือกความปลอดภัยบางส่วน:

Match Group git

        # have to do this instead of setting the login shell to `git-shell`,
        # to disable SFTP
        ForceCommand /usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"

        # disable stuff we don't need
        AllowAgentForwarding no
        AllowTcpForwarding no
        AllowStreamLocalForwarding no
        PermitOpen none
        PermitTunnel no
        PermitTTY no
        X11Forwarding no

1
นี้ไม่ได้ตอบคำถามของ OP แต่มันเป็นประโยชน์มากสำหรับผมที่จะบรรลุสิ่งที่ฉันต้องการที่จะประสบความสำเร็จในกรณีการใช้งานของตัวเอง
Kidburla

ฉันไม่เห็นด้วย คำถามของ OP คือ "วิธีปิดใช้งาน sftp สำหรับผู้ใช้บางคน แต่เปิดใช้งาน ssh ต่อไป" และคำตอบนี้จะอธิบายวิธีหนึ่งในการทำเช่นนั้น ดีใจที่คุณพบว่ามันมีประโยชน์อยู่ดี!
aude

ด้วยการยอมรับของคุณเองมัน "ไม่ทำงานถ้าคุณต้องการให้ผู้ใช้ของคุณได้รับคำสั่งเชลล์ปกติ" ดังนั้นจึงไม่เป็นไปตามข้อกำหนดของ OP ของ "เปิดใช้งาน Keep ssh"
Kidburla

นั่นเป็นจุดที่ดี ฉันเดาว่าฉันคงเห็นด้วยกับวิธีแก้ปัญหานี้เพราะ "และมันก็ไม่สมเหตุสมผลเพราะคุณสามารถหลีกเลี่ยงสิ่งต่าง ๆ ส่วนใหญ่ได้หากคุณสามารถเข้าถึงเชลล์ได้ แต่ฉันไม่พบวิธีที่จะให้สิ่งที่ OP ถามฉันเห็นด้วยตอนนี้
aude

นี่คือเวอร์ชันเต็มของคำตอบนี้: serverfault.com/a/817482
aude

1
Match User bob
MaxSessions 0

ผ่านการทดสอบและทำงานบน CentOS 6.6 โปรดทราบว่าระบบย่อยไม่ได้รับอนุญาตให้จับคู่อย่างน้อยกับ CentOS รุ่นใหม่กว่า manpage สำหรับ sshd_config แสดงรายการคำค้นหาแบบ จำกัด ที่ได้รับอนุญาตด้วยเงื่อนไขการจับคู่


0

คุณสามารถดูscponlyเพื่อทำย้อนกลับอนุญาตเฉพาะ scp / sftp แต่ไม่มีการเข้าถึงเชลล์

ฉันเห็นด้วยกับ @Nathan ด้านบนนี่ไม่สมเหตุสมผลเลย หากคุณตายไปให้ลองแก้ไขไฟล์ / etc / ssh / sshd_config ของคุณแล้วลบ / ใส่เครื่องหมายบรรทัดต่อไปนี้:

ระบบย่อย sftp / usr / libexec / openssh / sftp-server


0

ไม่ให้ไดเรกทอรีบ้านสำหรับผู้ใช้

usermod username -d /bin/false

เปลี่ยนระบบย่อย sftp / usr / libexec / openssh / sftp-server ในไฟล์ / etc / ssh / sshd_config เป็นระบบย่อย sftp / dev / null / usr / libexec / openssh / sftp-server

จากนั้นรีสตาร์ท ssh

service ssh restart

มันทำงานได้สำหรับฉันเดเบียน


-2

ในการ~/authorized_keyกำหนดค่ารหัสผู้ใช้ดังต่อไปนี้:

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