เปิดใช้งานการเข้าถึงเชลล์ SSH แต่ปิดใช้งานการเข้าถึง SFTP


21

ฉันค้นหาคำตอบที่เป็นไปได้สำหรับคำถามนี้และคำตอบส่วนใหญ่มีคำแนะนำว่าทำไมไม่ทำ อย่างไรก็ตามนี่คือสถานการณ์และสิ่งที่ทำให้จำเป็น:

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

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

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


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

3
นอกจากนี้คุณอาจต้องการพิจารณา "chrooting" ผู้ใช้ของคุณ และสำหรับการเข้าถึงข้อมูลอะไหล่ดูเหมือนว่าปัญหาการออกแบบ
Dennis Nolte

2
ใช้.profileสำหรับฟังดูเหมือนทางออกที่ผิด ฉันเชื่อว่าการตั้งค่าผู้ใช้ด้วยเชลล์สำรองจะทำให้เข้าใจได้ง่ายขึ้น
kasperd

3
อย่าพยายามใช้.profileเคล็ดลับเพื่อ จำกัด การเข้าถึงเนื่องจากเป็นเรื่องง่ายที่จะข้าม (ดูคำตอบของฉันสำหรับรายละเอียด)
Aleksi Torhamo

คำตอบ:


22

แก้ไข:

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

ตอนนี้เรายังคงคำตอบเดิม:


ใส่ความคิดเห็นออกการสนับสนุน sftp ใน sshd_config (และการรีสตาร์ทแน่นอนsshd):

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


1
บางครั้งบรรทัดอาจเป็นSubsystem sftp internal-sftp
Kondybas

1
ฉันมี Subsystem sftp /usr/libexec/sftp-server แต่นั่นก็หลอกลวงได้ ขอบคุณมาก
sosaisapunk

16
สิ่งนี้ไม่น่าเชื่อถือ หากคุณสามารถดำเนินการคำสั่งโดยพลการบนเซิร์ฟเวอร์คุณสามารถดำเนินการโปรแกรม sftp ฝั่งเซิร์ฟเวอร์ แม้ว่าจะไม่ได้ติดตั้งคุณสามารถนำกลับมาใช้ใหม่เป็นคำสั่งเชลล์แบบยาวและให้ไคลเอนต์ sftp ส่งคำสั่งนี้แทน sftp วิธีนี้อาจทำให้สะดวกในการใช้ SFTP น้อยลง แต่ไม่มีวิธีการป้องกันผู้ใช้ที่สามารถเรียกใช้คำสั่งโดยพลการจากการใช้คำสั่งเหล่านั้นเพื่อทำการถ่ายโอนไฟล์
..

1
@sosaisapunk นั่นไม่เป็นความจริง ผู้ใช้สามารถเรียกใช้คำสั่งใดก็ได้ที่พวกเขาต้องการโดยใช้ssh user@host commandเนื่องจาก.profileจะไม่สามารถทำงานได้เลยหากคุณทำเช่นนั้นและแอปของคุณจะไม่เริ่มเลย ssh -t user@host bashพวกเขาจะได้รับการเข้าถึงเปลือกเต็มรูปแบบโดยเพียงแค่บอกว่า ลองแล้วคุณจะเห็น ระบบย่อยเป็นเพียงนามแฝงคำสั่ง หากพวกเขาสามารถใช้ SFTP ก่อนหน้าพวกเขายังคงสามารถใช้มัน - และคำสั่งอื่น ๆ ที่พวกเขาต้องการ อ่านคำตอบของฉันด้านล่าง
Aleksi Torhamo

1
@ sosaisapunk: ไม่ประเด็นคือคุณสามารถทำได้ด้วย ssh แต่ไม่ใช่.profileเพราะมันไม่ได้มีไว้เพื่อความปลอดภัยและถูกเลี่ยงได้ง่าย ในคำตอบของฉันฉันแสดงสามวิธีต่าง ๆ ในการทำกับ ssh ในระยะสั้นเพียงแค่ย้ายการเรียกใช้แอพของคุณจาก.profileไปที่เชลล์สคริปต์และ 1) ตั้งค่าเชลล์สคริปต์เป็นเชลล์ของผู้ใช้ 2) ตั้งค่าเชลล์สคริปต์เป็น (จับคู่อย่างเหมาะสม) ForceCommandในsshd_config3) สลับเป็นการรับรองความถูกต้องของรหัสสาธารณะ เชลล์สคริปต์เป็นในcommand .ssh/authorized_keys(นอกจากนี้คุณควรใช้ @ name เพื่อให้ผู้คนได้รับการแจ้งเตือนความคิดเห็น)
Aleksi Torhamo

28

