Hãy hình dung một quy tắc tường lửa bật ICMP echo cho địa chỉ công cộng của máy chủ mỗi khi một hồ sơ VPN được đặt tên đang kết nối. Nó được đọc như «ping chỉ qua đường hầm», và cách đọc đó sai theo một cách có ý nghĩa. Quy tắc không giới hạn ai có thể chạm tới máy chủ; nó thay đổi điều mà giao diện công cộng trả lời trong khi một kết nối khác tình cờ đang hoạt động. Đây là hai chính sách khác nhau, và một trong số đó âm thầm mở rộng phạm vi phơi nhiễm.

Quy tắc bạn nghĩ mình đã viết

Yêu cầu dự định thường hẹp: hệ thống giám sát, hoặc người quản trị duy nhất trên VPN, phải có thể xác nhận máy chủ còn sống. Viết như một câu, nó nghe như kiểm soát truy cập trên đường hầm. Viết như một đối tượng tường lửa, nó trở thành một điều kiện trên hồ sơ công cộng, vì yêu cầu echo đến chính nơi đó.

Khi điều kiện là trạng thái kết nối thay vì địa chỉ nguồn, tập người gửi được phép không còn là tập đồng nghiệp VPN. Bất kỳ ai chạm tới địa chỉ công cộng đều có thể gửi yêu cầu echo khi cổng đang mở. Đường hầm không trở thành con đường; đường hầm trở thành công tắc.

Những người quảng bá ý tưởng này thường không nói dối về hiệu ứng họ muốn. Họ cần một kiểm tra chỉ trả lời khi liên kết khỏe mạnh, và sức khỏe của liên kết dễ quan sát nhất qua VPN. Sai lầm là coi một tín hiệu sẵn sàng như một quyết định truy cập, rồi tự động hóa nó.

Cổng thực sự kiểm soát điều gì

Thiết kế này hợp nhất hai thứ độc lập, và tách chúng ra là phần lớn của việc sửa. Thứ nhất là phạm vi: địa chỉ cục bộ nào, địa chỉ từ xa nào, giao thức nào và loại ICMP nào. Thứ hai là điều kiện: đối tượng quy tắc có đang được bật ngay lúc này hay không. Phạm vi là điều tường lửa đánh giá theo từng gói; điều kiện là điều một script ghi vào kho chính sách, và hai thứ được đối chiếu trên những đồng hồ hoàn toàn khác nhau.

Nếu yêu cầu thực sự chỉ là đồng nghiệp VPN, phạm vi trả lời điều đó mà không cần bất kỳ logic trạng thái kết nối nào: gắn quy tắc vào giao diện đường hầm hoặc vào dải địa chỉ đường hầm, giới hạn địa chỉ từ xa trong nhóm máy khách, và chỉ định loại echo thay vì «ICMP». Quy tắc đó vẫn đúng khi không có VPN nào hoạt động và một hồ sơ không liên quan không thể mở nó.

Nếu yêu cầu thực sự là một cổng công cộng, hãy nói điều đó trong văn bản chính sách, vì tiêu chí chấp nhận thay đổi. Một cổng công cộng phải nêu tên hồ sơ chính xác, định nghĩa «đã kết nối» nghĩa là gì, và tuyên bố rằng người gửi công cộng nằm trong phạm vi theo thiết kế. Phần lớn sự nhầm lẫn biến mất vào lúc ai đó bị buộc phải viết câu đó ra.

Xây đối tượng một lần, rồi bật tắt nó

Chuẩn bị trước một quy tắc duy nhất với danh tính ổn định, ở trạng thái tắt, và để bộ điều khiển chỉ thay đổi trạng thái bật của nó. Tạo quy tắc theo tên hiển thị trong mỗi lần chạy là cách một kho chính sách kết thúc với năm đối tượng gần như giống hệt và không có cách đáng tin cậy để gỡ chúng.

New-NetFirewallRule -Name "VpnGateEchoV4" -DisplayName "Public echo gated on VPN state" -Direction Inbound -Action Allow -Protocol ICMPv4 -IcmpType 8 -LocalAddress 203.0.113.10 -RemoteAddress Any -Enabled False
Set-NetFirewallRule -Name "VpnGateEchoV4" -Enabled True

Tên là định danh lâu bền; tên hiển thị là tài liệu mà con người có thể sửa. Đối chiếu theo -Name và script sẽ ngừng tạo bản trùng. Cùng hình thức lệnh đó bao phủ trường hợp IPv6 với -Protocol ICMPv6 -IcmpType 128, nhưng đó là quy tắc riêng vì số loại echo khác nhau giữa hai họ.

Giữ họ địa chỉ và loại ICMP rõ ràng vì lý do thứ hai: -Protocol ICMPv4 không có loại sẽ cho phép mọi thông điệp ICMPv4 mà hồ sơ cho phép, kể cả những thứ bạn chưa từng định chấp nhận. Nêu loại 8 thu hẹp quy tắc vào yêu cầu echo, và đó là thứ duy nhất mà kiểm tra khả năng tiếp cận gửi đi.

Nơi tự động hóa mâu thuẫn với ý định

Thăm dò hồ sơ máy khách vài phút một lần không thể tạo ra ranh giới tức thời. Giữa lúc kết nối rớt và lần thăm dò kế tiếp, quy tắc vẫn trả lời trên địa chỉ công cộng; giữa lúc kết nối lên và lần thăm dò kế tiếp, nó không trả lời. Thừa nhận độ trễ đó là trung thực, còn tuyên bố thiết kế áp đặt một bất biến nghiêm ngặt thì không.

Có một bẫy phạm vi ngay trong kiểm tra trạng thái. Get-VpnConnection báo cáo các hồ sơ máy khách được cấu hình trên máy, mặc định cho người dùng hiện tại và cho mọi người dùng với -AllUserConnection. Nó không báo cáo những người dùng từ xa đang quay số vào một máy chủ RRAS; đó là một quan sát khác với một lệnh khác. Một cổng được xây trên cái sai thì không kết nối với gì cả.

Sau đó bao phủ các trạng thái mà không ai viết script: khởi động với quy tắc đã được bật từ lần chạy trước, bộ điều khiển sụp trong khi cổng mở, và hồ sơ bị xóa trong khi quy tắc của nó vẫn sống. Mỗi trường hợp cần một mặc định được định nghĩa, và mặc định an toàn cho một sự cho phép công cộng là tắt. Nếu yêu cầu thực sự không chịu được cửa sổ thăm dò, quy tắc gắn trạng thái là công cụ sai và việc thực thi thuộc về đường hầm, không phải giao diện công cộng.

Cuối cùng, hãy kiểm tra yêu cầu công cộng hai lần, một lần khi kết nối được chọn đang hoạt động và một lần khi nó tắt, từ một máy chủ không nằm trong VPN. Một ping thành công từ bên trong đường hầm không chứng minh gì về chính sách này, và đó là phép đo mà hầu hết các triển khai bỏ qua.

Bài viết liên quan