เป็นไปได้หรือไม่ที่จะให้สิทธิ์การเข้าถึง sftp แก่ผู้ใช้โดยไม่มีการเข้าถึงเชลล์? ถ้าใช่มันจะถูกนำไปใช้อย่างไร?


29

ฉันมีอาร์เรย์ของผู้ใช้ที่ต้องการเพียงแค่อัปโหลดไฟล์ไปยังที่ตั้งของพวกเขา ฉันคิดว่า sftp จะเพียงพอ แต่ฉันไม่ต้องการให้พวกเขาเข้าสู่ระบบผ่านเชลล์ เป็นไปได้เหรอ? แพลตฟอร์มของฉันคือ centos 7, homedirs ของผู้ใช้จะถูกเก็บไว้ให้พูด / ส่วนตัว / $ ผู้ใช้

ฉันสร้างผู้ใช้ด้วยการตั้งค่าเหล่านี้

useradd -m -d /personal/user1 -s /sbin/nologin

ผู้ใช้ที่ได้รับมอบหมาย passwd จากนั้นเมื่อฉันใช้ sftp เพื่อเข้าสู่เครื่องก็บอกว่าไม่สามารถเชื่อมต่อ


scponly github.com/scponly/scponly/wiki chroot เป็นตัวเลือก
user2497

คำตอบ:


11

แก้ไขของคุณที่/etc/ssh/sshd_configจะมี:

Match User [SFTP user]
ForceCommand internal-sftp

sshdเริ่มต้นใหม่ หากคุณมีผู้ใช้หลายคนให้พวกเขาทั้งหมดในบรรทัดที่ตรงกับผู้ใช้คั่นด้วยเครื่องหมายจุลภาคดังนี้:

Match User User1,User2,User3

กุญแจสำคัญในการกำหนดค่าsftpให้ไม่อนุญาตให้เข้าถึงเชลล์คือ จำกัด ผู้ใช้ผ่านForceCommand ตัวเลือก


ตกลงฉันทำตามทุกขั้นตอน แต่ไม่ได้เข้าสู่ระบบ
Sollosa

2
@Sollosa ลองด้วยMatch User [SFTP user] ForceCommand internal-sftpเท่านั้นโดยไม่ต้อง chrooting
Martin Prikryl

@MartinPrikryl ใช้งานได้กับมาร์ตินขอบคุณฉันเพิ่งลบพารามิเตอร์ chrootdirectory &
v iola

1
ยิ่งไปกว่านั้นคุณสามารถchrootผู้ใช้งานได้เพื่อที่พวกเขาจะไม่สามารถเลื่อนขึ้นและออกจาก "คุก" ที่คุณกำหนดไว้ได้
ivanivan

37

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

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

การตั้งค่า

ติดตั้งซอฟต์แวร์ (เป็นทางเลือก แต่มีประโยชน์):

yum install members   # or apt install members

เพิ่มกลุ่ม:

addgroup --system allowssh
addgroup --system sftponly

ใน/etc/ssh/sshd_configตรวจสอบให้แน่ใจว่าการตั้งค่าต่อไปนี้คือNo:

PermitRootLogin no
PubkeyAuthentication no
PasswordAuthentication no

และในตอนท้าย/etc/ssh/sshd_configเพิ่มสองบทนี้:

Match Group allowssh
    PubkeyAuthentication yes

Match Group sftponly
    ChrootDirectory %h
    X11Forwarding no
    AllowTcpForwarding no
    ForceCommand internal-sftp

(อย่าลืมรีสตาร์ท SSH หลังจากแก้ไขไฟล์)

คำอธิบาย

ดังนั้นทั้งหมดนี้ทำอะไร?

  • มันปิดใช้งานการเข้าสู่ระบบรูทเสมอซึ่งเป็นมาตรการรักษาความปลอดภัยเพิ่มเติม
  • มันปิดการใช้งานการเข้าสู่ระบบด้วยรหัสผ่านเสมอ (รหัสผ่านที่อ่อนแอมีความเสี่ยงสูงสำหรับเซิร์ฟเวอร์ที่ใช้ sshd)
  • อนุญาตการล็อกอิน (pubkey) สำหรับผู้ใช้ในallowsshกลุ่มเท่านั้น
  • ผู้ใช้ในsftponlyกลุ่มไม่สามารถรับเชลล์ผ่าน SSH เพียง SFTP

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

