INTEGRITY Dokumentace

Workers Logpush

AI Gateway umožňuje bezpečně exportovat protokoly do externího úložiště, kde je můžete dešifrovat a zpracovat. Workers Logpush lze zapnout a vypnout v Cloudflare dashboard nastavení. Tento produkt je dostupný v plánu Workers Paid. Informace o cenách najdete v Ceny.

Tento návod vysvětluje, jak nastavit Workers Logpush pro AI Gateway, vygenerovat pár klíčů RSA pro šifrování a po přijetí protokoly dešifrovat.

Na jeden gateway můžete uložit až 10 milionů protokolů. Po dosažení limitu se nové protokoly přestanou ukládat a nebudou exportovány přes Workers Logpush. Chcete-li pokračovat v ukládání a exportu protokolů, musíte starší protokoly smazat a uvolnit tak místo pro nové. Workers Logpush má limit 4 úloh a maximální velikost požadavku 1 MB na protokol.

Jak jsou protokoly šifrovány

Používáme hybridní model šifrování, který kombinuje efektivitu a bezpečnost. Pro každý protokol se nejprve vygeneruje klíč AES. Tento klíč AES ve skutečnosti šifruje většinu vašich dat, protože byl zvolen pro svou rychlost a bezpečnost při efektivní práci s rozsáhlými datasety.

Pro bezpečné sdílení tohoto klíče AES se dále používá šifrování RSA. Funguje to takto: klíč AES sice není nijak velký, přesto je potřeba ho bezpečně přenést k příjemci. Tento klíč zašifrujeme veřejným klíčem RSA příjemce. Tento krok využívá sílu RSA v bezpečné distribuci klíčů, takže klíč AES dokáže dešifrovat a použít jen ten, kdo vlastní odpovídající soukromý klíč RSA.

Po zašifrování se data zašifrovaná pomocí AES a klíč AES zašifrovaný pomocí RSA odešlou společně. Po doručení systém příjemce pomocí soukromého klíče RSA dešifruje klíč AES. Jakmile je klíč AES k dispozici, dešifrování hlavního datového payloadu je už jednoduché.

Tato metoda spojuje výhody obou přístupů: efektivitu AES pro šifrování dat s bezpečnou výměnou klíčů, kterou nabízí RSA, a po celou dobu životního cyklu dat tak zajišťuje optimální integritu, důvěrnost i výkon.

Nastavení Workers Logpush

Chcete-li nakonfigurovat Workers Logpush pro AI Gateway, postupujte takto:

1. Lokálně vygenerujte pár klíčů RSA

Pro šifrování a dešifrování protokolů musíte vygenerovat pár klíčů. Tento skript vypíše váš RSA privateKey a publicKey. Soukromý klíč uchovávejte v bezpečí, protože se používá k dešifrování protokolů. Níže najdete ukázkový skript pro generování klíčů pomocí Node.js a OpenSSL.

JavaScript
const crypto = require("crypto");

const { privateKey, publicKey } = crypto.generateKeyPairSync("rsa", {
	modulusLength: 4096,
	publicKeyEncoding: {
		type: "spki",
		format: "pem",
	},
	privateKeyEncoding: {
		type: "pkcs8",
		format: "pem",
	},
});

console.log(publicKey);
console.log(privateKey);

Skript spusťte provedením níže uvedeného kódu ve svém terminálu. Nahraďte file name názvem vašeho souboru JavaScript.

node {file name}
  1. Vygenerovat soukromý klíč: K vygenerování soukromého klíče RSA použijte následující příkaz:

    openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096
  2. Vygenerovat veřejný klíč: Po vygenerování soukromého klíče můžete odpovídající veřejný klíč extrahovat pomocí:

    openssl rsa -pubout -in private_key.pem -out public_key.pem

2. Nahrajte veřejný klíč do nastavení gateway

Jakmile vygenerujete pár klíčů, nahrajte veřejný klíč do nastavení AI Gateway. Tento klíč bude použit k šifrování vašich protokolů. Aby bylo možné povolit Workers Logpush, musíte mít pro daný gateway povolené protokoly.

3. Nastavte Logpush

Nahráním veřejného klíče povolíte Workers Logpush pro gateway, protokoly se ale nebudou exportovat, dokud také nevytvoříte a nepovolíte úlohu Logpush, která určuje, kam se mají odesílat. Oba kroky jsou povinné.

Chcete-li vytvořit úlohu Logpush, zvolte cíl a postupujte podle kroků v Povolit cíle dokumentaci. Chcete-li například exportovat protokoly do Cloudflare R2, přejděte na Povolení Cloudflare R2. Při konfiguraci úlohy vyberte dataset AI Gateway.

4. Přijměte šifrované protokoly

