Các trang SaaS công khai có thể mở cho mọi người trong khi các thao tác quản trị phía sau từ chối bất kỳ ai bên ngoài VPN. Cơ chế làm được điều đó không phải một menu ẩn hay trang đăng nhập riêng; đó là kiểm tra đường mạng đã chuyển yêu cầu. Nếu bằng chứng địa chỉ sai, kiểm tra hoặc khóa người quản trị thật hoặc chấp nhận bất kỳ ai biết gõ tiêu đề. Hãy bắt đầu từ những gì nguồn gốc thực sự nhận được.

Nguồn gốc thực sự nhận được gì sau đường hầm

Khi trình duyệt đến trang công khai qua một VPN cũng mang lưu lượng internet, cổng sẽ chuyển đổi kết nối trước khi nó đi ra. SaaS thấy địa chỉ ra công khai của cổng, thường là một địa chỉ hoặc một dải nhỏ, và không bao giờ thấy địa chỉ đường hầm của laptop. Đó là lý do thêm 10.90.0.42 vào danh sách cho phép thất bại, và đó là lý do thêm toàn bộ RFC 1918 thất bại còn to hơn: cái thứ hai chấp nhận mọi mạng riêng có thể chạm tới bạn. Địa chỉ duy nhất đáng đặt điều kiện là địa chỉ mà tổ chức của bạn thực sự sở hữu ở lối ra.

curl -s https://ifconfig.me
dig +short admin.example.com

Đường hầm chia tách phá vỡ giả định đó một cách âm thầm. Nếu VPN chỉ mang các tuyến văn phòng riêng, yêu cầu tới tên máy chủ quản trị công khai đi ra qua nhà cung cấp địa phương và nguồn gốc thấy một địa chỉ dân cư. Biểu tượng VPN đã kết nối không chứng minh được gì về đích đến cụ thể này, nên hãy kiểm tra đích đến chứ không phải đường hầm.

Dừng lại và sửa định tuyến trước khi viết bất kỳ chính sách nào nếu địa chỉ ra thay đổi theo người dùng. Một điều kiện chỉ khớp với một số quản trị viên còn tệ hơn không có điều kiện, vì nó giấu vấn đề cho đến khi xảy ra sự cố.

Chỉ tin vào proxy viết lại địa chỉ

Hầu hết các trang công khai nằm sau CDN hoặc proxy ngược, nên địa chỉ socket của nguồn gốc thuộc về phần giao diện đó chứ không phải người truy cập. Phần giao diện thường chuyển tiếp địa chỉ gốc trong một tiêu đề, và tiêu đề đó do kẻ tấn công kiểm soát trừ khi nguồn gốc chỉ chấp nhận nó từ các proxy đã biết. Hãy cấu hình rõ danh sách nguồn tin cậy và làm cho nguồn gốc không thể tiếp cận từ bất kỳ nơi nào khác. Không có nửa sau đó, kẻ tấn công bỏ qua proxy và gửi tiêu đề trực tiếp.

set_real_ip_from 192.0.2.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
curl -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin

Lập luận tương tự áp dụng cho giao thức PROXY: nó chỉ đáng tin khi bộ lắng nghe được gắn với một giao diện mà proxy có thể chạm tới và không thứ gì khác chạm tới được. Thiếu ngữ cảnh địa chỉ phải làm kiểm tra được bảo vệ thất bại thay vì rơi vào quyền cho phép mặc định. Một tiêu đề vắng mặt không phải bằng chứng của một đường đi đáng tin.

Gắn điều kiện vào mọi thao tác được bảo vệ

Đặt kiểm tra ở ranh giới phân quyền mà mọi thao tác được bảo vệ đi qua, không phải ở trang kết xuất menu. Nhóm tuyến, middleware hoặc một lớp chính sách đều hoạt động; một bản sao cho mỗi trình xử lý thì không, vì trình xử lý mà ai đó thêm vào quý sau sẽ không có nó.

user = requireAuthenticatedSession()
requirePermission(user, "admin")
requireVpnEgress(verifiedClientAddress(request))
performProtectedOperation(user, request)

Cùng ranh giới đó phải bao phủ API JSON, các bản xuất, URL tải xuống có chữ ký và bắt tay WebSocket, vì không cái nào cần trang HTML được yêu cầu trước. Một liên kết tải xuống được tạo khi VPN đang bật vẫn còn hiệu lực sau đó trừ khi điểm cuối tải xuống kiểm tra lại. Các phiên dài hạn cũng cần quy tắc đánh giá lại, nếu không một yêu cầu đã xác thực trở thành miễn trừ vĩnh viễn. Từ chối mặc định là cài đặt duy nhất sống sót qua thay đổi nhân sự.

Bộ nhớ đệm chia sẻ là cách khác vòng qua kiểm tra. Một bộ nhớ đệm đã chứa phản hồi được bảo vệ có thể phục vụ nó mà không liên hệ nguồn gốc, nên đánh dấu phản hồi quản trị là riêng tư và giữ chúng ngoài lưu trữ chia sẻ. Nếu bộ nhớ đệm phải phục vụ chúng, kiểm tra truy cập phải chạy trước khi phục vụ, điều đó thường có nghĩa là nó hoàn toàn không thể là bộ nhớ đệm chia sẻ.

Kiểm tra các đường vòng bạn vừa đóng

Hãy luyện tập ma trận thay vì con đường hạnh phúc: một quản trị viên qua VPN, cùng quản trị viên đó không qua VPN, một người không phải quản trị viên qua VPN, và một tiêu đề địa chỉ giả mạo. Thêm một yêu cầu trực tiếp tới nguồn gốc và một yêu cầu với phản hồi trong bộ nhớ đệm, vì hai cái đó bỏ qua hoàn toàn phần giao diện.

curl -sI https://admin.example.com/export.csv
curl -s -H 'X-Forwarded-For: 198.51.100.27' https://origin.example.com/admin
curl -s https://admin.example.com/api/me -o /dev/null -w '%{http_code}\n'

Mỗi yêu cầu nên trả về trạng thái mà chính sách cam kết, và nhật ký nên ghi lại bằng chứng địa chỉ nào đã được dùng. Bao phủ IPv6 riêng, vì một nguồn gốc hai ngăn xếp có thể thấy một họ nguồn khác với cái bạn đã kiểm tra. Giữ các thao tác thông thường của khách hàng hoạt động bên ngoài VPN, nếu không thay đổi sẽ bị hoàn tác ngay lần đầu khách hàng phàn nàn. Viết kết quả mong đợi cho từng dòng trước khi chạy, để một lần vượt qua bất ngờ là hữu hình.

Địa chỉ ra chứng minh một đường mạng được phép, không phải một người và không phải một thiết bị được quản lý. Giữ nó như một điều kiện bên cạnh xác thực và quyền, và khu vực quản trị vẫn hẹp mà không biến toàn bộ sản phẩm thành dịch vụ chỉ dành cho VPN. Sự tách biệt đó chính là thiết kế, không phải hạn chế của nó.

Bài viết liên quan