# adduser marcelm allowssh
# members allowssh
marcelm
# deluser marcelm allowssh
# members allowssh
#

โปรดทราบว่าผู้ใช้ SFTP ของคุณจะต้องเป็นสมาชิกของทั้งคู่sftponly(เพื่อให้แน่ใจว่าพวกเขาจะไม่ได้รับเชลล์) และจากallowssh(เพื่ออนุญาตการเข้าสู่ระบบในตอนแรก)

ข้อมูลเพิ่มเติม

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

    หากคุณไม่ต้องการสิ่งนี้จริงๆแล้วเพิ่มPasswordAuthentication yesไปยังMatch Group allowsshบทที่ สิ่งนี้จะช่วยให้ pubkey และ password auth สำหรับallowsshผู้ใช้งาน

  2. การกำหนดค่านี้ จำกัดsftponlyผู้ใช้ใด ๆไปยังไดเรกทอรีบ้านของพวกเขา หากคุณไม่ต้องการให้เอาChrootDirectory %hคำสั่งนั้นออก

    หากคุณไม่ต้องการ chrooting ไปทำงานก็เป็นสิ่งสำคัญที่ไดเรกทอรีบ้านของผู้ใช้ (และไดเรกทอรีใด ๆ ข้างต้นนั้น) เป็นเจ้าของroot:rootและไม่สามารถเขียนโดยกลุ่ม / อื่น ๆ ไม่เป็นไรสำหรับไดเรกทอรีย่อยของโฮมไดเร็กตอรี่ที่ผู้ใช้เป็นเจ้าของและ / หรือสามารถเขียนได้

    ใช่ไดเรกทอรีภายในบ้านของผู้ใช้จะต้องเป็นเจ้าของโดยผู้ใช้ น่าเศร้าที่มีเหตุผลที่ดีสำหรับข้อ จำกัด นี้ ขึ้นอยู่กับสถานการณ์ของคุณChrootDirectory /homeอาจเป็นทางเลือกที่ดี

  3. การตั้งค่าเชลล์ของsftponlyผู้ใช้/sbin/nologinไม่จำเป็นหรือไม่เป็นอันตรายสำหรับโซลูชันนี้เนื่องจาก SSH ForceCommand internal-sftpแทนที่เชลล์ของผู้ใช้

    การใช้/sbin/nologinอาจเป็นประโยชน์ในการหยุดพวกเขาเข้าสู่ระบบด้วยวิธีอื่น ๆ (ทางกายภาพ, samba, ฯลฯ ) แม้ว่า

  4. การตั้งค่านี้ไม่อนุญาตให้rootล็อกอินโดยตรงผ่าน SSH สิ่งนี้ก่อให้เกิดความปลอดภัยเพิ่มขึ้นอีกระดับ หากคุณจริงๆไม่จำเป็นต้องเข้าสู่ระบบรากโดยตรงเปลี่ยนPermitRootLoginคำสั่ง พิจารณาการตั้งค่าให้forced-commands-only, prohibit-passwordและ yes(เป็นที่พึ่งสุดท้าย)

  5. สำหรับคะแนนโบนัสให้ดูที่การ จำกัด ใครสามารถsuรูทได้ เพิ่มกลุ่มระบบที่เรียกว่าwheel, และเพิ่ม / เปิดในauth required pam_wheel.so/etc/pam.d/su


2
นี่ควรเป็นคำตอบที่ยอมรับได้ มันให้ทางออกเช่นเดียวกับการทำลายเหตุผลที่อยู่เบื้องหลังในแต่ละขั้นตอน
kemotep

1
นี่เป็นคำตอบที่ดีมากพร้อมคำแนะนำด้านความปลอดภัยเพิ่มเติม แต่ฉันกังวลสำหรับผู้ใช้ที่ระบบพึ่งพาการล็อกอินรหัสผ่านการล็อกอินรูท ฯลฯ แน่นอนว่าการทำเช่นนั้นไม่ดี แต่อาจย้ายการเปลี่ยนแปลงที่เกี่ยวข้องกับการปรับปรุงความปลอดภัยทั่วไป ส่วนของตัวเองเพื่อให้คำตอบสำหรับคำถามที่มีการเปลี่ยนแปลงน้อยที่สุด?
Josh Rumbut

