Cloudflare Blog
75

Sản phẩm

Cloudflare mã nguồn mở công cụ dòng lệnh cho giao thức bảo mật

(giờ Việt Nam)

Tóm tắt AI

Cloudflare vừa ra mắt pvcli, một công cụ dạng curl giúp đơn giản hóa việc kiểm thử các giao thức bảo mật phức tạp như OHTTP.

Bản dịch AI

We’re open sourcing our privacy proxy CLI

Việc gỡ lỗi (debug) các giao thức bảo mật quyền riêng tư rất khó khăn. Oblivious HTTP bao gồm nhiều bước khác nhau giữa bốn bên tham gia, chưa kể đến việc mã hóa binary HTTP và các chi tiết nằm rải rác trong nhiều bản dự thảo RFC. Chúng tôi đã đúc kết những gì học được từ việc vận hành các giao thức như Oblivious HTTP ở quy mô hàng triệu yêu cầu mỗi giây và gói gọn nó vào một công cụ CLI sạch sẽ, tiện lợi — mà hôm nay chúng tôi chính thức mở mã nguồn (open source).

Chúng tôi gọi nó là privacy-client, hay pvcli. Chúng tôi phát hành công cụ này theo Giấy phép Apache-2.0 và hoan nghênh mọi đóng góp từ cộng đồng.

Dưới đây là một dòng lệnh duy nhất thực hiện toàn bộ yêu cầu Oblivious HTTP với relay, gateway và origin. Đừng lo lắng nếu bạn chưa hiểu điều đó nghĩa là gì, chúng tôi sẽ giải thích ở bên dưới.

Chúng tôi sẽ giải thích lý do tại sao chúng tôi xây dựng công cụ này và cho thấy nó hữu ích như thế nào.

Tại sao các giao thức quyền riêng tư lại khó gỡ lỗi

Hãy cùng xem xét kỹ hơn động lực của chúng tôi khi tạo ra pvcli. Theo thời gian, bộ sản phẩm và cơ sở khách hàng của nhóm Quyền riêng tư (Privacy team) ngày càng phát triển. Chúng tôi đã thêm các sản phẩm như Privacy Proxy và Privacy Gateway, vốn là nền tảng cho Private Relay của Apple, Microsoft Edge Secure Network VPN, Anonymous Mode của Flo Health, và nhiều dịch vụ khác. Đi cùng với đó là sự gia tăng về các yêu cầu đặc biệt từ khách hàng, kiến thức chuyên môn và độ phức tạp. Kết quả là, chúng tôi gặp nhiều khó khăn hơn trong quá trình phát triển và xử lý sự cố.

Để thấy rõ điều này, hãy xem cách một trong những sản phẩm của chúng tôi triển khai Oblivious HTTP, hay còn gọi là OHTTP. Trước hết, một kiến thức cơ bản: OHTTP cung cấp cho người dùng sự đảm bảo về quyền riêng tư: không ai có thể biết được cả người thực hiện yêu cầu lẫn nội dung họ đang yêu cầu. Để đạt được điều này, OHTTP yêu cầu hai máy chủ, một relay và một gateway, được vận hành bởi hai bên không thông đồng với nhau.

Dưới đây là sơ đồ trình tự của OHTTP, trong đó khách hàng của chúng tôi sở hữu relay và Cloudflare sở hữu gateway. Ở cấp độ tổng quan, OHTTP có thể được chia thành các bước sau:

Như bạn có thể thấy, nó bao gồm khá nhiều bước trao đổi qua lại:

Mỗi bước đều là một điểm lỗi tiềm ẩn mà chúng tôi phải cân nhắc khi gỡ lỗi!

Cụ thể, chúng tôi đã gặp phải một số loại vấn đề nhất định khi gỡ lỗi OHTTP.

Kết quả là, chúng tôi quyết định đưa tất cả các giao thức quyền riêng tư của mình vào một công cụ duy nhất. Nó có giao diện sạch sẽ, quen thuộc, hiển thị từng bước của giao thức theo thứ tự và đủ linh hoạt để hỗ trợ các giao thức cũng như kiến trúc mới.

Để thấy sự khác biệt, hãy xem một kịch bản gỡ lỗi OHTTP — trước và sau khi có pvcli.

Gỡ lỗi khi không có pvcli

Giả sử chúng tôi vận hành một OHTTP relay nằm trước gateway của khách hàng. Khách hàng yêu cầu chúng tôi thực hiện kiểm thử end-to-end với một yêu cầu:

Hãy nhớ lại các bước OHTTP ở trên. Bước đầu tiên là lấy khóa công khai (public key) từ gateway. Chúng tôi sử dụng curl để lấy nó từ gateway của khách hàng và nhận được kết quả:

Đó là một chuỗi nhị phân lớn ở dạng hex. Để hiểu nó, chúng tôi tra cứu RFC 9458 §3 của OHTTP và phân tích thủ công:

Chúng tôi lặp lại quy trình này cho bất kỳ số lượng khóa công khai nào có trong chuỗi nhị phân.

Tiếp theo, chúng tôi chuyển đổi yêu cầu HTTP gốc thành binary HTTP, tham chiếu theo RFC 9292. Chúng tôi tự tạo nhị phân thủ công với sự trợ giúp của một số tập lệnh tùy chỉnh:

