วิธีการปิดการใช้งานการส่งต่อพอร์ตท้องถิ่น SSH?


20

ฉันมีเซิร์ฟเวอร์ที่ใช้งาน Ubuntu และ OpenSSH daemon เรียกมันว่า S1

ฉันใช้เซิร์ฟเวอร์นี้จากเครื่องไคลเอนต์ (เรียกว่าหนึ่งในนั้นคือ C1) เพื่อทำอุโมงค์ย้อนกลับ SSH โดยใช้การส่งต่อพอร์ตระยะไกลเช่น:

ssh -R 1234:localhost:23 login@S1

บน S1 ฉันใช้ไฟล์ sshd_config เริ่มต้น จากสิ่งที่ฉันเห็นใครก็ตามที่มีข้อมูลประจำตัวที่ถูกต้อง {login, pwd} บน S1 สามารถเข้าสู่ S1 และทำการส่งต่อพอร์ตระยะไกลและการส่งต่อพอร์ตท้องถิ่น ข้อมูลประจำตัวดังกล่าวอาจเป็นใบรับรองในอนาคตดังนั้นในความเข้าใจของฉันใครก็ตามที่คว้าใบรับรองสามารถเข้าสู่ S1 ได้จากที่อื่น (ไม่จำเป็นต้อง C1) และด้วยเหตุนี้จึงสร้างการส่งต่อพอร์ตท้องถิ่น

สำหรับฉันการอนุญาตให้ส่งต่อพอร์ตในพื้นที่นั้นอันตรายเกินไปเนื่องจากอนุญาตให้สร้างพร็อกซีสาธารณะบางประเภท ฉันกำลังมองหาวิธีที่จะปิดการใช้งานการส่งต่อ -L เท่านั้น

ฉันลองสิ่งต่อไปนี้ แต่สิ่งนี้ปิดการใช้งานทั้งการส่งต่อภายในและระยะไกล:

AllowTcpForwarding No

ฉันได้ลองทำสิ่งต่อไปนี้แล้วจะอนุญาตเฉพาะ -L ถึง SX: 1 มันดีกว่าไม่มีอะไร แต่ก็ไม่ใช่สิ่งที่ฉันต้องการซึ่งเป็นตัวเลือก "ไม่มี"

PermitOpen SX:1

ดังนั้นฉันจึงสงสัยว่าจะมีวิธีใดบ้างหรือไม่ดังนั้นฉันจึงสามารถห้ามพอร์ตท้องถิ่นทั้งหมดให้ส่งต่อสิ่งที่ต้องการเขียน:

PermitOpen none:none

ต่อไปนี้เป็นความคิดที่ดีหรือไม่?

PermitOpen localhost:1

เช่นเคยให้ไปถึงรูทของสิ่งนี้: ปัญหาที่แท้จริงของคุณคืออะไรทำไมคุณต้องการตั้งค่าบางอย่างเช่นนี้สำหรับอุปกรณ์พกพา / อุปกรณ์ฝังตัวคุณต้องการแก้ไขอะไร
akira

ปัญหาที่จะแก้ไขที่นี่คือการสามารถเปิดเซสชัน Telnet ทุกที่จากอินเทอร์เน็ตไปยังอุปกรณ์มือถือ / ฝังตัวที่เชื่อมต่อกับอินเทอร์เน็ตโดยคำนึงถึงว่าอุปกรณ์อาจจะ NATed หรือไฟร์วอลล์จะไม่สามารถเข้าถึงได้ จากอินเทอร์เน็ต
SCO

telnet .. เพื่ออะไร สำหรับการเจาะรูลงในไฟร์วอลล์ google สำหรับ 'stun'
akira

คำตอบ:


16

ทุกคนที่มีข้อมูลประจำตัวในการเข้าสู่ระบบสามารถเรียกใช้อินสแตนซ์ของตนเองเป็น sshd ได้โดยทำงานบนพอร์ตสุ่มและอนุญาตสิ่งที่ต้องการรวมถึงการส่งต่อโลคัล -L:

% /usr/sbin/sshd -d -f mysshd.config -p 12345

หากคุณไม่ไว้วางใจผู้ใช้ที่จะทำอะไรกับเครื่องของคุณคุณไม่ควรอนุญาตให้พวกเขาเข้าสู่ระบบในครั้งแรก

(btw, แฟล็ก -D เป็นชนิด "proxy-problematic" เช่นกัน)


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

การใช้ ChrootDirectory สำหรับผู้ใช้นั้นจะทำการหลอกลวงและจะลอง!
SCO

1
ใน authorized_keys command="/sbin/nologin"ชุด สิ่งนี้ควรป้องกันไม่ให้รันคำสั่งใด ๆ บนเซิร์ฟเวอร์
justis

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

3
อ้างจากsshd_configหน้าคน: โปรดทราบว่าการปิดใช้งานการส่งต่อ TCP ไม่ได้ปรับปรุงความปลอดภัยเว้นแต่ว่าผู้ใช้จะปฏิเสธการเข้าถึงเชลล์ด้วยเนื่องจากพวกเขาสามารถติดตั้งตัวส่งต่อของตนเองได้ (เน้นเหมือง)
Kaz

17

โซลูชันอื่นจะอนุญาตให้ส่งต่อพอร์ตไปยังผู้ใช้ที่ระบุเท่านั้น:

จาก SSH: คำแนะนำที่ชัดเจน

การส่งต่อพอร์ตสามารถเปิดหรือปิดการใช้งานทั่วโลกใน sshd สิ่งนี้ทำกับคีย์เวิร์ดการกำหนดค่าทั่วทั้งเซิร์ฟเวอร์ AllowTcpForwarding ใน / etc / sshd_config คำหลักอาจมีค่าใช่ (ค่าเริ่มต้นการเปิดใช้งานการส่งต่อ) หรือไม่ (ปิดใช้งานการส่งต่อ):

