Phiên đầu tiên thắng: chặn đăng nhập OpenVPN trước khi trục xuất
Từ chối một lần đăng nhập sau không giống với thay thế lần trước. Quyết định phải đến trước việc trục xuất cùng tên, và bước kiểm tra chỗ phải mang tính nguyên tử.
Một chính sách cho phép mỗi tài khoản một phiên có vẻ đã ổn cho đến khi lần đăng nhập thứ hai đến. Có hai kết cục: người mới thay thế phiên đang chạy, hoặc phiên đang chạy giữ chỗ và người mới bị từ chối. Chỉ kết cục thứ hai mới là chính sách phiên đầu tiên thắng. Tùy chọn máy khách mà hầu hết mọi người chọn sẽ bật tính đồng thời và vì thế không tạo ra kết quả này.
Hai hợp đồng ẩn sau một thiết lập
Khi tính đồng thời bị tắt, kết nối thứ hai mang cùng tên chứng chỉ có thể đẩy phiên đang chạy ra ngoài. Bật tính đồng thời cho phép nhiều phiên cùng lúc, tức là ngược lại với một giới hạn. Không trạng thái nào là chính sách từ chối, nên quyết định phải được đưa ra ở nơi hoàn toàn khác.
Hãy viết hợp đồng trước khi triển khai bất cứ điều gì: ai bị từ chối, bằng chứng nào nhận diện phiên đang chạy và điều gì xảy ra khi một phiên chết mà không ngắt kết nối sạch. Một chính sách không ai phát biểu như vậy thì không thể kiểm thử về sau.
Việc trục xuất diễn ra trước hook kết nối của bạn
Trong đường mã máy chủ 2.6, bước chuẩn bị sớm cho máy khách mới sẽ xóa các phiên bản hiện có cùng tên khi tính đồng thời bị tắt. Việc xóa đó diễn ra trước khi chuỗi trình xử lý kết nối chạy. Vì vậy một script nhận ra bản trùng và trả về lỗi sẽ từ chối người mới sau khi phiên đang chạy đã bị loại bỏ, đúng kết quả mà chính sách muốn ngăn. Thứ tự các lệnh gọi lại trong bản triển khai upstream là câu trả lời đáng tin cậy duy nhất cho bản dựng của bạn.
| Stage | Who can still refuse | Effect on the incumbent |
|---|---|---|
| Certificate check | Server trust configuration | None |
| Authentication decision | The authentication controller | None, because establishment has not run |
| Connect handler | A profile script | Already evicted in the same-name case |
| Post-establishment | Status tooling, monitoring | Both sessions already exist or one is gone |
Thăm dò tệp trạng thái cũng không phải cổng. Hai lần thử đến cùng lúc có thể cùng thấy một chỗ trống trước khi bên nào xác nhận, và cả hai đều tiếp tục.
Chuyển quyết định vào bước xác thực
Giao diện quản lý có thể đảm nhận quyết định xác thực sau khi chứng chỉ được kiểm tra. Trong cách bố trí đó, bộ điều khiển không phải người quan sát: nó nhận từng phiên bản máy khách đang kết nối và trả lời liệu phiên bản đó có được tiếp tục. Vì câu trả lời đến trước khi thiết lập, một lần từ chối để phiên đang chạy nguyên vẹn. Cùng kênh đó báo cáo các lần ngắt kết nối, và nhờ vậy bộ điều khiển biết rằng một chỗ đã được giải phóng hợp lệ.
Mọi phiên bản mới đều phải đi qua cổng đó, kể cả các lần kết nối lại và bất kỳ đường nào xác thực lại mà không có lời nhắc. Một cổng mà vài phiên bản không bao giờ tới được thì không bảo vệ gì, và sự bỏ sót vẫn vô hình cho đến khi có người thử đường vòng.
Token có thể đi vòng qua cổng
Sau khi một token được phát hành, máy chủ có thể xác thực nó bên trong và bỏ qua xác thực bên ngoài cho kết nối đó. Lệnh gọi quản lý không bao giờ xảy ra, nên bước kiểm tra chỗ chỉ triển khai ở đó không bao giờ thấy phiên bản mới. Hành vi đó là tiện lợi cho người dùng và là lỗ hổng cho một chính sách đồng thời. Buộc các kết nối xác thực bằng token đi qua một bước kiểm tra có thẩm quyền tương đương, hoặc tắt đường token khi chính sách đòi hỏi quyết định trên mọi kết nối.
Đừng bù đắp bằng cách chấp nhận mọi token vô điều kiện. Một token hết hạn hoặc không hợp lệ vẫn phải thất bại, và nó phải thất bại qua đúng điểm quyết định như mọi thứ khác.
Gắn việc đặt chỗ với một phiên bản, không phải một địa chỉ
Địa chỉ là một danh tính yếu: một lần kết nối lại từ cùng máy tính xách tay có thể đến từ địa chỉ khác, và một thông tin đăng nhập bị sao chép có thể đến từ cùng địa chỉ đó. Gắn việc đặt chỗ với phiên bản máy khách mà máy chủ cấp, để một lần xác thực lại của phiên bản đã được chấp nhận được nhận ra là chủ sở hữu. Một định danh phiên bản mới phải giành chỗ của riêng nó qua quyết định ai đến trước thắng, ngay cả khi nó trình cùng token.
Chỉ giải phóng việc đặt chỗ thuộc về lần thử đã thất bại. Một sự kiện ngắt kết nối đến muộn từ lần thử cũ hơn không được xóa chỗ của chủ sở hữu mới hơn, đó là lý do việc giải phóng nêu tên phiên bản chứ không phải tài khoản. Sau khi bộ điều khiển khởi động lại, hãy đối chiếu các phiên đang sống trước khi nhận ai, và áp dụng cùng quy tắc trên mọi cổng phục vụ tài khoản.
Hãy quyết định riêng cách khôi phục một chỗ thực sự cũ. Quản trị viên cần một cách được ghi lại để xóa nó, và con đường đó không nên tiếp cận được với người dùng chỉ bấm vào kết nối lại.
Hãy kiểm thử những cặp quan trọng: hai lần đăng nhập gần như đồng thời, một lần kết nối lại sau khi đóng sạch, một lần xác thực lại của phiên đang chạy, một người mới bị từ chối và một lần khởi động lại bộ điều khiển. Trong mọi trường hợp phiên đang chạy phải vẫn dùng được và người mới phải bị từ chối mà không gây thiệt hại cho các tài khoản khác.