Các mức script-security của OpenVPN từ 0 đến 3, và mỗi mức mở ra điều gì
Mỗi mức script-security mở rộng những gì một hồ sơ được phép thực thi: trước hết là các trình phụ trợ quản trị, sau đó là script của người dùng, cuối cùng là mật khẩu trong môi trường. Hãy đọc các chỉ thị.
Nhập một hồ sơ vào ứng dụng khách trên máy tính để bàn và lỗi đầu tiên thường là một dòng mà ứng dụng khách từ chối tuân theo: một hook script mà nó sẽ không chạy, hoặc một giá trị script-security mà nó cho là quá dễ dãi. Nâng con số lên làm hộp thoại biến mất. Nhưng nó cũng mở rộng những gì hồ sơ đó được phép thực thi trên máy của bạn, một thứ kỳ lạ để cấp chỉ nhằm đóng một cảnh báo. Theo dõi quá trình nhập đến tận chỉ thị và quyết định trở nên cụ thể.
Từ hộp thoại nhập đến chỉ thị
Hồ sơ là một tệp văn bản có các chỉ thị, và ứng dụng khách đọc chúng trước khi có bất kỳ đường hầm nào. Một chỉ thị như up, down hoặc tls-verify nêu tên một chương trình bên ngoài mà OpenVPN phải chạy vào một thời điểm xác định. Việc OpenVPN có sẵn lòng chạy nó hay không là một thiết lập riêng tên là script-security, và hồ sơ thường cũng đặt nó.
Vậy cảnh báo không phải về mật mã hay chứng chỉ. Nó là về một tệp cấu hình yêu cầu ứng dụng khách thực thi thứ gì đó trên máy chủ, và về ứng dụng khách kiểm tra xem mức quyền hiện tại của nó có cho phép yêu cầu đó không.
Ở giai đoạn này hai lỗi khác nhau trông giống nhau. Một hồ sơ yêu cầu mức mà ứng dụng khách sẽ không cấp tạo ra sự từ chối. Một hồ sơ yêu cầu mức mà ứng dụng khách cấp nhưng thiếu script lại tạo ra lỗi khi chạy, và cả hai bị lẫn lộn trong các luồng hỗ trợ. Một là câu hỏi về quyền, còn kia là câu hỏi về đóng gói.
Mỗi mức thực sự mở ra điều gì
Mức 0 hoàn toàn cấm các lời gọi chương trình bên ngoài, điều này nhất quán với ứng dụng khách tự cấu hình giao diện mà không cần trợ giúp và không nhất quán với ứng dụng khách gọi hệ điều hành. Mức 1, mặc định, cho phép các tệp thực thi tích hợp mà cấu hình giao diện và tuyến cần. Không mức nào chạy bất cứ thứ gì do người dùng cung cấp.
| Level | What OpenVPN may execute | What it exposes |
|---|---|---|
| 0 | No external programs at all | Interface and route setup must not depend on helpers |
| 1 (default) | Built-in helpers such as ip, ifconfig, route or netsh | Privileged commands the platform already ships |
| 2 | Built-in helpers plus user-defined scripts | Whatever the named script does with the client's privileges |
| 3 | Everything above, plus passwords in environment variables | Credentials visible to child processes and their logs |
Mức 2 là ranh giới thú vị, vì nó chấp nhận các script do người dùng định nghĩa. Từ điểm đó, đặc quyền của ứng dụng khách áp dụng cho mã mà bạn có thể chưa bao giờ đọc, được gọi vào những thời điểm bạn không chọn, trong một môi trường có chứa chi tiết kết nối. Mức 3 đi xa hơn và cho phép truyền mật khẩu qua biến môi trường, nên hướng dẫn mô tả nó là có khả năng không an toàn.
Không con số nào trong số này là thiết lập độ mạnh. Một hồ sơ ở mức 3 không có mã hóa tốt hơn hồ sơ ở mức 1; nó chỉ có bề mặt thực thi lớn hơn, và đường hầm là như nhau.
Quyết định hồ sơ đáng được gì
Hỏi script dùng để làm gì trước khi hỏi nó cần mức nào. Một hook đẩy cài đặt DNS hoặc sửa một tuyến sau khi kết nối là lý do chính đáng để chạy thứ gì đó. Một hook gọi một tệp nhị phân lạ trong thư mục tạm là lý do để dừng lại.
Đường dẫn của script quan trọng như chính script. Đường dẫn tương đối được phân giải theo thư mục mà ứng dụng khách dùng, và một thư mục ghi được biến một lần nhập thành một chỗ thực thi lâu dài. Đường dẫn tuyệt đối trong thư mục mà người dùng không thể sửa là dạng nên ưu tiên.
Script cũng thừa hưởng môi trường của ứng dụng khách, nơi chứa thông tin xác thực và siêu dữ liệu kết nối. Chính sự thừa hưởng đó khiến mức 3 nguy hiểm khi kết hợp với một script ghi nhật ký môi trường của nó, và đó là lý do một bản kết xuất chẩn đoán từ ứng dụng khách có bật script đáng được xem lại trước khi dán vào phiếu hỗ trợ. Hãy xóa môi trường trước khi chia sẻ.
grep -nE 'script-security|^up |^down |tls-verify' client.ovpnThay đổi một thứ, rồi cũng quan sát việc tháo gỡ
Nếu hồ sơ thực sự cần một script, chỉ thay đổi mức và chỉ cho hồ sơ đó. Chạy ứng dụng khách ở tiền cảnh với đầu ra chi tiết để lỗi của chính script hiện ra thay vì bị trình quản lý dịch vụ nuốt mất.
openvpn --config client.ovpn --script-security 2 --verb 3
ip route show default
Kiểm tra toàn bộ vòng đời, không chỉ kết nối. Một hook ngắt kết nối thất bại để lại các tuyến trỏ tới một đường hầm đã chết, tạo ra một máy trông như đã kết nối mà không tới được đâu. Trước khi tuyên bố thay đổi hoàn tất, hãy kết nối lại một lần và ngắt một lần, và kiểm tra bảng định tuyến sau mỗi lần.
Giữ một bản sao của hồ sơ gốc. Nếu ứng dụng khách của nền tảng không triển khai cùng mô hình script, việc xóa các chỉ thị cho đến khi nhập thành công có thể gỡ bỏ tích hợp DNS hoặc tuyến mà đường hầm cần, và kết nối tạo ra sẽ xác thực hoàn hảo mà không phân giải được gì.
Quyết định cần ghi lại thì hẹp: script nào, trên đường dẫn nào, được cấp ở mức nào, cho hồ sơ nào. Mọi thứ khác trong hồ sơ giữ nguyên, và đó là một câu mà người đánh giá có thể kiểm chứng.