Plugin vẫn được khuyên dùng trong những luồng cũ hơn các bản dựng hiện tại, và nó thất bại khi nạp trên một máy chủ được biên dịch hôm qua. Đây không phải lỗi cấu hình có thể sửa bằng một đường dẫn. Plugin và móc script giải quyết cùng một vấn đề ở các tầng khác nhau, và chuyển từ cái này sang cái kia thay đổi thứ cần cài, thứ chạy với quyền máy chủ và điều mà một lần đăng nhập thất bại thực sự nói với bạn.

Huyền thoại: plugin là con đường được hỗ trợ

Plugin là một đối tượng chia sẻ được nạp vào tiến trình OpenVPN, nên nó phải khớp với giao diện mà tiến trình đó cung cấp. Các bản dựng thay đổi, cách đóng gói thay đổi, và một thư viện được biên dịch cho giao diện cũ hơn sẽ đơn giản từ chối nạp. Không có gì trong cấu hình máy chủ bắc được khoảng trống đó, vì vậy lời khuyên "chỉ cần cài radiusplugin" kết thúc bằng một máy chủ không khởi động.

Móc script thì nằm ngoài tiến trình. OpenVPN chạy một chương trình, trao thông tin xác thực cho nó và đọc lại phán quyết. Chính sự tách rời đó giúp nó sống sót qua các lần nâng cấp, và cũng chính nó biến nó thành trách nhiệm của bạn theo cách mà plugin chưa bao giờ là.

Không cách nào an toàn hơn về mặt cấu trúc. Một bên chạy mã lạ bên trong daemon; bên kia chạy mã của bạn bên cạnh với thông tin xác thực trong tay. Câu hỏi đúng là bạn thực sự vận hành được rủi ro nào trong hai rủi ro đó.

Plugin đã gắn kết điều gì

Plugin mang theo tệp cấu hình riêng với máy chủ RADIUS, bí mật chia sẻ, số lần thử lại và thời gian chờ, và cấu hình máy chủ tham chiếu đến nó bằng một dòng. Việc xử lý thông tin xác thực vẫn nằm trong tiến trình máy chủ, nghĩa là mật khẩu không bao giờ vượt qua ranh giới tiến trình mà quản trị viên phải bảo vệ.

Cái giá là sự gắn kết. Mỗi lần nâng cấp OpenVPN đều có nguy cơ giao diện không tương thích, và mỗi bản phân phối dựng lại gói đều có nguy cơ tạo ra thư viện không còn khớp. Khi điều đó xảy ra, sự cố rất ồn ào và tức thì, và đó là lòng thương xót duy nhất của thiết kế này.

Nếu một plugin như vậy vẫn nạp trên bản dựng của bạn, nó có thể là bề mặt vận hành nhỏ hơn. Xác nhận giao diện mà nó được xây dựng cho, ghim nó vào bản dựng bạn đã kiểm thử, và coi mọi nâng cấp là thay đổi cần kiểm thử đăng nhập đầy đủ, không phải cập nhật gói thông thường.

Móc script thực sự tin điều gì

Móc được cấu hình bằng auth-user-pass-verify và một cơ chế bàn giao: biến môi trường hoặc tệp tạm. Ở dạng biến môi trường, OpenVPN yêu cầu script-security 3, mức được ghi nhận cho phép lộ mật khẩu cho script. Mức đó là sự suy yếu có chủ đích của mặc định, và nên được coi như một sự cho phép kèm lý do.

Mọi thứ script chạm vào đều thừa hưởng sự tin cậy đó. Nó phải thuộc sở hữu của root, không ghi được bởi nhóm hay người khác, được tham chiếu bằng đường dẫn tuyệt đối, và không có chỗ nào để một giá trị không đáng tin đi tới shell. Đặt mọi biến trong dấu nháy, từ chối ký tự bất ngờ, và không bao giờ dựng lệnh từ tên người dùng được cung cấp. Một script chạy như root ở mỗi lần đăng nhập đáng được xem xét một lần chính vì bốn thuộc tính đó.

ls -l /usr/local/sbin/radius-auth.sh
stat -c '%U %a' /usr/local/sbin/radius-auth.sh

Dạng bàn giao bằng tệp tránh được vấn đề thừa kế môi trường và trao thông tin xác thực cho script qua một tệp tạm với quyền hạn chế. Nếu ứng dụng khách của bạn hỗ trợ, đây thường là mặc định tốt hơn, dù nó thêm một đối tượng nữa để dọn khi thất bại.

Mã thoát quyết định bạn có thất bại mở hay không

Trạng thái thoát của script là phán quyết: không nhận, khác không từ chối. Mẫu gây rắc rối là một script shell chỉ nhận khi phản hồi RADIUS chứa một mã chấp nhận cụ thể và trả về thất bại cho mọi thứ khác, vì điều đó gộp ba sự kiện khác nhau vào một câu trả lời. Mật khẩu sai, máy chủ không tới được và phản hồi hỏng đều trở thành cùng một sự từ chối.

Tách các trường hợp đó trong script dù móc chỉ có thể trả về nhận hoặc từ chối. Ghi nhật ký kết quả backend riêng, cảnh báo khi hết thời gian và lỗi truyền tải, và làm rõ trong giám sát khi xác thực thất bại vì dịch vụ đang xuống chứ không phải vì người dùng gõ sai.

Hai thói quen giữ phần còn lại hợp lý. Nếu RADIUS là cơ quan có thẩm quyền, nó phải là nơi duy nhất kiểm tra mật khẩu, vì bảng bóng tạo ra hai câu trả lời cho cùng một câu hỏi và câu thứ hai là bề mặt tấn công mà không ai giám sát. Và hãy nhớ móc được gọi lại ở mỗi lần thử, nên một script chậm với ứng dụng khách thiếu kiên nhẫn trở thành bộ khuếch đại cho việc đoán mật khẩu trừ khi bạn thêm độ trễ hoặc chính sách ở phía RADIUS.

Bạn mất gì khi chứng chỉ biến mất

Nhiều triển khai dạng này tắt hoàn toàn việc kiểm tra chứng chỉ ứng dụng khách, để lại tên người dùng và mật khẩu làm toàn bộ yêu sách của ứng dụng khách. Thứ biến mất với thiết lập đó là danh tính dựa trên chứng chỉ. Kênh vẫn được mã hóa, nhưng thứ duy nhất đặt tên cho ứng dụng khách là phán quyết của RADIUS. Bất cứ thứ gì ở hạ nguồn trước đây dựa vào chủ thể chứng chỉ nay phải dựa vào tên người dùng.

Giữ bảo vệ kênh điều khiển để một đối tượng chưa xác thực không thể dò hay làm ngập bắt tay, và dùng username-as-common-name khi cấu hình theo người dùng phụ thuộc vào tên chung. Các cổng được quản lý thường giải quyết việc này khác đi, kết thúc xác thực chứng chỉ tại một cổng nói EAP-TLS với RADIUS, và trong trường hợp đó không chỉ thị máy chủ nào trong số này áp dụng. Sao chép mô hình mà nền tảng của chính bạn ghi lại, không phải mô hình của sản phẩm lân cận. Các chỉ thị quan trọng khác nhau đủ để việc trộn chúng tạo ra cấu hình phân tích được rồi sau đó không xác thực ai.

Bài viết liên quan