TL; DR - ไปที่ด้านล่างของคำตอบ "การใช้ข้อ จำกัด "
การเพิ่มผู้ใช้ที่ถูก จำกัด ประกอบด้วยสองส่วน: 1. การสร้างผู้ใช้ 2. การกำหนดค่า SSH daemon (sshd)
การกำหนดค่า sshd
สถานที่ที่ดีที่สุดในการทำความรู้จักกับความเป็นไปได้ของ SSH คือการอ่านหน้าคู่มือที่เกี่ยวข้อง:
ไคลเอ็นต์ SSH สามารถดำเนินการได้ที่ไหน
ก่อนที่คุณจะสามารถ จำกัด บางสิ่งได้คุณต้องทราบคุณสมบัติของ SSH การคายผ่านหน้าเพจด้วยตนเองให้ผลตอบแทน:
- เชลล์สั่งการทำงาน
- อัพโหลดไฟล์ผ่าน sftp
- การส่งต่อพอร์ต
- ไคลเอ็นต์ส่งต่อพอร์ตที่ใช้ (un) ไปยังเซิร์ฟเวอร์
- เซิร์ฟเวอร์ส่งต่อพอร์ตไปยังลูกค้า
- เซิร์ฟเวอร์ส่งต่อพอร์ตของโฮสต์อื่นไปยังไคลเอนต์ (proxy-ish)
- การส่งต่อ X11 (การแสดงการส่งต่อ)
- ตัวแทนการตรวจสอบการส่งต่อ
- การส่งต่อของอุปกรณ์อุโมงค์
จากส่วนการรับรองความถูกต้องของหน้าคู่มือของ sshd (8) :
หากไคลเอ็นต์พิสูจน์ตัวตนได้สำเร็จจะมีการป้อนไดอะล็อกสำหรับการเตรียมเซสชัน ในขณะนี้ไคลเอนต์อาจร้องขอสิ่งต่าง ๆ เช่นการ
จัดสรรการหลอกส่งต่อการเชื่อมต่อ X11 การส่งต่อการเชื่อมต่อ TCP หรือการส่งต่อการเชื่อมต่อตัวแทนการรับรองความถูกต้องผ่านช่องทางที่ปลอดภัย
หลังจากนี้ลูกค้าทั้งขอเปลือกหรือการดำเนินการของคำสั่ง ด้านข้างจากนั้นเข้าสู่โหมดเซสชั่น ในโหมดนี้ทั้งสองข้างอาจส่งข้อมูลได้ตลอดเวลาและข้อมูลดังกล่าวจะถูกส่งต่อไปยัง / จากเชลล์หรือคำสั่งทางฝั่งเซิร์ฟเวอร์และเทอร์มินัลผู้ใช้ในฝั่งไคลเอ็นต์
ตัวเลือกสำหรับการ จำกัด คุณสมบัติ SSH
ไฟล์และตัวเลือกที่เปลี่ยนแปลงพฤติกรรมคือ:
~/.ssh/authorized_keys
- มีคีย์ที่ได้รับอนุญาตให้เชื่อมต่อซึ่งสามารถเลือกได้:
command="command"
- คำสั่งที่จัดทำโดยผู้ใช้ (ถ้ามี) จะถูกละเว้น โปรดทราบว่าลูกค้าอาจระบุ TCP และ / หรือส่ง X11 จนกว่าพวกเขาจะไม่ได้รับอนุญาตอย่างชัดเจน โปรดทราบว่าตัวเลือกนี้ใช้กับการดำเนินการของเชลล์คำสั่งหรือระบบย่อย
no-agent-forwarding
- ห้ามตัวแทนการรับรองความถูกต้องส่งต่อเมื่อใช้คีย์นี้สำหรับการรับรองความถูกต้อง
no-port-forwarding
- ห้ามการส่งต่อ TCP เมื่อใช้คีย์นี้เพื่อการตรวจสอบสิทธิ์
no-X11-forwarding
- "ห้าม X11 ส่งต่อเมื่อคีย์นี้ใช้สำหรับการตรวจสอบสิทธิ์"
permitopen="host:port"
- จำกัด การส่งต่อพอร์ต 'ssh -L' บนโลคัลเพื่อให้สามารถเชื่อมต่อกับโฮสต์และพอร์ตที่ระบุเท่านั้น
~/.ssh/environment
- ไฟล์นี้จะถูกอ่านในสภาพแวดล้อมเมื่อเข้าสู่ระบบ (ถ้ามี) การประมวลผลสภาพแวดล้อมถูกปิดใช้งานโดยค่าเริ่มต้นและควบคุมผ่านตัวเลือก PermitUserEnvironment
~/.ssh/rc
- มีรูทีนการเริ่มต้นที่จะเรียกใช้ก่อนที่ไดเรกทอรีหลักของผู้ใช้จะสามารถเข้าถึงได้
/etc/ssh/sshd_config
- ไฟล์การกำหนดค่าทั่วทั้งระบบ
AllowAgentForwarding
- ระบุว่าอนุญาตให้ส่งต่อ ssh-agent (1) หรือไม่
AllowTcpForwarding
ForceCommand
- "บังคับให้เรียกใช้งานคำสั่งที่ระบุโดย ForceCommand โดยไม่สนใจคำสั่งใด ๆ ที่จัดหาโดยไคลเอ็นต์และ ~ / .ssh / rc หากมีอยู่คำสั่งถูกเรียกใช้โดยใช้เปลือกเข้าสู่ระบบของผู้ใช้ที่มีตัวเลือก -c"
GatewayPorts
- "ระบุว่าโฮสต์ระยะไกลได้รับอนุญาตให้เชื่อมต่อกับพอร์ตที่ส่งต่อให้กับลูกค้าหรือไม่โดยค่าเริ่มต้น sshd (8) ผูกการส่งต่อพอร์ตระยะไกลไปยังที่อยู่ลูปแบ็คซึ่งจะป้องกันไม่ให้โฮสต์ระยะไกลอื่น ๆ sshd นั้นควรอนุญาตให้ส่งต่อพอร์ตจากระยะไกลไปผูกกับที่อยู่ที่ไม่ใช่ลูปแบ็คดังนั้นจึงอนุญาตให้โฮสต์อื่นเชื่อมต่อได้ "
PermitOpen
:
ระบุปลายทางที่อนุญาตให้ส่งต่อพอร์ต TCP ข้อกำหนดการส่งต่อจะต้องเป็นหนึ่งในรูปแบบต่อไปนี้:
PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port
การส่งต่อหลายอาจถูกระบุโดยแยกพวกเขาด้วยช่องว่าง สามารถใช้อาร์กิวเมนต์ของ 'any' เพื่อลบข้อ จำกัด ทั้งหมดและอนุญาตการร้องขอการส่งต่อใด ๆ คำขอส่งต่อพอร์ตทั้งหมดได้รับอนุญาต
PermitTunnel
- ระบุว่าอนุญาตให้ส่งต่ออุปกรณ์ tun (4) หรือไม่ ค่าเริ่มต้นคือ 'ไม่'
X11Forwarding
- ระบุว่าอนุญาตให้ส่งต่อ X11 ได้หรือไม่ ค่าเริ่มต้นคือ 'ไม่'
การใช้ข้อ จำกัด
การแก้ไขไฟล์กำหนดค่าทั้งระบบ/etc/ssh/sshd_config
อนุญาตให้ใช้การกำหนดค่าแม้ว่าจะใช้การพิสูจน์ตัวตนด้วยรหัสผ่านหรือหาก~/.ssh/authorized_keys
มีการลบข้อ จำกัด ในโดยไม่ตั้งใจ หากคุณแก้ไขค่าเริ่มต้นทั่วโลกคุณควรยกเลิกการใส่เครื่องหมายข้อคิดเห็นตัวเลือกตามนั้น
Match User limited-user
#AllowTcpForwarding yes
#X11Forwarding no
#PermitTunnel no
#GatewayPorts no
AllowAgentForwarding no
PermitOpen localhost:62222
ForceCommand echo 'This account can only be used for [reason]'
ตอนนี้เพิ่มผู้ใช้:
sudo useradd -m limited-user
ForceCommand
คุณสามารถละเว้นตัวเลือกนี้ได้หากตั้งค่าเชลล์เป็นไม่ใช่แบบเชลล์/bin/false
(หรือ/bin/true
) เนื่องจาก/bin/false -c [command]
จะไม่ทำอะไรเลย
ตอนนี้ไคลเอนต์สามารถเชื่อมต่อกับพอร์ต 62222 บนที่อยู่ลูปแบ็คของเซิร์ฟเวอร์ผ่าน SSH เท่านั้น (จะไม่ฟังที่อยู่ IP สาธารณะ)
การปิดใช้งานAllowTcpForwarding
จะไม่อนุญาตให้ใช้-R
ดังนั้นจึงเป็นการเอาชนะการใช้บัญชีที่ถูก จำกัด ดังกล่าวสำหรับการส่งต่อพอร์ตเดียว PermitOpen localhost:62222
สมมติว่าพอร์ต 62222 บนเซิร์ฟเวอร์นั้นไม่เคยใช้งานเพราะลูกค้าสามารถเชื่อมต่อกับมันได้อย่างมีความสุขและฟังมันเช่นกัน
หากอนุญาตให้ส่งต่อ TCP ในการกำหนดค่าทั้งระบบและการตรวจสอบความถูกต้องด้วยรหัสผ่านคุณสามารถใช้การตั้งค่าสำหรับแต่ละคีย์ได้เช่นกัน แก้ไข~/.ssh/authorized_keys
และเพิ่มตัวเลือกถัดไปก่อนหน้าssh-
(ด้วยช่องว่างระหว่างตัวเลือกและssh-
):
command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"
ตรวจสอบ
เพื่อให้แน่ใจว่าใช้งานได้ตามที่คาดไว้กรณีทดสอบบางอย่างจำเป็นต้องถูกเรียกใช้ ในคำสั่งด้านล่างควรถูกแทนที่ด้วยการเข้าสู่ระบบที่เกิดขึ้นจริงหากยังไม่ได้ตั้งอยู่ในhost
~/.ssh/config
หลังคำสั่งคำสั่งจะแสดงให้เห็นว่าควรดำเนินการบนไคลเอนต์หรือเซิร์ฟเวอร์ (ตามที่ระบุ)
# connection closed:
ssh host
# connection closed (/bin/date is not executed):
ssh host /bin/date
# administratively prohibited (2x):
ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222
ข้อสรุป
รายการตรวจสอบ: ผู้ใช้ SSH ไม่สามารถ:
- รันคำสั่งเชลล์ - เสร็จสิ้น
- เข้าถึงไฟล์หรืออัพโหลดไฟล์ไปยังเซิร์ฟเวอร์ - ทำ
- ใช้เซิร์ฟเวอร์เป็นพร็อกซี (เช่น webproxy) - เสร็จสิ้น
- เข้าถึงบริการในพื้นที่ซึ่งไม่สามารถเข้าถึงได้แบบสาธารณะเนื่องจากไฟร์วอลล์ - บางส่วนลูกค้าไม่สามารถเข้าถึงพอร์ตอื่นนอกเหนือจาก 62222 แต่สามารถฟังและเชื่อมต่อกับพอร์ต 62222 บนเซิร์ฟเวอร์
- ฆ่าเซิร์ฟเวอร์ - เสร็จสิ้น
(โปรดทราบว่าการตรวจสอบเหล่านี้จะ จำกัด อยู่ที่เซิร์ฟเวอร์ SSH หากคุณมีบริการที่มีช่องโหว่อื่น ๆ บนเครื่อง