Chúng tôi xác minh từng trường:

Cuối cùng, chúng tôi tạo một yêu cầu HTTP bao bọc (wrapper) để chứa yêu cầu OHTTP của mình. Để làm điều đó, chúng tôi dành thêm thời gian viết một tập lệnh tạm thời khác để mã hóa yêu cầu binary HTTP theo cách mà OHTTP quy định, sử dụng khóa công khai từ trước đó. Chúng tôi tạo một header, là sự kết hợp của ID khóa công khai, ID phương thức mã hóa bất đối xứng và ID phương thức mã hóa đối xứng. Sau đó, chúng tôi nối header và yêu cầu binary HTTP đã mã hóa lại, kết quả là:

Chúng tôi đưa các byte đó vào phần thân của yêu cầu HTTP bao bọc và gửi đến relay. Chúng tôi nhận lại một phản hồi.

Điều đó có nghĩa là gì? Chúng tôi liên hệ với khách hàng để hỏi xem họ có thể chia sẻ nhật ký (log) từ gateway của họ không. Trong lúc chờ đợi, chúng tôi kiểm tra lại các bit đã tạo. Các khóa công khai được giải mã trông có vẻ ổn. Yêu cầu binary HTTP... Ồ! Chúng tôi thấy:

BHTTP sử dụng tiền tố độ dài (length prefixed). Điều đó có nghĩa là chúng tôi chỉ định một độ dài (0x0a là 10 trong hệ thập phân), và sau đó là 10 byte tiếp theo. Nhưng ở đây, có 11 byte. Có một số 20 thừa trước số 00. 20 đại diện cho ký tự khoảng trắng, vì vậy chắc hẳn chúng tôi đã vô tình thêm nó vào khi xây dựng phần thân. Chúng tôi xóa ký tự thừa, gửi lại và nó hoạt động!

Gỡ lỗi với pvcli

Với pvcli, tất cả những việc đó giờ đây chỉ là một lệnh duy nhất:

Nó xử lý tất cả việc phân tích cú pháp nhị phân và mã hóa cho chúng tôi, đồng thời in ra nhật ký trong trường hợp chúng ta muốn tìm hiểu sâu hơn:

Những gì từng là một quy trình mong manh — bao gồm thao tác với các bit, chắp vá các tập lệnh và tra cứu các tài liệu RFC dài — giờ đây chỉ còn là một câu lệnh.

Những gì pvcli có thể làm

Để cài đặt:

pvcli lấy cảm hứng rất nhiều từ curl. Chúng tôi thiết kế nó với "nguyên tắc ít gây ngạc nhiên nhất" (principle of least surprise). Kết quả là, rất nhiều đối số giống hệt với curl! Hãy thử một yêu cầu GET nhanh đến endpoint cdn-cgi của chúng tôi:

Nếu bạn tò mò về những gì đang diễn ra bên dưới, bạn có thể sử dụng -v để nhận nhật ký chi tiết:

Bây giờ, về lệnh OHTTP trước đó: bạn sử dụng --ohttp để yêu cầu pvcli xây dựng một yêu cầu OHTTP. Bạn truyền relay vào --first-hop và gateway vào --proxy. Mục tiêu (target) sẽ là một echo server, để bạn có thể thấy những gì mục tiêu sẽ nhận được. Trong lệnh này, chúng tôi đã điền các đối số với relay, gateway và target từ ohttp.info.

Hãy thử tự chạy lệnh này!

Chúng tôi đã gặp nhiều trường hợp muốn truyền header đến relay thay vì đến mục tiêu. Bạn có thể làm điều đó với --first-hop-header:

Tương tự, chúng tôi cũng có những trường hợp muốn xác thực với relay bằng mTLS, để đảm bảo rằng đúng client đang giao tiếp với đúng relay. Để làm điều đó, bạn có thể sử dụng --first-hop-client và --first-hop-key.

Và nó hoạt động ngay lập tức. Bạn cần kiểm thử một yêu cầu Oblivious HTTP đầy đủ với relay, gateway, các header tùy ý và mTLS? Hay có lẽ chỉ cần yêu cầu thông qua gateway? Hoặc có thể bạn chỉ muốn xem cấu hình khóa OHTTP? pvcli có thể thực hiện tất cả chỉ với một lệnh duy nhất, bao gồm cả việc gỡ lỗi.

Tại sao lại tự xây dựng công cụ riêng?

Đã có một số công cụ tuyệt vời cho OHTTP tồn tại. Bản triển khai Rust của Martin Thomson và bản triển khai Go của Chris Wood đã cực kỳ hữu ích khi chúng tôi xây dựng bản triển khai OHTTP ban đầu vài năm trước. Nhưng pvcli không chỉ tập trung vào OHTTP. Chúng tôi đang tìm cách thêm càng nhiều giao thức bảo mật quyền riêng tư càng tốt vào công cụ này. Vì vậy, mặc dù có những công cụ mã nguồn mở khác để gỡ lỗi OHTTP, nhưng chưa có công cụ nào kết hợp OHTTP, CONNECT proxying, MASQUE và Privacy Pass (sắp ra mắt) vào cùng một nơi.

Đọc bài gốc

Bài viết được AI dịch và tổng hợp tự động từ Cloudflare Blog. Liên kết bài gốc ở phía trên. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.