MaxSessions, MaxStartups hay đăng ký thiết bị: chọn giới hạn SSH nào
MaxSessions đếm các kênh trong một transport, MaxStartups bảo vệ các handshake chưa xác thực, và cả hai đều không đếm thiết bị. Hãy quyết định lời hứa trước.
Các dịch vụ đường hầm hứa một thiết bị cho mỗi thuê bao hiếm khi nhận được lời hứa đó từ MaxSessions, và bài kiểm tra đầu tiên thường chứng minh điều đó. Thuê bao mở tiến trình ssh thứ hai, phiên đầu tiên vẫn chạy, và cả hai đường hầm đều mang lưu lượng. Mỗi tùy chọn cấu hình đếm một thứ khác nhau, và không tùy chọn nào đếm thiết bị. Đặt tên cho lời hứa trước là điều khiến lựa chọn giữa chúng trở nên rõ ràng.
Mỗi tùy chọn thực sự đếm cái gì
MaxSessions giới hạn số phiên mở mà một kết nối mạng đã xác thực mang theo. Phiên ở đây nghĩa là một shell, một yêu cầu exec, một hệ thống con như SFTP, hoặc một kênh tương tự được ghép kênh bên trong một transport SSH. Lần gọi ssh thứ hai mở transport thứ hai, xác thực lại và nhận hạn mức riêng của nó. Số phiên của kết nối đầu tiên không liên quan đến nó.
MaxStartups giới hạn các kết nối đồng thời chưa được xác thực, được biểu thị bằng ngưỡng bắt đầu, tốc độ và ngưỡng đầy. Nó tồn tại để một đợt bắt tay nửa mở không thể làm cạn tài nguyên của daemon trước khi xác thực. Khi một máy khách xác thực, kết nối đó ngừng bị tính vào MaxStartups và trở thành phiên của ai đó. Nó chưa bao giờ là hạn ngạch theo người dùng, và việc tăng nó không cho phép thuê bao làm được nhiều hơn.
Quy tắc đăng ký thiết bị hoàn toàn không phải là tùy chọn của sshd. Nó thuộc về bất kỳ hệ thống nào cấp thông tin xác thực và theo dõi thiết bị nào giữ chúng, nghĩa là nó cần đăng ký, kiểm kê và thu hồi thay vì một bộ đếm. Trộn yêu cầu đó vào cấu hình sshd là nơi hầu hết các thiết kế này bị mắc kẹt.
Nơi MaxSessions thôi là hạn ngạch
Một khối Match User thay đổi giá trị cấu hình nào áp dụng cho người dùng đó, vì vậy đây là nơi tự nhiên để đặt MaxSessions chặt hơn cho một tài khoản dịch vụ. Điều nó không thể làm là tổng hợp qua các kết nối, vì tùy chọn được đánh giá theo từng transport. Hai transport mỗi cái nhận giới hạn riêng, và người dùng cuối cùng có gấp đôi mức khối cho phép.
Chuyển tiếp là một bất ngờ riêng. Chuyển tiếp TCP không cần kênh phiên, vì vậy MaxSessions 0 có thể cấm shell và hệ thống con trong khi vẫn cho phép đường hầm -L và -R. Một dịch vụ chỉ chuyển tiếp và coi số phiên là hạn ngạch đường hầm của mình thì không đo được gì cả. Hành vi đó được ghi lại trong tài liệu tham khảo cấu hình máy chủ OpenSSH, và đáng đọc trước khi thiết kế xung quanh một tên tùy chọn.
Xuất cấu hình hiệu lực thay vì tệp mà bạn nghĩ đang được nạp. Các phần bao gồm và thư mục drop-in thường có nghĩa là giá trị có hiệu lực không phải giá trị bạn đã sửa.
MaxStartups bảo vệ daemon, không phải thuê bao
Dạng ba phần của MaxStartups mô tả có bao nhiêu kết nối chưa xác thực có thể tồn tại trước khi daemon bắt đầu bỏ một tỷ lệ phần trăm các kết nối mới. Dạng mặc định của nó tồn tại vì một kết nối SSH chưa xác thực thì rẻ để mở và đắt để giữ. Đây là một kiểm soát bảo vệ tài nguyên cho máy chủ, và nó áp dụng cho mọi người cùng lúc.
Tăng nó trong một cơn bão đăng nhập đánh đổi bảo vệ daemon lấy kết nạp, điều đôi khi là đánh đổi đúng và luôn là có chủ ý. Nó không làm gì cho thuê bao muốn đường hầm thứ hai, vì đường hầm đầu tiên đã được xác thực. Nhầm lẫn hai điều này dẫn đến một thay đổi sửa sai triệu chứng và đồng thời làm yếu máy chủ.
Khi các lần đăng nhập bị từ chối theo từng đợt, hãy xem trong nhật ký daemon thông điệp trước xác thực trước khi chạm vào bất kỳ tùy chọn nào. Thông điệp nêu tên lớp bảo vệ nào đã kích hoạt, và các lớp bảo vệ không thể thay thế cho nhau.
Khe theo người dùng cần trạng thái chia sẻ
Một chính sách một transport hoạt động thực sự cần một đặt chỗ được giữ ở đâu đó ngoài sshd. Bước kết nạp phải chiếm khe của tài khoản một cách nguyên tử, giải phóng nó khi kết nối đóng, cho nó hết hạn khi máy khách biến mất mà không đóng, và quyết định xem một nỗ lực mới bị từ chối hay thay thế cái cũ. Quyết định cuối cùng đó là quyết định sản phẩm, không phải chi tiết kỹ thuật, vì thay thế một đường hầm đang hoạt động sẽ ngắt kết nối của ai đó.
Đặt chỗ cũng phải được chia sẻ bởi mọi máy chủ chấp nhận tài khoản. Hai máy chủ có bộ đếm cục bộ độc lập áp đặt hai giới hạn riêng, và thuê bao kết nối lại qua cổng khác nhận được khe thứ hai miễn phí. Bất cứ thứ gì lưu trạng thái đều cần hành vi khi lỗi của riêng nó, vì một kho lưu trữ không thể truy cập không được khóa tất cả thuê bao ra ngoài.
Đối với lời hứa một thiết bị, hãy cấp thông tin xác thực riêng cho từng thiết bị đã đăng ký và kiểm soát đăng ký và thu hồi ở lớp đó. Một khóa riêng bị sao chép vẫn xác thực từ bất kỳ đâu, vì vậy cấp một khóa cho mỗi người dùng không phải là bằng chứng về số máy giữ nó.
Kiểm tra chính sách bằng hai kết nối thật
Viết các kiểm thử chấp nhận dưới dạng lệnh trước khi viết chính sách. Năm trường hợp là transport thứ hai được mở trong khi cái đầu tiên đang hoạt động, nhiều kênh trong một transport, máy khách chỉ chuyển tiếp cổng, kết nối lại sau khi liên kết bị rớt, và cùng một tài khoản đến một cổng khác.
Đọc các giới hạn hiệu lực trước, sau đó mở các kết nối mà chính sách phải từ chối. Cả hai nửa của bài kiểm tra đó đều quan trọng, và không nửa nào thay thế nửa kia.
sshd -T | grep -iE "maxsessions|maxstartups|allowtcpforwarding|permitopen"
ss -tn state established '( sport = :22 )' | head
ssh -N -L 8080:127.0.0.1:80 [email protected]Chạy lệnh đường hầm hai lần trong hai terminal và đếm các kết nối được thiết lập trên cổng 22. Nếu cả hai đều mang lưu lượng trong khi chính sách của bạn tuyên bố một transport hoạt động, thì chính sách là tài liệu chứ không phải thực thi. Sửa khoảng trống đó ở lớp kết nạp, không phải bằng cách hạ MaxSessions và hy vọng transport thứ hai sẽ nhận ra.