1
@JoshRumbut ฉันไม่ต้องการที่จะเขียนคำตอบสำหรับข้อสังเกตของคุณ (ถูกต้อง) ส่วนหนึ่งเป็นเพราะมันเพิ่งแสดง My Way ™และส่วนหนึ่งหวังว่ามันจะเป็นเซ็ตอัพ SSH มาตรฐานที่ปลอดภัยโดยค่าเริ่มต้น ตัวอย่างที่ผู้คนจำนวนมากพบว่ามีประโยชน์ เมื่อมีการประนีประนอมผมพยายามที่จะทำให้มันเป็นที่ชัดเจนมากว่าเข้าสู่ระบบรากและรับรองความถูกต้องรหัสผ่านจะไม่ทำงานและผมรวมคำแนะนำวิธีการเปิดใช้งานพวกเขา :)
marcelm

1
คำตอบที่ดี imo ข้อบกพร่องที่ใหญ่ที่สุดของคำตอบอื่น ๆ ที่ไม่ได้คำนึงถึงความปลอดภัยด้านบัญชีส่วนใหญ่ chroot +1
Rui F Ribeiro

1
Chroot จะไม่ทำงานกับ% h ทั่วไป น่าแปลกที่คุณต้องchown root:rootและchmod og-w
kubanczyk

1

เพียงแค่เปลี่ยนเปลือกเริ่มต้นเป็น / sbin / nologin สมมติว่า Linux ส่วนใหญ่มีความหลากหลาย:

# usermod -s /sbin/nologin username

ฉันลองแล้ว แต่ผู้ใช้ไม่สามารถลงชื่อเข้าใช้ผ่าน sftp ได้ฉันไม่ทราบสาเหตุ ฉันใช้ centos btw
Sollosa

@Sollosa อาจเป็นปัญหาการอนุญาตใน sftp chroot ของคุณหรือ sshd_config มีปัญหา คุณควรอัปเดตคำถามของคุณเพื่อรวมสิทธิ์ของไดเรกทอรี chroot ของคุณและ sshd_config ของคุณด้วยข้อมูลที่ละเอียดอ่อนใด ๆ ที่ทำซ้ำ
Kefka

ฉันเชื่อ (แม้ว่าฉันไม่สามารถทดสอบได้ในตอนนี้) ว่านี่จะอนุญาตให้ SFTP เฉพาะในกรณีที่มีSubsystem sftp internal-sftp) (หรืออาจจะForceCommand internal-sftp) หากมีร่วมกันSubsystem sftp /path/to/sftp-server, nologinจะป้องกันไม่ให้แม้แต่ SFTP
Martin Prikryl

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

ดูคำตอบของฉันที่OpenSSH: ความแตกต่างระหว่าง internal-sftp และ sftp-server (โดยเฉพาะตอนท้าย)
Martin Prikryl

0

คุณสามารถใช้ tftp อะไรที่เกิน ssh จะต้องมีการรับรองความถูกต้องบางส่วน (key | pass)

ในขณะที่ tftp สามารถรักษาความปลอดภัยได้มันอาจคุ้มค่าที่จะทบทวนการตัดสินใจในการเข้าถึงสิ่งอื่นโดยไม่ต้องมีการตรวจสอบสิทธิ์

http://manpages.ubuntu.com/manpages/bionic/man1/tftp.1.html


2
ฉันคิดว่า OP ต้องการผู้ใช้ (ผู้ที่มีชื่อผู้ใช้และรหัสผ่าน) จะไม่สามารถใช้ไคลเอ็นต์ SSH ปกติเพื่อเชื่อมต่อกับเซิร์ฟเวอร์และดำเนินการคำสั่งโดยพลการ แต่ผู้ใช้เหล่านั้นสามารถอัปโหลดไฟล์ผ่าน SFTP ได้
John_ReinstateMonica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.