Bash script เพื่อ จำกัด จำนวนการเข้าสู่ระบบ


12

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

ฉันจะบรรลุสิ่งนี้ได้อย่างไร

โปรดช่วยฉันด้วย


3
ตั้งค่าการเชื่อมต่อจำนวนสูงสุดที่อนุญาตให้เข้าถึงใน ssh เป็น 20 บนเซิร์ฟเวอร์ในMaxSessionsฟิลด์
George Udosen

2
หาก บริษัท ของคุณมีนโยบายสูงสุด 20 เซสชันและค่าเริ่มต้นคือ 10 (ตามคำตอบที่โหวตสูงสุดแล้ว) ทำไม บริษัท ของคุณถึงเพิ่มจำนวนเซสชันที่อนุญาต> 20 นิ้ว/etc/sshd_configหรือนี่เป็นข้อบกพร่องของ Ubuntu?
WinEunuuchs2Unix

หากเทอร์มินัลที่ 21 เปิดแล้วฉันต้องการปิดเทอร์มินัลนั้นทันทีดังนั้นการเชื่อมต่อ 20 ครั้งแรกสามารถทำให้เซิร์ฟเวอร์ไม่ทำงาน
xenoid

คำตอบ:


24

แก้ไขของคุณ/etc/sshd_configที่ฝั่งเซิร์ฟเวอร์และเปลี่ยนบรรทัด:

#MaxSessions 10

ถึง

MaxSessions 20

ดูman sshd_config:

 MaxSessions
         Specifies the maximum number of open shell, login or subsystem
         (e.g. sftp) sessions permitted per network connection.  Multiple
         sessions may be established by clients that support connection
         multiplexing.  Setting MaxSessions to 1 will effectively disable
         session multiplexing, whereas setting it to 0 will prevent all
         shell, login and subsystem sessions while still permitting for-
         warding.  The default is 10.

ใช่มันทำงานช้าไปอีกนิดเพื่อเพิ่มเป็นคำตอบ
rɑːdʒɑ

2
ฉันตั้งใจจะเซ็ตอัพ SSSH บนแล็ปท็อปเครื่องเก่าของฉันสักครู่แล้ว หน้าคนกำลังบอกว่าโดยค่าเริ่มต้นผู้ใช้เพียง 10 คนเท่านั้นที่สามารถลงชื่อเข้าใช้เซิร์ฟเวอร์ได้ แม้แต่ย้อนกลับไปในยุค 80 เราอาจมีผู้ใช้นับร้อยรายลงชื่อเข้าใช้ IBM S / 36 มินิคอมพิวเตอร์พร้อม RAM 2 MB
WinEunuuchs2Unix

2
คุณกำลังสับสนระหว่างเซสชันในเทอร์มินัลเปิด (ดู OP) กับเซสชันภายในการเชื่อมต่อ SSH การตั้งค่าที่คุณพูดถึงนั้นเกี่ยวกับจำนวน "การเชื่อมต่อย่อย" ที่อนุญาตโดยการเชื่อมต่อ ssh เดียว ดังนั้นการทำงาน 30 "SSH" MaxSessions 20คำสั่งที่เป็นปัญหาแม้จะมีไม่มี เซสชันที่กล่าวถึงมีสิ่งต่าง ๆ เช่นการส่งต่อพอร์ต (และมีการเปิดมากกว่าหนึ่งเชลล์) โดยใช้การเชื่อมต่อเดียวกันไม่ใช่เกี่ยวกับจำนวนการล็อกอินบนระบบ
อัลโล

@ ทั้งหมดนี้ข้อมูลที่คุณได้รับจาก OP?
George Udosen

1
@allo ถูกต้องที่นี่ MaxSessions หมายถึงการทำมัลติเซสชันผ่านการเชื่อมต่อ TCP เดียว เว้นแต่ผู้ใช้ OP ทุกคนกำลังทำสิ่งแปลก ๆ เพื่อแบ่งปันการเชื่อมต่อ TCP เดียวกับเซิร์ฟเวอร์ขีด จำกัด นี้จะไม่ส่งผลกระทบต่อพวกเขา ฉันเพิ่งตรวจสอบตัวเองโดยตั้งค่าขีด จำกัด MaxSessions ต่ำบนเซิร์ฟเวอร์และเปิดการเชื่อมต่อมากกว่านั้น
Joe Lee-Moyet

5

โซลูชันของ George ทำงานได้ดี แต่คุณขอ bash script ...

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

if [ "$(pgrep -cx processName)" -gt 20 ]; then pkill -xn processName; fi; 

ซึ่งจะฆ่าอินสแตนซ์ใหม่ล่าสุดของpkill -nprocessName

ทางออกที่ถูกต้องสำหรับสถานการณ์พิเศษนี้คือคำตอบของจอร์จ


สิ่งนี้จะไม่ป้องกันกระบวนการย่อยด้วยหรือไม่
RonJohn

ใช่มันทำให้กระบวนการย่อยถูกฆ่าเช่นกัน
Ravexina

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

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

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

4

