Tập lệnh Bash để giới hạn số lần đăng nhập


12

Công ty của tôi có yêu cầu rằng tôi có một ứng dụng máy chủ đang chạy, tất cả người dùng truy cập nó thông qua thiết bị đầu cuối putty. Tôi muốn viết một kịch bản shell mà chỉ nên mở 20 thiết bị đầu cuối putty. Nếu thiết bị đầu cuối thứ 21 mở thì tôi muốn đóng thiết bị đầu cuối đó ngay lập tức.

Làm thế nào tôi có thể đạt được điều này?

Làm ơn giúp tôi.


3
Đặt kết nối số lượng tối đa cho phép truy cập trong ssh thành 20 trên máy chủ trong MaxSessionstrường
George Udosen

2
Nếu công ty của bạn có chính sách 20 phiên tối đa và mặc định là 10 (như câu trả lời được bình chọn cao nhất), tại sao công ty của bạn tăng số phiên cho phép> 20 trong /etc/sshd_config, hay đây là lỗi Ubuntu?
WinEunuuchs2Unix

Nếu thiết bị đầu cuối thứ 21 mở thì tôi muốn đóng thiết bị đầu cuối đó ngay lập tức Vậy 20 kết nối đầu tiên có thể hog máy chủ vô thời hạn?
xenoid

Câu trả lời:


24

Chỉnh sửa /etc/sshd_configphía máy chủ của bạn và thay đổi dòng:

#MaxSessions 10

đến

MaxSessions 20

Xem 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.

yeah công việc của nó, hơi muộn để thêm nó như là câu trả lời.
rdʒɑ

2
Bây giờ tôi đã có ý định thiết lập SSSH trên một trong những máy tính xách tay cũ của tôi. Có phải trang man nói rằng theo mặc định chỉ có 10 người dùng có thể đăng nhập vào máy chủ? Thậm chí, trở lại những năm 80, chúng ta có thể có hàng trăm người dùng đăng nhập vào máy tính mini IBM S / 36 với 2 MB RAM.
WinEunuuchs2Unix

2
Bạn đang nhầm lẫn các phiên như trong các thiết bị đầu cuối mở (xem OP) với các phiên bên trong kết nối SSH. Cài đặt bạn đề cập là khoảng bao nhiêu "kết nối phụ" được cho phép bởi một kết nối ssh. Vì vậy, chạy các lệnh 30 "ssh" không có vấn đề gì ngay cả với MaxSessions 20. Các phiên được đề cập là về những thứ như chuyển tiếp cổng (và thậm chí có nhiều hơn một shell mở) sử dụng cùng một kết nối, không phải về số lần đăng nhập trên hệ thống.
allo

@allo thông tin này bạn nhận được từ OP?
George Udosen

1
@allo là chính xác ở đây, MaxSimes đề cập đến việc ghép kênh theo phiên trên một kết nối TCP. Trừ khi tất cả người dùng của OP đang làm những điều kỳ lạ để chia sẻ một kết nối TCP duy nhất đến máy chủ thì giới hạn này sẽ không ảnh hưởng đến họ. Tôi vừa tự xác minh điều này bằng cách đặt giới hạn MaxSimes thấp trên máy chủ và mở nhiều hơn nhiều kết nối với nó.
Joe Lee-Moyet

5

Giải pháp của George hoạt động tốt tuy nhiên bạn đã yêu cầu một kịch bản bash ...

Vì vậy, xem xét cái này cho các tình huống khác khi không có tùy chọn như MaxSessionstrong sshd, sau đó bạn có thể sử dụng một cái gì đó như thế này:

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

pkill -nsẽ giết trường hợp mới nhất của processName.

Giải pháp chính xác cho tình huống đặc biệt này là câu trả lời của George.


Điều này cũng không ngăn cản các quy trình con?
RonJohn

Vâng, nó gây ra quá trình phụ cũng bị giết.
Ravexina

2
Sau đó - cho rằng bash tạo ra rất nhiều quy trình con và họ muốn giới hạn người dùng, không phải quy trình - đây dường như không phải là một câu trả lời hữu ích.
RonJohn

1
@RonJohn Đó là một câu trả lời hữu ích tương ứng với các yêu cầu của người dùng (Tập lệnh đóng quy trình ngay lập tức) và cho những người dùng khác đến từ công cụ tìm kiếm (câu trả lời chung cho tiêu đề) cho đến khi bạn chỉnh sửa câu hỏi.
Ravexina

Hãy để tôi vào đây. Tôi cũng biết rằng nơi này hướng người dùng đến đúng đường dẫn dựa trên các câu hỏi được hỏi. Nếu OP đặt câu hỏi và câu trả lời đúng (dựa trên câu hỏi của OP) không nhất thiết là cách thực hành tốt nhất hoặc cách tiếp cận đúng, tôi nghĩ rằng bất kỳ ai cũng có quyền nêu điều này hoặc đưa ra câu trả lời phù hợp với quan sát đó. Tôi thực sự không nghĩ rằng chúng ta nên lựa chọn quyết định câu trả lời nào là tốt nhất để OP quyết định và tôi thích thấy nhiều lựa chọn từ các thành viên trang web được thông tin tốt. Xin hãy luôn luôn có một cuộc tranh luận mang tính xây dựng, nó sẽ giúp tôi nếu không phải bất kỳ người nào khác!
George Udosen