# SSH1, SSH2, OpenSSH
AllowTcpForwarding no

นอกจากนี้ SSH2 มีตัวเลือกต่อไปนี้:

# SSH2 only
AllowTcpForwardingForUsers
AllowTcpForwardingForGroups

ไวยากรณ์ของสิ่งเหล่านี้เป็นเช่นเดียวกับตัวเลือก AllowUsers และ AllowGroups [ส่วน 5.5.2.1, "การควบคุมการเข้าถึงบัญชี"] พวกเขาระบุรายชื่อผู้ใช้หรือกลุ่มที่ได้รับอนุญาตให้ใช้การส่งต่อพอร์ต เซิร์ฟเวอร์ปฏิเสธที่จะให้เกียรติต่อการส่งต่อพอร์ตสำหรับคนอื่น โปรดทราบว่าสิ่งเหล่านี้อ้างถึงบัญชีเป้าหมายของเซสชัน SSH ไม่ใช่ชื่อผู้ใช้ไคลเอ็นต์ (ซึ่งมักไม่เป็นที่รู้จัก)

...

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


1
โดยทั่วไปฉันจะมีผู้ใช้เพียงคนเดียวที่เตรียมไว้บน S1 AFAIU ในกรณีเฉพาะนี้การใช้ AllowTcpForwardingForUsers / AllowTcpForwardingForGroups จะไม่ทำการหลอกลวงใช่ไหม? การห้ามลงชื่อเข้าใช้แบบโต้ตอบเป็นความคิดที่ดีเนื่องจากจะทำให้ผู้ใช้ไม่สามารถเริ่มไบนารีได้ แต่ลูกค้าจะยังคงได้รับอนุญาตให้ใช้โดยใช้ไวยากรณ์ -L ใช่ไหม ดังนั้นสำหรับตอนนี้ตัวเลือกที่ดีที่สุดคือ: 1 / ปิดการใช้งานการเข้าสู่ระบบแบบโต้ตอบ 2 / PermitOpen ด้วยชื่อโฮสต์ปลอม: พอร์ต ฉันพลาดอะไรไปหรือเปล่า?
SCO

วิธีที่ดีที่สุดในการตรวจสอบสิ่งนี้คือการลองตั้งค่า
Christian

ฉันไม่เห็นตัวเลือกเหล่านี้ในซอฟต์แวร์ OpenSSH ฟรี google สำหรับAllowTcpForwardingForUsersเปิดเผยว่ามีการกำหนดค่าในsshd2_configซึ่งใช้ในบางโปรแกรมเชิงพาณิชย์ ดูหนึ่งในคำตอบสำหรับ: superuser.com/questions/384643/…
Kaz

^ OpenSSH มีMatchบล็อกในการกำหนดค่า คุณสามารถMatchกับผู้ใช้และกลุ่มและใส่AllowTcpForwardingภายใน
Kaz

2

ขณะนี้มีตัวเลือกให้อนุญาตเฉพาะการส่งต่อภายใน / ระยะไกล

AllowTcpForwarding ระบุว่าอนุญาตให้ส่งต่อ TCP ได้หรือไม่ ตัวเลือกที่มีคือ“ ใช่” หรือ“ ทั้งหมด” เพื่ออนุญาตการส่งต่อ TCP,“ ไม่” เพื่อป้องกันการส่งต่อ TCP ทั้งหมด,“ ท้องถิ่น” เพื่ออนุญาตให้ท้องถิ่น (จากมุมมองของ ssh (1)) การส่งต่อเท่านั้นหรือ “ ระยะไกล” เพื่ออนุญาตระยะไกล ส่งต่อเท่านั้น ค่าเริ่มต้นคือ“ ใช่” โปรดทราบว่าการปิดใช้งานการส่งต่อ TCP ไม่ได้ปรับปรุงความปลอดภัยนอกจากว่าผู้ใช้จะปฏิเสธการเข้าถึงเชลล์ด้วยเนื่องจากผู้ใช้สามารถติดตั้งตัวส่งต่อของตนเองได้

ดังนั้นตามที่ระบุไว้แล้วคุณควรตั้งค่าเปลือกเป็น nologin เช่นกัน


0

วิธีแก้ไขปัญหานี้ของฉันคือการเพิ่ม: PermitOpen fo.local: 80ในส่วนหลักของ sshd_config

สิ่งนี้จะปฏิเสธคำขอใด ๆ ของการส่งต่อท้องถิ่นนอกเหนือจาก fo.local: 80


0

ฉันกำลังมองหาวิธีที่จะปิดการใช้งานการส่งต่อ -L เท่านั้น

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

"การส่งต่อโลคัลพอร์ต" ที่อนุญาตโดย SSH เป็นเพียงหนึ่งในวิธีที่เป็นไปได้ในการทำเช่นนั้น อื่น ๆ รวมถึงการเปิดตัวตัวอย่างของsocat, netcatหรือหมายเลขอื่น ๆ ของเครื่องมือ

วิธีที่ดีที่สุดในการควบคุมการเชื่อมต่อขาออกและการเชื่อมต่อขาเข้าใน Linux คือ Netfilter หรือที่รู้จักในชื่อ IPTables

มันมีโมดูลพิเศษที่เรียกว่า owner ( ipt_owner) ซึ่งช่วยให้คุณจับคู่ลักษณะต่าง ๆ ของผู้สร้างแพ็กเก็ตสำหรับแพ็กเก็ตที่สร้างขึ้นในเครื่อง มันถูกต้องในOUTPUTและPOSTROUTINGโซ่

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

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