ตามที่คนอื่น ๆ กล่าวถึงการปิดใช้งานsftpไม่เพียงพอสำหรับทุกคน - ผู้ใช้ที่มีsshการเข้าถึงไม่ จำกัดสามารถดูไฟล์ใด ๆ ที่บัญชีของพวกเขามีสิทธิ์ดูสามารถแก้ไขสิ่งที่พวกเขาได้รับอนุญาตให้แก้ไขและสามารถดาวน์โหลดสิ่งที่พวกเขาสามารถอ่านได้เอง เครื่อง วิธีเดียวที่จะหยุดพวกเขาจากการทำเช่นนี้คือการ จำกัด การเข้าถึงของพวกเขา นอกจากนี้ยังไม่เหมาะที่.profileจะ จำกัด ผู้ใช้เนื่องจากไม่ใช่สำหรับ (แก้ไข: ตามที่ Aleksi ระบุไว้ในคำตอบของเขาจริง ๆ แล้วเป็นเรื่องไม่สำคัญที่จะเลี่ยงผ่าน.profileสิ่งที่เกี่ยวกับ.profileคือเพื่อความสะดวกไม่ใช่ความปลอดภัยดังนั้นจึงไม่ใช่ มีวัตถุประสงค์เพื่อ จำกัด ผู้ใช้ใช้สิ่งที่ออกแบบมาเพื่อความปลอดภัยเช่นเดียวกับสิ่งต่าง ๆ ด้านล่างเพื่อมอบความปลอดภัย)

มีสองวิธีพื้นฐานในการทำเช่นนี้: คุณสามารถ จำกัด พวกเขาผ่านการอนุญาตไฟล์หรือบังคับให้พวกเขารันแอพคอนโซลของคุณเท่านั้น วิธีที่สองดีกว่า: กำหนดผู้ใช้ที่ควร จำกัด แอพคอนโซลให้กับกลุ่ม (เช่นcustomers); จากนั้นในsshd_configเพิ่มบรรทัดต่อไปนี้:

Match Group customers
ForceCommand /path/to/app

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

ทางเลือก (อาจด้อยกว่า) จะเกี่ยวข้องกับการสร้างผู้ใช้ใหม่เพื่อเรียกใช้แอปคอนโซล จากนั้นคุณจะ จำกัด ไดเรกทอรีข้อมูลให้กับผู้ใช้นั้นตั้งค่าแอพคอนโซลที่ผู้ใช้นั้นเป็นเจ้าของและตั้งค่าu+sบนโปรแกรม นี่คือsetuidบิต; หมายความว่าคนที่รันโปรแกรมคอนโซลทำนั้นด้วยสิทธิ์ของเจ้าของโปรแกรม ด้วยวิธีการดังกล่าวผู้ใช้จะไม่สามารถเข้าถึงไดเรคทอรีได้ แต่จะรับผ่านทางโปรแกรมเท่านั้น แต่คุณอาจจะเพียงแค่ใช้ForceCommandเป็นที่ จำกัดทุกการเข้าถึง "เพียงแค่เรียกใช้โปรแกรมนี้"


4
ฉันต้องการเพิ่มที่ForceCommandไม่ป้องกันการส่งต่อพอร์ต SSH
nyuszika7h

1
ที่จริงแล้วการพึ่งพา.profileเป็นมากกว่า "ไม่เหมาะ"; มันข้ามง่าย (ดูคำตอบของฉันสำหรับรายละเอียด) และทำให้ไม่มีการป้องกันใด ๆ เพียงความปลอดภัยที่ผิดพลาด
Aleksi Torhamo

@AleksiTorhamo Ah ฉันสงสัยว่าคุณสามารถเลี่ยงได้ แต่ไม่แน่ใจว่าจะทำอย่างไร ขอบคุณสำหรับรายละเอียดเกี่ยวกับวิธี!
cpast

15

อย่าพยายามทำสิ่งนี้ด้วย.profileเพราะมันไม่ได้ให้ความปลอดภัยใด ๆ เลยและห้ามไม่ให้ทำอะไรเลย!

มันไม่สำคัญว่าสิ่งที่คุณใส่ใน.profileตั้งแต่คุณสามารถหลีกเลี่ยงได้โดยเพียงแค่ให้คำสั่งให้ทำงานในบรรทัดคำสั่ง SSH ssh user@host commandที่เป็นเช่นนี้ ssh -t user@host bashคุณยังสามารถได้รับการเข้าถึงเปลือกปกติโดยการทำ

การปิดใช้งานระบบย่อย sftp อย่างที่กล่าวไว้ในคำตอบอื่นนั้นไม่ได้ช่วยอะไรเลย ระบบย่อยเป็นหลักเพียงนามแฝงคำสั่งและคุณยังสามารถใช้ SFTP sftp -s /path/to/sftp-executable user@hostปกติโดยการทำ

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

  • ใช้ForceCommandในsshd_config
  • ใช้รหัสผ่านเข้าสู่ระบบและcommand="..."ใน.ssh/authorized_keys
  • เปลี่ยนเชลล์ของผู้ใช้เป็นสิ่งที่ จำกัด สิ่งที่ผู้ใช้สามารถทำได้

