Một điểm cuối VPN qua Squid: một ngoại lệ CONNECT hẹp
Cho phép một nguồn đã được phê duyệt đến một cổng VPN trên cổng 1194 qua Squid, giữ nguyên các lớp bảo vệ cổng toàn cục và chứng minh rằng không có gì khác bị mở.
Squid trả lời một yêu cầu CONNECT bằng dòng http_access đầu tiên khớp, và dòng đó có thể là một lời từ chối. Chính sự thật này giải thích vì sao một ngoại lệ cho điểm cuối VPN thường thất bại ngay lần thử đầu, bởi yêu cầu không bao giờ đến được quyền cho phép mà ai đó đã thêm ở cuối. Một bản sửa hẹp giữ nguyên các lớp bảo vệ cổng hiện có và dạy chúng một nguồn, đích và cổng đã được xem xét. Mọi thứ khác trên proxy hoạt động đúng như trước.
Squid quyết định một yêu cầu CONNECT như thế nào
Một yêu cầu CONNECT nêu tên một máy chủ và một cổng, và Squid đi qua các dòng http_access theo thứ tự cho đến khi một dòng khớp. Một lời từ chối khớp sẽ kết thúc đánh giá ngay lập tức và máy khách nhận 403 từ proxy. Vì vậy vị trí của một quy tắc quan trọng hơn câu chữ của nó. Chuyển cùng dòng đó lên một bước có thể thay đổi hoàn toàn kết quả.
Các lớp bảo vệ thông thường từ chối mọi thứ nằm ngoài Safe_ports và từ chối CONNECT nằm ngoài SSL_ports. Những tên đó là ACL được định nghĩa trong cấu hình của chính bạn, nên nội dung của chúng thuộc về bạn chứ không phải giao thức. Một bản phân phối có thể cho phép một dải cổng rộng làm Safe_ports trong khi hạn chế CONNECT riêng. Hãy đọc các giá trị thực trước khi cho rằng một cổng bị chặn theo thiết kế.
Xác nhận rằng proxy là thành phần từ chối yêu cầu. Một 403 do Squid tạo ra không giống chút nào với cảnh báo TLS từ máy chủ VPN, và gộp cả hai vào một vấn đề tốn mất giờ đầu tiên. Kiểm tra dòng nhật ký truy cập của yêu cầu, vì nó ghi lại cả hành động và quy tắc đã tạo ra nó.
Xây dựng một kết hợp duy nhất thay vì ba ACL rời rạc
Xây dựng ngoại lệ từ ba sự thật: một dải nguồn đã phê duyệt, một địa chỉ đích đã phê duyệt và cổng duy nhất mà điểm cuối lắng nghe. Hai ACL rời rạc và một kết hợp duy nhất tạo ra chính sách rất khác, vì thứ được đánh giá là sự kết hợp. Đặt tên ACL kết hợp theo điều nó cho phép, không theo phương thức nó mang.
Dạng dưới đây dùng các dải tài liệu cần được thay bằng giá trị đã xem xét. Squid không giữ riêng tên nào trong số này, nên bạn là người chọn và giữ chúng nhất quán. Công thức này giới hạn ở Squid 6 và 7, mà cấu hình được ghi chép của chúng hỗ trợ nhóm all-of. Tài liệu tham chiếu hiện tại đánh dấu các chỉ thị đó là không khả dụng trong Squid 8, nên hãy coi đây là công thức gắn với phiên bản chứ không phải lộ trình di chuyển, và kiểm tra chỉ thị trong tài liệu tham chiếu của bản phát hành riêng trước khi áp dụng.
acl pvpn_src src 192.0.2.128/25
acl pvpn_dst dst 198.51.100.77/32
acl pvpn_port port 1194
acl pvpn_ok all-of CONNECT pvpn_port pvpn_dst pvpn_srcNhóm all-of chỉ khớp khi mọi thành viên khớp, nghĩa là nguồn, đích và cổng được kiểm tra trên một dòng. Bản thân nhóm không cấp gì, và một yêu cầu chỉ khớp với hai trong ba sự thật thì không thể thỏa mãn nhóm. Tính chất đó giữ ngoại lệ hẹp khi về sau ai đó thêm một cổng thứ hai. Hoặc đích mới được thêm một cách có chủ ý, hoặc yêu cầu quay lại các lớp bảo vệ ban đầu.
Uốn các lớp bảo vệ cổng mà không gỡ bỏ chúng
Ở vị trí hiện tại, hai dòng bảo vệ thông thường trông như thế này. Chúng thường nằm sau phần xác thực và trước các dòng chính sách cho phép mọi thứ.
http_access deny !Safe_ports
http_access deny CONNECT !SSL_portsThêm kết hợp bị phủ định vào mỗi dòng, để một ngoại lệ khớp vẫn sống sót qua lớp bảo vệ mà nếu không sẽ từ chối nó. Chỉ các dòng bảo vệ thay đổi, và mỗi dòng chỉ thêm một điều kiện.
http_access deny CONNECT !SSL_ports !pvpn_ok
http_access deny !Safe_ports !pvpn_okCác điều kiện trên một dòng truy cập được kết hợp, nên dòng giờ chỉ từ chối những yêu cầu trượt cả kiểm tra gốc lẫn ngoại lệ. Yêu cầu đến điểm cuối đã phê duyệt đi qua, và mọi yêu cầu khác giữ hành vi cổng cũ. Đây là hẹp hơn việc thêm cổng vào một danh sách SSL_ports toàn cục, cách đó sẽ cho phép cổng ấy tới mọi đích. Nếu cổng đã có trong danh sách đó, ACL này không thu hẹp gì và quyền cho phép cũ, rộng hơn vẫn áp dụng cho các đích khác, nên hãy đọc danh sách thực trước khi khẳng định ngoại lệ đã mở cổng. Nó cũng có thể đảo ngược, vì hai dòng trở lại hình thức trước đó. Tài liệu tham chiếu kiểm soát truy cập ghi lại thứ tự và các lớp bảo vệ thông thường mà thay đổi này phụ thuộc vào.
Nơi không được đặt ngoại lệ
Cám dỗ là đặt một quyền cho phép phía trên các lớp bảo vệ và kết thúc. Cách đặt đó cũng bỏ qua các lớp bảo vệ xác thực và đích cục bộ thường nằm gần đỉnh của một cấu hình đang hoạt động. Kết quả không phải một ngoại lệ hẹp mà là một lỗ hổng có chú thích ở trên. Hãy giữ mọi quyền cho phép mới ở cùng giai đoạn đã xem xét như phần còn lại của chính sách máy khách.
Kiểm tra yêu cầu còn cần gì sau các lớp bảo vệ cổng. Một tài khoản đã xác thực, một địa chỉ máy khách được phép và một chính sách đích vẫn áp dụng, và ngoại lệ không thay đổi điều nào trong số đó. Nếu proxy của bạn đã cho tài khoản được phê duyệt đến các đích tùy ý, thì lớp bảo vệ cổng chưa bao giờ là biện pháp kiểm soát thực sự.
Hãy xem điểm cuối có phải TCP hay không. Một ngoại lệ CONNECT mang luồng TCP, và một hồ sơ OpenVPN dùng UDP sẽ không thể đến được qua nó. Chỉ đổi hồ sơ sang TCP nếu máy chủ lắng nghe như vậy và người vận hành chấp nhận khác biệt về hành vi.
Kiểm tra ranh giới bằng trình phân tích và một yêu cầu thật
Phân tích cấu hình trước khi nạp lại, và giữ một phiên thứ hai mở trong lúc làm việc đó. Một lỗi cú pháp khi nạp lại có thể để proxy ở cấu hình cũ hoặc từ chối hoàn toàn cấu hình mới. Trình phân tích báo dòng bị từ chối, nhiều hơn những gì lỗi phía máy khách sẽ cho bạn biết.
Sau đó nạp lại và gửi một CONNECT thật qua proxy từ một nguồn đã phê duyệt. Việc chạy trình phân tích đến trước, vì một lần nạp lại có lỗi gõ không dạy bạn điều gì về chính sách.
squid -k parse
squid -k reconfigure
curl -v -p -x http://proxy.lab.internal:3128 https://vpn.lab.internal:1194/ --max-time 5Thử ba trường hợp: nguồn và tài khoản đã phê duyệt, nguồn không được phê duyệt, và một đích khác trên cùng cổng. Trường hợp thứ ba chứng minh ngoại lệ là hẹp, vì nó dùng cổng mà không có sự khớp đích. Hãy đọc nhật ký truy cập cho cả ba thay vì tin thông báo của máy khách. Một CONNECT thành công chỉ thiết lập một luồng TCP và không hơn, nên bắt tay VPN vẫn là một thử nghiệm riêng.