Po nakonfigurování Workers Logpush se protokoly budou odesílat zašifrované pomocí veřejného klíče, který jste nahráli. Abyste se k datům dostali, budete je muset dešifrovat svým soukromým klíčem. Protokoly se odesílají poskytovateli objektového úložiště, kterého jste vybrali.

5. Dešifrujte protokoly

Chcete-li dešifrovat šifrovaná těla protokolů a metadata z AI Gateway, můžete použít následující skript Node.js nebo OpenSSL:

Chcete-li dešifrovat šifrovaná těla protokolů a metadata z AI Gateway, stáhněte protokoly do složky, v tomto případě nazvané my_log.log.gz.

Poté zkopírujte tento soubor JavaScript do stejné složky a svůj soukromý klíč vložte do proměnné v horní části.

JavaScript
const privateKeyStr = `-----BEGIN RSA PRIVATE KEY-----
....
-----END RSA PRIVATE KEY-----`;

const crypto = require("crypto");
const privateKey = crypto.createPrivateKey(privateKeyStr);

const fs = require("fs");
const zlib = require("zlib");
const readline = require("readline");

async function importAESGCMKey(keyBuffer) {
	try {
		// Ensure the key length is valid for AES
		if ([128, 192, 256].includes(256)) {
			return await crypto.webcrypto.subtle.importKey(
				"raw",
				keyBuffer,
				{
					name: "AES-GCM",
					length: 256,
				},
				true, // Whether the key is extractable (true in this case to allow for export later if needed)
				["encrypt", "decrypt"], // Use for encryption and decryption
			);
		} else {
			throw new Error("Invalid AES key length. Must be 128, 12, or 256 bits.");
		}
	} catch (error) {
		console.error("Failed to import key:", error);
		throw error;
	}
}

async function decryptData(encryptedData, aesKey, iv) {
	const decryptedData = await crypto.subtle.decrypt(
		{ name: "AES-GCM", iv: iv },
		aesKey,
		encryptedData,
	);
	return new TextDecoder().decode(decryptedData);
}

async function decryptBase64(privateKey, data) {
	if (data.key === undefined) {
		return data;
	}

	const aesKeyBuf = crypto.privateDecrypt(
		{
			key: privateKey,
			oaepHash: "SHA256",
		},
		Buffer.from(data.key, "base64"),
	);
	const aesKey = await importAESGCMKey(aesKeyBuf);

	const decryptedData = await decryptData(
		Buffer.from(data.data, "base64"),
		aesKey,
		Buffer.from(data.iv, "base64"),
	);

	return decryptedData.toString();
}

async function run() {
	let lineReader = readline.createInterface({
		input: fs.createReadStream("my_log.log.gz").pipe(zlib.createGunzip()),
	});

	lineReader.on("line", async (line) => {
		line = JSON.parse(line);

		const { Metadata, RequestBody, ResponseBody, ...remaining } = line;

		console.log({
			...remaining,
			Metadata: await decryptBase64(privateKey, Metadata),
			RequestBody: await decryptBase64(privateKey, RequestBody),
			ResponseBody: await decryptBase64(privateKey, ResponseBody),
		});
		console.log("--");
	});
}

run();

Skript spusťte provedením níže uvedeného kódu ve svém terminálu. Nahraďte file name názvem vašeho souboru JavaScript.

node {file name}

Skript čte šifrovaný soubor protokolu (my_log.log.gz), dešifruje metadata, tělo požadavku a tělo odpovědi a vypíše dešifrovaná data. Nezapomeňte nahradit privateKey proměnnou na váš skutečný soukromý klíč RSA, který jste vygenerovali v kroku 1.

  1. Dešifrujte zašifrovaný soubor protokolu pomocí soukromého klíče.

Za předpokladu, že protokoly byly zašifrovány veřejným klíčem (například public_key.pem), můžete použít soukromý klíč (private_key.pem) k dešifrování souboru protokolu.

Pokud jsou například šifrované protokoly v souboru s názvem encrypted_logs.bin, můžete ho dešifrovat takto:

openssl rsautl -decrypt -inkey private_key.pem -in encrypted_logs.bin -out decrypted_logs.txt
  • -decrypt říká OpenSSL, že chceme soubor dešifrovat.
  • -inkey private_key.pem určuje soukromý klíč, který se použije k dešifrování protokolů.
  • -in encrypted_logs.bin je šifrovaný soubor protokolu.
  • -out decrypted_logs.txtDešifrované protokoly budou uloženy do tohoto souboru.
  1. Zobrazení dešifrovaných protokolů Po dešifrování si protokoly můžete zobrazit jednoduše spuštěním:
cat decrypted_logs.txt

Tento příkaz vypíše dešifrované protokoly do terminálu.