หมายเหตุ:

  • command="..." ใช้กับคีย์เดียวเท่านั้นดังนั้นจึงไม่ จำกัด การเข้าสู่ระบบ ssh สำหรับผู้ใช้โดยใช้รหัสผ่านหรือคีย์อื่น
  • คุณอาจต้องการ จำกัด การส่งต่อพอร์ตเป็นต้น (การส่งต่อพอร์ต, การส่งต่อ x11, การส่งต่อตัวแทนและการจัดสรร pty เป็นสิ่งที่ฉันเคยได้ยินมา)
    • AllowTcpForwarding ฯลฯ ใน sshd_config
    • no-port-forwarding ฯลฯ ใน .ssh/authorized_keys
  • หากคุณมี daemons อื่น ๆ (เช่น FTP) กำลังทำงานอยู่คุณควรตรวจสอบว่าพวกเขาไม่อนุญาตให้ผู้ใช้ใน (daemons บางตัวตัดสินใจตามเชลล์ของผู้ใช้ดังนั้นหากคุณเปลี่ยนคุณอาจต้องตรวจสอบอีกครั้ง)
  • คุณสามารถเปลี่ยนเชลล์ของผู้ใช้เป็นสคริปต์ที่ทำในสิ่งที่คุณต้องการ มันจะทำงานโดยไม่มีข้อโต้แย้งหรือชอบscript -c 'command-the-user-wanted-to-run'
  • ทั้งForceCommandและcommand="..."รันคำสั่งผ่านเชลล์ของผู้ใช้ดังนั้นจึงไม่ทำงานหากเชลล์ของผู้ใช้ถูกตั้งค่าเป็นเช่น /bin/falseหรือ/sbin/nologin

การปฏิเสธความรับผิดชอบ: ฉันไม่มีความเชี่ยวชาญในเรื่องใด ๆ ดังนั้นในขณะที่ฉันสามารถพูดได้ว่า.profileสิ่งที่ไม่ปลอดภัยฉันไม่สามารถสัญญาว่าไม่มี "gotcha" ด้วยวิธีการอื่นที่ฉันไม่รู้ เกี่ยวกับ พวกเขาปลอดภัยเท่าที่ฉันรู้ แต่ฉันจะไม่เป็นคนแรกที่ทำผิดบนอินเทอร์เน็ต


1
ดูเหมือนว่าอย่างน้อยสำหรับForceCommandและบังคับให้ล็อกอินแบบไม่ใช้รหัสผ่านด้วยcommand=ในauthorized_keysขณะที่ถูกข้ามไปก่อนหน้านี้เนื่องจากข้อผิดพลาดในเซิร์ฟเวอร์: มีไว้เพื่อความปลอดภัยต่อผู้ใช้ที่เป็นอันตรายและผู้ใช้ที่ผ่านนับเป็นช่องโหว่ร้ายแรง ในเซิร์ฟเวอร์ SSH (และเป็นวิธีแก้ไขลำดับความสำคัญ) ในขณะที่คุณชี้ให้เห็นว่า.profileสามารถข้ามได้โดยการออกแบบ: เนื่องจากมันไม่ถือเป็นคุณลักษณะด้านความปลอดภัยผู้ใช้ที่เลี่ยงผ่านก็จะสมบูรณ์แบบจากมุมมองของนักพัฒนาเชลล์
cpast

1
@cpast: ใช่ฉันกำลังคิดเกี่ยวกับคุณสมบัติเพิ่มเติมเช่นการส่งต่อพอร์ต ฉันหมายความว่าถ้าคุณไม่รู้ว่า ssh อนุญาตให้ส่งต่อพอร์ตและเพิ่งใช้ForceCommandเพื่อ จำกัด การเข้าถึงและมี daemon ที่เพียงฟังการเชื่อมต่อภายในเครื่องและไม่ทำการตรวจสอบสิทธิ์ผู้ใช้ ssh ยังคงสามารถเข้าถึง daemon ได้ คุณสมบัติที่ฉันระบุไว้นั้นเป็นคุณสมบัติเช่น โดยทั่วไปแล้วโฮสติ้งโซลูชั่น git จะปิดการใช้งานและฉันไม่ได้เห็นสิ่งที่ "ดูร้าย" เพิ่มเติมใด ๆ ใน manpages แต่ฉันยังไม่พบเจ้าหน้าที่ประเภทใดเลย "นี่เป็นวิธีที่คุณใช้ForceCommandอย่างปลอดภัย" - เอกสารเช่นกัน
Aleksi Torhamo

