Overview

API Gateway HTTP Oblivious Safe Browsing

Catatan: Dokumentasi ini masih dalam pengembangan. Nantikan peningkatan dalam waktu dekat.

Safe Browsing Oblivious HTTP Gateway API adalah API perlindungan privasi yang dibuat berdasarkan protokol RFC IETF bernama Oblivious HTTP, RFC 9458.

Ringkasan

Safe Browsing Oblivious HTTP Gateway API adalah layanan Google yang memungkinkan aplikasi klien memeriksa URL berdasarkan daftar resource web tidak aman yang terus diperbarui Google dengan menerapkan perlindungan privasi tambahan.

Hal ini dicapai melalui protokol ringan yang disebut Oblivious HTTP, atau disingkat OHTTP. Ini adalah protokol stateless yang dapat digunakan oleh klien Safe Browsing untuk mengakses Google Safe Browsing V5 API, guna mendapatkan perlindungan kuat dan cakupan yang lebih luas tanpa mengorbankan privasi pengguna.

CATATAN: API Google Safe Browsing V4 tidak dapat diakses melalui layanan ini.

Protokol HTTP Oblivious Safe Browsing

Protokol RFC

Oblivious HTTP adalah protokol ringan yang didefinisikan dalam RFC 9458, yang digunakan untuk mengenkripsi dan mengirim pesan HTTP dari klien ke server target. Layanan ini menggunakan layanan relai tepercaya dengan cara yang mengurangi penggunaan metadata oleh server target, seperti alamat IP dan informasi koneksi untuk identifikasi klien, sehingga memberikan privasi dan keamanan di atas protokol HTTP/S biasa. Protokol tersebut menggunakan HTTP Biner, yang didefinisikan dalam RFC 9292, untuk mengenkode/mendekode permintaan/respons HTTP.

Pada level tinggi, Relai berada di antara resource Klien dan Gateway yang menjadi proxy traffic klien dengan menghapus semua ID klien, termasuk atribut yang sensitif terhadap privasi seperti alamat IP, yang secara efektif menganonimkan permintaan HTTP yang masuk ke layanan Gateway. Keuntungan tambahan dari OHTTP adalah semua permintaan dienkripsi end-to-end, yang berarti kueri Safe Browsing klien (yaitu hash ekspresi URL yang terpotong) tidak terlihat oleh Relai. Lihat postingan blog untuk mengetahui contoh implementasi di Chrome.

Keseluruhan arsitektur layanan.
Gambar: Alur OHTTP.

Klien dapat memilih penyedia Relay apa pun (misalnya, Cepat) untuk berintegrasi dengan layanan. Relay harus menggunakan autentikasi Oauth 2.0 dengan cakupan otorisasi berikut agar dapat mengakses layanan.


// OAuth Authorization scope: https://www.googleapis.com/auth/3p-relay-safe-browsing
Endpoint API
Kunci Publik OHTTP

Endpoint ini akan menyediakan konfigurasi kunci publik OHTTP seperti yang ditentukan dalam RFC 9458, yang akan digunakan oleh klien untuk mengenkripsi permintaan OHTTP.


GET https://safebrowsingohttpgateway.googleapis.com/v1/ohttp/hpkekeyconfig?key=<API key>

Kunci API di atas tidak mutlak diperlukan; server tidak memvariasikan Kunci Publik OHTTP berdasarkan kunci API yang diberikan. Klien dapat menyelidiki fakta ini dengan menggunakan kunci API valid yang berbeda untuk mengakses endpoint ini atau tidak menggunakan kunci API sama sekali, dan memeriksa apakah responsnya memang berisi kunci publik OHTTP yang sama. Namun, untuk memudahkan proses debug, sebaiknya gunakan kunci API; ini memungkinkan klien melihat statistik seperti jumlah permintaan pada Konsol Google Cloud. Jika klien ingin menyediakan kunci API, baca dokumentasi ini tentang cara menyiapkan kunci API.