4

Tôi đã quyết định xây dựng và thử nghiệm ý tưởng của Ravexina . Nó hoạt động và nó hiệu quả nếu bạn muốn hạn chế số lượng kết nối ssh được thiết lập ở tất cả.

Đầu tiên tôi tìm thấy khi ssh daemon đang chạy mà không có kết nối nào, có một sshdtiến trình. Đối với mỗi kết nối mới, hai sshdquy trình mới được tạo ra. Vì vậy, nếu bạn muốn giới hạn 20 kết nối, ngưỡng phải là 41 (1 + 2x20) thay vì 20.

Sau đó, tôi đã tạo một tệp thực thi, được đặt tên , trông như sau:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • Ngưỡng ở đây là 7, tương ứng chỉ có 3 kết nối có thể được thiết lập và phần còn lại sẽ bị hủy.

Cuối cùng tôi đã thêm chỉ thị sau vào /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • Biến $SHELLsẽ thực thi shell người dùng mặc định.
  • Một tác dụng không mong muốn là thông điệp chào mừng không còn nữa.
  • Đừng quên khởi động lại daemon ssh: sudo systemctl restart sshd.service

Đây là cách nó hoạt động ( nhấp vào hình ảnh để xem bản demo hoạt hình ):

nhập mô tả hình ảnh ở đây

Hơn nữa, tôi nhận ra rằng chúng ta không cần phải giết bất cứ điều gì, nếu chúng ta sửa đổi tập lệnh theo cách này:

#!/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

Và tương ứng /etc/ssh/sshd_configtheo cách này:

ForceCommand /usr/local/bin/limit-sshd

2

Câu hỏi không rõ ràng. Hãy để tôi nói trước làm thế nào để tôi hiểu nó và bằng cách nào, IMO, nó nên được hỏi:

Chúng tôi có mạng cục bộ nơi một máy chủ cung cấp một ứng dụng cụ thể. Nhóm của chúng tôi truy cập ứng dụng này thông qua kết nối ssh từ máy tính của họ đến máy chủ bằng cách sử dụng PuTTY. Mỗi thành viên trong nhóm có tài khoản người dùng riêng được sử dụng để thiết lập các kết nối ssh ( hoặc có thể: tất cả các thành viên trong nhóm sử dụng một tài khoản người dùng chung).

Các thành viên trong nhóm không sử dụng máy chủ cho bất kỳ mục đích nào khác và chúng tôi muốn giới hạn số lượng kết nối ssh của họ ở mức 20, bất kể có bao nhiêu kết nối được thiết lập bởi một người dùng cụ thể ( hoặc có thể: 20 kết nối cho mỗi người dùng).

Nếu giải thích đó là chính xác, có lẽ một cách chính xác để thực hiện các yêu cầu là tạo một nhóm người dùng , sau đó thêm tất cả tài khoản người dùng vào nhóm đó và giới hạn số lượng maxlogin thông qua /etc/security/limits.conf.

  1. Tạo một nhóm, được gọi là ví dụ the-app-maxlogins, với id nhóm 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. Thêm người dùng vào nhóm đó - sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. Thêm dòng tiếp theo /etc/security/limits.confđể giới hạn maxlogin của toàn nhóm :

    %the-app-maxlogins      -       maxlogins       20

    Hoặc thêm dòng sau để giới hạn số lần đăng nhập tối đa cho mỗi người dùng của nhóm :

    @the-app-maxlogins      -       maxlogins       20
  4. Chỉnh sửa /etc/ssh/sshd_configvà thêm các dòng sau vào dưới cùng (!) Của tệp để tắt ghép kênh phiên cho nhóm đó (có lẽ điều này không bắt buộc trong trường hợp đó):

    Match Group the-app-maxlogins
        MaxSessions 1

Giải pháp này sẽ giới hạn số lần đăng nhập của người dùng bị ảnh hưởng bất kể thông qua ssh hoặc tty. Nếu bạn muốn áp dụng nó cho một người dùng nhất định không phải cho một nhóm, chỉ cần thêm một dòng như sau limits.confhoặc đặt nó vào một .conftệp riêng trong thư mục /etc/security/limits.d/:

username      -       maxlogins       20

Giải thích đơn giản về ý nghĩa thực tế của chỉ thị MaxSessionsđược cung cấp trong câu trả lời này . Nguồn chính của câu trả lời hiện tại là một câu trả lời khác trong cùng câu hỏi của L & U.

Các câu trả lời khác của tôi, có thể cung cấp cách giải quyết một cách nào đó, nhưng nó là một loại niềm vui chứ không phải là giải pháp đúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.