~/.profileผู้ใช้ยอมรับได้ว่าสามารถแก้ไขได้และไม่เป็นประโยชน์ต่อความปลอดภัย แต่คุณสามารถทำให้เทคนิคของ cpast มีความหมายโดยการใส่ลงไป/etc/profileหรือไม่? คุณสามารถตรวจสอบ UID เพื่อ จำกัด ผู้ใช้ที่เหมาะสม
ลูกไก่

1
@ ลูกไก่: ไม่มันมีปัญหาเดียวกันแน่นอน ปัญหาไม่ใช่ว่าไฟล์นั้นแก้ไขได้โดยผู้ใช้ ปัญหาคือไฟล์ทั้งสองสามารถข้ามได้ทั้งหมด ไฟล์จะใช้สำหรับล็อกอินเชลล์เท่านั้นซึ่งคุณจะได้รับถ้าคุณเพิ่งพูดssh user@hostแต่ถ้าคุณบอกให้ ssh รันคำสั่ง - เช่น ssh user@host command- คุณจะไม่ได้รับเชลล์ล็อกอินอีกต่อไปและไฟล์จะไม่ถูกแตะต้องเลย ดังนั้นคุณสามารถข้ามสิ่งเล็ก ๆ น้อย ๆ ที่มีคนพยายามสร้างไฟล์ด้วยข้อ จำกัด เพียงแค่ให้อาร์กิวเมนต์พิเศษกับ ssh
Aleksi Torhamo

2
@ ลูกไก่: นอกจากนี้ฉันเพิ่งตระหนักว่าคุณเรียก cpast; วิธีการในคำตอบของ cpast ไม่ได้ใช้.profileมันใช้sshd_configและควรปลอดภัย เขาเพียงกล่าวถึง.profileวิธีการที่คุณไม่ควรใช้ในการทำเช่นนี้
Aleksi Torhamo

1

เป็นไปได้ที่จะเปิดใช้งาน SSH และปิดการใช้งาน SFTP ทั้งแบบโกลบอลและต่อผู้ใช้ / กลุ่ม

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

ทั่วโลก

คุณสามารถปิดการใช้งาน SFTP สำหรับผู้ใช้ทั้งหมดได้สองวิธี

ระบบย่อยที่หายไป

SFTP daemon ที่ใช้โดย SSH สามารถกำหนดค่าผ่านSubsystemคีย์เวิร์ด จากsshd_config(5)คู่มือ:

Subsystem
        Configures an external subsystem (e.g. file transfer daemon).
        Arguments should be a subsystem name and a command (with optional
        arguments) to execute upon subsystem request.

        The command sftp-server(8) implements the “sftp” file transfer
        subsystem.

        Alternately the name “internal-sftp” implements an in-process
        “sftp” server.  This may simplify configurations using
        ChrootDirectory to force a different filesystem root on clients.

        By default no subsystems are defined.

บรรทัดสุดท้ายแสดงว่ามันควรจะเพียงพอที่จะไม่กำหนดระบบย่อยใด ๆ สำหรับ "sftp"

การโกหกที่ผิด ๆ

คุณสามารถปิดการใช้งาน SFTP โดยการตั้งค่า SFTP daemon ที่ใช้โดย SSH เป็นสิ่งที่ใช้ไม่ได้ ตัวอย่างเช่นกำหนดค่าระบบย่อย "sftp" เป็น/bin/false:

Subsystem sftp /bin/false

เมื่อสิ่งที่จะพยายามที่จะเข้าสู่ระบบผ่าน SFTP, SSH ภูตจะพยายามที่จะวางไข่ "ภูต /bin/falseSFTP" /bin/falseโปรแกรมไม่เพียงสิ่งเดียวเท่านั้นและนั่นคือการกลับรหัสข้อผิดพลาด ความพยายามในการเชื่อมต่อ SFTP ถูกปฏิเสธอย่างมีประสิทธิภาพ

ต่อผู้ใช้ / กลุ่ม

นอกจากนี้ยังสามารถปิดการใช้งาน 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

ในกรณีของฉันฉันต้องการอนุญาตการเข้าถึง MySQL เท่านั้น (ไม่อนุญาตให้ทั้ง SFTP เข้าถึงและหน้าต่างเทอร์มินัล SSH) สำหรับคีย์ที่ได้รับอนุญาตเฉพาะ (เช่นไม่มีการเปลี่ยนแปลงไฟล์ sshd_config) ฉันจัดการด้วยตัวเลือก ~ / .ssh / authorized_keys ต่อไปนี้สำหรับคีย์เฉพาะ: command = "/ usr / bin / echo 'อนุญาตให้เข้าถึง MySQL ได้เท่านั้น'", no-pty, no-X11-forwarding, permopen = "127.0.0.1:3306"
Martin_ATS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.