Bạn viết một tập lệnh chạy scutil --nc start với tên kết nối, nó chạy trên Mac của bạn và thất bại trên mọi máy vừa được cài đặt trong văn phòng. Tập lệnh không hỏng. Nó đang được yêu cầu làm điều mà nó chưa bao giờ có thể: khởi động một kết nối hiện có không phải là thao tác giống như tạo một kết nối mới.

Việc cấu hình và điều khiển phiên là hai công việc với hai chủ sở hữu, và một quy trình giả định ngược lại sẽ vượt qua mọi bài kiểm tra trên máy nơi nó được viết.

Lệnh khởi động thực sự nói chuyện với cái gì

Một lệnh điều khiển phiên hướng tới một cấu hình đã tồn tại và đã được phê duyệt. Nó yêu cầu hệ thống dựng kết nối có tên đó lên, dùng các thiết lập máy chủ, tham chiếu danh tính và chính sách đã lưu trước đó. Nếu những thứ đó chưa bao giờ được cài đặt, thì không có gì để khởi động.

Đó là lý do sự cố xuất hiện trên phần cứng mới chứ không phải trên máy tính xách tay của quản trị viên. Chiếc máy đó được cấu hình từ nhiều tháng trước bởi một người đã quên mất việc mình đã làm. Hãy coi lệnh khởi động như một chuông cửa mà ai đó đã đi dây từ quý trước. Nhấn nó không giống như đi dây.

Ba chủ sở hữu của một cấu hình VPN

Một hồ sơ do tổ chức quản lý đến từ quản lý thiết bị. Hồ sơ mang địa chỉ máy chủ, cách thức xác thực và chính sách mà tổ chức yêu cầu, và quản trị viên VPN là người cung cấp những thứ đó. Tập lệnh không nên dựng lại các thiết lập đó từ một tên hiển thị mà nó tìm thấy trong danh sách.

Một cấu hình VPN cá nhân gốc được tạo qua Network Extension API của Apple, bao gồm các giao thức IPsec và IKEv2 tích hợp. Đó là một giao diện ứng dụng có bước lưu và sự phê duyệt của người dùng, không phải một lệnh shell âm thầm tạo ra bất kỳ loại đường hầm nào mà nhà cung cấp phát hành.

Máy khách bên thứ ba là trường hợp thứ ba với định dạng nhập riêng, công cụ quản lý riêng và thường có trợ lý đặc quyền riêng. Phiên của nó thuộc về tiến trình của nhà cung cấp đó. Việc tìm thấy một dịch vụ hệ thống có tên tương tự không phải là bằng chứng rằng một lệnh hệ thống điều khiển đường hầm, và giả định như vậy tạo ra những tập lệnh trông như đang chạy cho đến khi nhà cung cấp cập nhật máy khách.

Cấu hình gốc có một bước lưu và một sự phê duyệt

Mô hình của Apple là tải, sửa, lưu. Ứng dụng tải các tùy chọn hiện có trước lần lưu đầu tiên sau khi khởi chạy, thay đổi cấu hình rồi lưu lại. Việc lưu báo lỗi khi không thể ghi bền, và bỏ qua kết quả đó biến một lỗi cấu hình thành lỗi kết nối ba bước sau.

Lần lưu đầu tiên cũng yêu cầu người dùng phê duyệt ứng dụng. Đó là một ranh giới bảo mật có chủ đích, và nó có nghĩa là lần chạy đầu tiên trên một Mac mới mang tính tương tác ngay cả khi mọi lần kết nối và ngắt kết nối sau đó có thể được tự động hóa. Hãy lên kế hoạch cho lần chạy đầu tiên như một công việc của con người với một người có mặt. Tự động hóa lần chạy thứ hai trở đi, và ghi điều đó vào runbook để không ai hứa điều bất khả thi. Một kế hoạch triển khai hứa hẹn lần chạy đầu tiên hoàn toàn không có người giám sát đang hứa điều mà nền tảng không cung cấp.

Apple cũng khuyến nghị xác thực khả năng tương thích của máy chủ bằng một hồ sơ cấu hình trước khi dựa vào API. Làm kiểm tra đó trước sẽ tách «máy chủ sẽ không chấp nhận máy khách này» khỏi «máy khách chưa bao giờ lưu thiết lập», vốn là những phiếu khác nhau cho những nhóm khác nhau.

Một lệnh khởi động có thể lặp lại được phép giả định gì

Sau khi cấu hình, tập lệnh có thể an toàn nhắm tới kết nối hiện có qua giao diện của chủ sở hữu nó. Hãy cấp cho nó danh tính ổn định của kết nối cùng hành động bạn muốn, và không gì khác. Nó không nên đọc một đường dẫn tùy chọn đoán mò, và không nên giả định rằng tên hiển thị trong menu là duy nhất trên toàn hệ thống.

Với các kết nối gốc, một yêu cầu phiên có tên như scutil --nc start là một thao tác điều khiển. Nó không cài đặt thiết lập máy chủ, không nhập thông tin xác thực và không thực hiện việc ủy quyền cho lần lưu đầu tiên. Hãy coi nó là bước cuối cùng của một chuỗi, không bao giờ là cả chuỗi.

Giữ bí mật ngoài các đối số dòng lệnh và ngoài đầu ra chẩn đoán thông thường. Bất kỳ cơ chế danh tính nào mà việc triển khai đã chọn thì đó chính là thứ mà lệnh khởi động phải dựa vào, và một mật khẩu bị dán vào lịch sử shell là một phát hiện trong bất kỳ buổi đánh giá nào.

Hai kiểm tra chấp nhận

Kiểm tra thứ nhất là cấu hình: lấy một Mac vừa cài đặt và chứng minh rằng cấu hình hiện diện, thuộc về đúng người quản lý và được phê duyệt đầy đủ. Làm việc này trước khi kiểm tra kết nối, vì một bài kiểm tra kết nối trên máy chưa được cấu hình không chứng minh được gì về tập lệnh.

Kiểm tra thứ hai là phiên: kết nối, tiếp cận tài nguyên được ủy quyền và ngắt kết nối sạch sẽ. Giờ đây mỗi thất bại đều có một chủ sở hữu, và đó là lợi ích thực tiễn của việc tách hai công việc. Thiếu hồ sơ là vấn đề phân phối, lỗi lưu là vấn đề phê duyệt, đăng nhập bị từ chối là vấn đề xác thực, và hết thời gian sau khi khởi động thành công là tầng phiên. Không cái nào trong số đó là «tập lệnh bị hỏng».

Bài viết liên quan