ฉันได้ตัดสินใจที่จะทำอย่างละเอียดและทดสอบRavexinaของความคิด มันใช้งานได้และจะมีประสิทธิภาพถ้าคุณต้องการ จำกัด จำนวนการเชื่อมต่อ ssh ที่กำหนดไว้เลย

ครั้งแรกที่ฉันพบเมื่อ ssh daemon ทำงานโดยไม่มีการเชื่อมต่อใด ๆ มีsshdกระบวนการหนึ่ง สำหรับการเชื่อมต่อใหม่แต่ละsshdกระบวนการจะมีการสร้างกระบวนการใหม่สองกระบวนการ ดังนั้นหากคุณต้องการ จำกัด การเชื่อมต่อ 20 ขีด จำกัด ควรเป็น41 (1 + 2x20) แทนที่จะเป็น 20

จากนั้นฉันสร้างไฟล์เรียกทำงานที่มีชื่อซึ่งมีลักษณะดังนี้:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • ขีด จำกัด ที่นี่คือ 7 ตามลำดับสามารถสร้างการเชื่อมต่อได้ 3 ครั้งเท่านั้น

ในที่สุดฉันได้เพิ่มคำสั่งต่อไปนี้ไปที่/etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • ตัวแปร$SHELLจะดำเนินการเชลล์เริ่มต้นของผู้ใช้
  • ผลที่ไม่พึงประสงค์คือข้อความอวยพรไม่สามารถใช้ได้อีกต่อไป
  • อย่าลืมรีสตาร์ท ssh daemon: sudo systemctl restart sshd.service

นี่คือวิธีการทำงาน ( คลิกที่ภาพเพื่อดูตัวอย่างการเคลื่อนไหว ):

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้ฉันรู้ว่าเราไม่จำเป็นต้องฆ่าสิ่งใดถ้าเราแก้ไขสคริปต์ด้วยวิธีนี้:

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    exit # This line is not mandatory
else
    eval "$SHELL"
fi

และตามลำดับ/etc/ssh/sshd_configด้วยวิธีนี้:

ForceCommand /usr/local/bin/limit-sshd

2

คำถามไม่ชัดเจน ให้ฉันบอกก่อนว่าฉันจะเข้าใจได้อย่างไรและด้วยวิธีใด IMO ควรได้รับการถาม:

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

สมาชิกในทีมไม่ได้ใช้เซิร์ฟเวอร์เพื่อจุดประสงค์อื่นและเราต้องการ จำกัด จำนวนการเชื่อมต่อ ssh ของพวกเขาเป็น 20 ไม่ว่าจะมีการสร้างการเชื่อมต่อโดยผู้ใช้ที่เฉพาะเจาะจง ( หรืออาจจะ: 20 การเชื่อมต่อต่อผู้ใช้)

หากตีความว่าถูกต้องอาจเป็นวิธีที่ถูกต้องในการตอบสนองความต้องการคือการสร้างกลุ่มผู้ใช้แล้วเพิ่มบัญชีผู้ใช้ทั้งหมดไปยังกลุ่มที่และ จำกัด จำนวนของmaxlogins/etc/security/limits.confผ่าน

  1. สร้างกลุ่มที่เรียกตัวอย่างเช่นthe-app-maxloginsโดยใช้ id กลุ่ม10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. เพิ่มผู้ใช้ในกลุ่มนั้นsudo adduser <user> <group>: -

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. เพิ่มบรรทัดถัดไป/etc/security/limits.confเพื่อจำกัด maxlogins ของทั้งกลุ่ม :

    %the-app-maxlogins      -       maxlogins       20

    หรือเพิ่มบรรทัดต่อไปนี้เพื่อจำกัดจำนวนการเข้าสู่ระบบสูงสุดต่อผู้ใช้ของกลุ่ม :

    @the-app-maxlogins      -       maxlogins       20
  4. แก้ไข/etc/ssh/sshd_configและเพิ่มบรรทัดต่อไปนี้ที่ด้านล่าง (!) ของไฟล์เพื่อปิดการใช้งานมัลติเซสชั่นสำหรับกลุ่มนั้น (อาจเป็นไปไม่ได้ในกรณีนี้):

    Match Group the-app-maxlogins
        MaxSessions 1

วิธีนี้จะ จำกัด จำนวนการเข้าสู่ระบบของผู้ใช้ที่ได้รับผลกระทบไม่ว่าจะผ่าน ssh หรือ tty หากคุณต้องการที่จะใช้มันสำหรับผู้ใช้บางคนที่ไม่ได้สำหรับกลุ่มเพียงแค่เพิ่มบรรทัดดังต่อไปนี้limits.confหรือวางลงใน.confไฟล์แยกต่างหากภายในไดเรกทอรี/etc/security/limits.d/:

username      -       maxlogins       20

คำอธิบายอย่างง่ายของความหมายที่แท้จริงของคำสั่งMaxSessionsนั้นมีให้ในคำตอบนี้ แหล่งที่มาหลักของคำตอบปัจจุบันคือคำตอบอื่นภายใต้คำถามของ L & U เดียวกัน

คำตอบอื่น ๆของฉันสามารถให้การแก้ปัญหาในทางใดทางหนึ่ง แต่มันเป็นชนิดสนุกมากกว่าการแก้ปัญหาที่แท้จริง

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