INTEGRITY Документация

Workers Logpush

AI Gateway позволяет безопасно экспортировать логи во внешнее хранилище, где их можно расшифровать и обработать. Вы можете включать и отключать Workers Logpush в Панель управления Cloudflare параметры. Этот продукт доступен на плане Workers Paid. Информацию о ценах см. в Цены.

Это руководство объясняет, как настроить Workers Logpush для AI Gateway, сгенерировать пару ключей RSA для шифрования и расшифровать логи после их получения.

Вы можете хранить до 10 миллионов логов на шлюз. При достижении лимита новые логи перестанут сохраняться и не будут экспортироваться через Workers Logpush. Чтобы продолжить сохранять и экспортировать логи, необходимо удалить более старые логи и освободить место для новых. Workers Logpush поддерживает не более 4 заданий и максимальный размер запроса 1 МБ на лог.

Как шифруются журналы

Мы используем гибридную модель шифрования для повышения эффективности и безопасности. Сначала для каждого лога генерируется ключ AES. Именно этот ключ AES фактически шифрует основную часть ваших данных: он выбран за скорость и надёжность при эффективной обработке больших датасетов.

Для безопасной передачи этого ключа AES мы используем шифрование RSA. Вот как это происходит: ключ AES, несмотря на свою легковесность, должен быть безопасно передан получателю. Мы шифруем этот ключ открытым ключом RSA получателя. Этот шаг использует сильную сторону RSA в безопасном распределении ключей, гарантируя, что расшифровать и использовать ключ AES сможет только тот, у кого есть соответствующий закрытый ключ RSA.

После шифрования данные, зашифрованные с помощью AES, и ключ AES, зашифрованный с помощью RSA, отправляются вместе. По прибытии система получателя использует закрытый ключ RSA для расшифровки ключа AES. Получив ключ AES, легко расшифровать основной payload данных.

Этот метод сочетает в себе лучшее из двух миров: эффективность AES для шифрования данных и надёжный обмен ключами RSA, что обеспечивает оптимальную целостность, конфиденциальность и производительность на всех этапах жизненного цикла данных.

Настройка Workers Logpush

Чтобы настроить Workers Logpush для AI Gateway, выполните следующие шаги:

1. Локальная генерация пары ключей RSA

Для шифрования и расшифровки логов необходимо сгенерировать пару ключей. Скрипт выведет ваши RSA privateKey и publicKey. Приватный ключ храните в безопасности: он используется для расшифровки логов. Ниже приведен пример скрипта для генерации ключей с помощью Node.js и 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);

Запустите скрипт, выполнив приведённый ниже код в терминале. Замените file name именем вашего файла JavaScript.

node {file name}
  1. Создание закрытого ключа: Используйте следующую команду для создания закрытого ключа RSA:

    openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096
  2. Создание открытого ключа: После создания закрытого ключа вы можете извлечь соответствующий открытый ключ с помощью:

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

2. Загрузка публичного ключа в настройки шлюза

После того как вы сгенерируете пару ключей, загрузите открытый ключ в настройки AI Gateway. Этот ключ будет использоваться для шифрования ваших журналов. Чтобы включить Workers Logpush, для этого шлюза должны быть включены журналы.

3. Настройка Logpush

Загрузка открытого ключа включает Workers Logpush для шлюза, но логи не будут экспортироваться, пока вы также не создадите и не включите задание Logpush с указанием места отправки. Необходимо выполнить оба шага.

Чтобы создать задание Logpush, выберите назначение и выполните шаги, описанные в Включите получателей документацию. Например, чтобы экспортировать журналы в Cloudflare R2, обратитесь к Включите Cloudflare R2. При настройке задания выберите датасет AI Gateway.

4. Получение зашифрованных логов

После настройки Workers Logpush логи будут отправляться в зашифрованном виде с использованием загруженного вами открытого ключа. Чтобы получить доступ к данным, вам потребуется расшифровать их с помощью закрытого ключа. Логи будут отправляться выбранному вами провайдеру объектного хранилища.

5. Расшифровка логов

Чтобы расшифровать зашифрованные тела логов и метаданные из AI Gateway, можно использовать следующий скрипт Node.js или OpenSSL:

Чтобы расшифровать зашифрованные тела логов и метаданные из AI Gateway, скачайте логи в папку, в этом примере она называется my_log.log.gz.

Затем скопируйте этот файл JavaScript в ту же папку и вставьте свой закрытый ключ в переменную в начале файла.

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();

Запустите скрипт, выполнив приведённый ниже код в терминале. Замените file name именем вашего файла JavaScript.

node {file name}

Скрипт считывает зашифрованный файл журнала (my_log.log.gz), расшифровывает метаданные, тело запроса и тело ответа, а затем выводит расшифрованные данные. Обязательно замените privateKey переменную на ваш фактический приватный RSA-ключ, который вы сгенерировали на шаге 1.

  1. Расшифруйте зашифрованный файл лога с помощью закрытого ключа.

Предположим, что логи были зашифрованы с помощью открытого ключа (например, public_key.pem), вы можете использовать закрытый ключ (private_key.pem) для расшифровки файла журнала.

Например, если зашифрованные логи находятся в файле с именем encrypted_logs.bin, вы можете расшифровать его следующим образом:

openssl rsautl -decrypt -inkey private_key.pem -in encrypted_logs.bin -out decrypted_logs.txt
  • -decrypt сообщает OpenSSL, что мы хотим расшифровать файл.
  • -inkey private_key.pem указывает приватный ключ, который будет использоваться для расшифровки журналов.
  • -in encrypted_logs.bin представляет собой зашифрованный файл журнала.
  • -out decrypted_logs.txtрасшифрованные логи будут сохранены в этот файл.
  1. Просмотр расшифрованных логов После расшифровки вы можете просмотреть логи, просто выполнив:
cat decrypted_logs.txt

Эта команда выводит расшифрованные логи в терминал.