Lệnh VPN chạy dưới người dùng của bạn, không có mật khẩu nào hiện ra, và đường hầm được dựng lên. Chuỗi thao tác đó có vẻ là một hoạt động không đặc quyền, và thường thì không phải vậy. Một dịch vụ riêng thực hiện các thay đổi mạng, và câu hỏi đáng quan tâm là dịch vụ đó sẽ làm gì cho một bên gọi mà nó chưa xác minh. Đếm số lần nhắc mật khẩu không cho bạn biết gì về ranh giới đó.

Giao diện, cơ chế và bước kiểm tra

Giao diện nhận yêu cầu: kết nối, ngắt kết nối, chọn hồ sơ. Cơ chế sở hữu các thao tác mạng: tạo giao diện, thay đổi tuyến đường, áp dụng bộ lọc. Bước kiểm tra ủy quyền quyết định bên gọi này có được yêu cầu hành động này hay không. Ba thứ đó có thể trải rộng trên một tệp nhị phân, một trình trợ giúp và một dịch vụ hệ thống, và người dùng chỉ thấy cái đầu tiên.

Các vai trò có thể sống trong một tệp nhị phân, trong hai tiến trình, hoặc trong một ứng dụng khách và một dịch vụ hệ thống, và lệnh mà người dùng thấy hiếm khi tiết lộ cái nào. Một biểu tượng khay và một tiến trình nền hệ thống có thể trông như một ứng dụng duy nhất trong khi chạy với thẩm quyền rất khác nhau. Đặc quyền lúc cài đặt và đặc quyền lúc yêu cầu cũng là hai chuyện khác nhau. Một trình cài đặt chạy với quyền root có thể để lại một dịch vụ lắng nghe các yêu cầu sau này, rất lâu sau khi trình quản lý gói đã xong. Chính dịch vụ đó nắm thẩm quyền, chứ không phải lệnh bạn đã gõ.

Giao phó là thiết kế thông thường

Giao phó công việc mạng có đặc quyền cho một dịch vụ là kiến trúc hợp lý. Nó giữ các ứng dụng thông thường không có đặc quyền và tập trung những thao tác cần sự cẩn trọng. Thiết kế chỉ có lợi khi dịch vụ cũng kiểm tra ai đang hỏi và để làm gì. Không có bước kiểm tra đó thì nó chỉ là một cánh cửa rộng hơn.

NetworkManager là ví dụ cụ thể trên Linux. Hướng dẫn cấu hình của nó giải thích cách PolicyKit ủy quyền các yêu cầu không phải từ root trong thiết lập mặc định. Điều đó cho thấy sự ủy quyền được giao phó trong một sản phẩm thật. Nó không chứng minh rằng mọi ứng dụng khách thương mại đều dùng NetworkManager, và không mô tả đường dẫn socket hay chính sách của bất kỳ nhà cung cấp cụ thể nào.

Mẫu hình là việc giao phó có một chính sách đằng sau. Ví dụ là một cách hiện thực mẫu hình đó, không phải cách phổ quát.

Đọc ranh giới, không đọc yêu cầu

Hãy tìm dịch vụ, chủ sở hữu cấu hình của nó và giao diện cục bộ mà phần giao diện phía trước sử dụng. Sau đó hỏi những người dùng nào được yêu cầu những thao tác nào. Có thể nâng và hạ một hồ sơ đã lưu không phải là cùng một quyền với việc nạp một cấu hình mà người vận hành chưa bao giờ xem xét. Khác biệt đó chính là toàn bộ câu hỏi bảo mật.

Hãy bắt đầu từ trình quản lý dịch vụ và từ góc nhìn của chính ứng dụng khách về các quyền của nó. Các lệnh dưới đây cho thấy tiến trình nền có đang chạy hay không, bên gọi được yêu cầu gì từ nó, và tiến trình nền mở ra những gì dưới thư mục thời gian chạy của nó.

systemctl status NetworkManager
nmcli general permissions
ls -l /run/NetworkManager

Cũng hãy hỏi thao tác ảnh hưởng đến điều gì. Một mục trình đơn trông có vẻ cá nhân có thể thay đổi tuyến đường và DNS cho toàn bộ máy, nghĩa là nó có thể làm gián đoạn phiên của những người dùng khác. Bán kính ảnh hưởng thuộc cùng một lần xem xét với quyền, và thường chính nó quyết định dịch vụ có cần một vai trò hẹp hơn hay không.

Sửa quyền theo cách được hỗ trợ

Làm cho một socket điều khiển được bảo vệ có thể ghi bởi mọi người, hoặc thêm một tài khoản vào một nhóm quản trị rộng, sẽ xóa một lỗi quyền và tạo ra một lỗi lớn hơn. Lỗi đó là thứ duy nhất cho bạn biết ranh giới ấy tồn tại. Hãy dùng quy trình thành viên hoặc ủy quyền đã được ghi lại, kể cả việc làm mới phiên mà nó yêu cầu. Tư cách thành viên nhóm thường chỉ áp dụng cho các phiên đăng nhập mới, vì vậy một thay đổi có thể có vẻ không làm gì cho đến lần đăng nhập tiếp theo.

Nếu sản phẩm mở ra một vai trò hẹp hơn cho thao tác, hãy ưu tiên nó hơn một cấp quyền chung. Hãy ghi vai trò đã chọn và chủ sở hữu của nó bên cạnh tên dịch vụ.

Một sự tách bạch tốt trông như thế nào

Các ứng dụng thông thường vẫn không có đặc quyền, dịch vụ chỉ thực hiện phần thiết lập mà nó được thiết kế cho, và mọi bên gọi đều được kiểm tra dựa trên một chính sách mà ai đó sở hữu. Đó là một thiết kế có thể bảo vệ được. Nó cũng có thể kiểm toán được, vì chính sách có một cái tên gắn với nó. Bất cứ điều gì lớn hơn đều xứng đáng có một ngoại lệ bằng văn bản thay vì một thay đổi quyền lặng lẽ.

Kiểu hỏng là một dịch vụ thực hiện bất kỳ yêu cầu nào từ bất kỳ người dùng cục bộ nào vì giao diện tiện lợi. Từ phía người dùng thì nó trông giống hệt, và nó mang thẩm quyền lớn hơn nhiều. Hãy thử một yêu cầu bị từ chối, không chỉ yêu cầu thành công. Một lời từ chối đến từ chính sách là bằng chứng rằng chính sách tồn tại.

Bài viết liên quan