Seperti yang dinyatakan di bagian rekomendasi privasi, untuk memenuhi sasaran konsistensi utama, sebaiknya vendor Klien menyiapkan infrastruktur distribusi kunci terpusat untuk mengambil kunci dari endpoint ini, lalu mendistribusikannya ke aplikasi klien mereka.

Sesuai dengan panduan pengelolaan kunci, kunci dirotasi secara berkala di server. Klien harus memuat ulang kunci, yaitu, mengambil dan mengupdate salinan lokal kunci sesering mungkin untuk menghindari kegagalan dekripsi.

Klien harus memuat ulang (mengambil dan memperbarui) kunci publik sekali per hari. Jika mekanisme distribusi terpusat digunakan, mekanisme ini harus memastikan untuk mengambil dan mendistribusikan kunci sekali sehari.

Permintaan Enkapsulasi OHTTP

Endpoint ini akan melayani permintaan OHTTP yang disertakan dalam isi HTTP permintaan POST, dengan melakukan dekripsi permintaan, lalu mengenkripsi respons OHTTP untuk diteruskan kembali ke Relay dalam respons HTTP. Klien harus menyertakan header permintaan Content-Type sebagai message/ohttp-req dalam permintaan POST HTTP.


POST https://safebrowsingohttpgateway.googleapis.com/v1/ohttp:handleOhttpEncapsulatedRequest?key=<API key>

CATATAN: Sesuai dengan panduan tentang RFC, enkode permintaan dalam (lihat dokumentasi V5 tentang cara membuat permintaan Safe Browsing) menggunakan protokol HTTP Biner, RFC 9292.

Library Klien

Google Quiche memiliki implementasi sisi klien untuk protokol OHTTP dan BHTTP. Klien direkomendasikan untuk menggunakan library ini. Lihat kode semu di bawah tentang cara membangun permintaan OHTTP untuk mengakses API.

Contoh implementasi sisi klien

Klien mengambil kunci publik HTTP Oblivious dari endpoint kunci publik. Selanjutnya, inisialisasi konfigurasi kunci OHTTP quiche seperti itu, dan inisialisasi klien OHTTP quiche.


auto ohttp_key_cfgs = quiche::ObliviousHttpKeyConfigs::ParseConcatenatedKeys(std::string public_key); auto key_config = ohttp_key_cfgs->PreferredConfig(); auto public_key = ohttp_key_cfgs->GetPublicKeyForId(key_config.GetKeyId()) auto ohttp_client = quiche::ObliviousHttpClient::Create(public_key, key_config);

Klien akan menggunakan pengkodean HTTP Biner untuk membuat Permintaan BHTTP sebagai langkah pertama sebelum mengenkripsi.


quiche::BinaryHttpRequest::ControlData bhttp_ctrl_data{ .method = "POST", .scheme = "https", .authority = "safebrowsing.googleapis.com", .path = "/v5/hashes:search?key=<API key>&hashPrefixes=<HASH prefix 1>&hashPrefixes=<HASH prefix 2>", }; quiche::BinaryHttpRequest bhttp_request(bhttp_ctrl_data);

Klien selanjutnya akan mengenkripsi permintaan HTTP Biner yang dibuat pada langkah di atas.


auto bhttp_serialized = bhttp_request.Serialize(); auto ohttp_request = ohttp_client.CreateObliviousHttpRequest(*bhttp_serialized); // Client must include this in POST body, and add `Content-Type` header as "message/ohttp-req". auto payload_include_in_post_body = ohttp_request.EncapsulateAndSerialize();

Setelah respons diterima dari Relay, klien akan mendekripsi respons. Respons akan menyertakan header respons Content-Type sebagai ohttp-res.


auto ctx = std::move(ohttp_request).ReleaseContext(); auto ohttp_response = ohttp_client.DecryptObliviousHttpResponse("data included in body of http_response", ctx);

Setelah berhasil mendekripsi respons OHTTP, dekode outputnya menggunakan HTTP Biner.


auto bhttp_response = BinaryHttpResponse::Create(ohttp_response.GetPlaintextData()); if (bhttp_response.status_code() == 200) { auto http_response = bhttp_response.body(); auto response_headers = bhttp_response.GetHeaderFields(); }