مدونة Analytics House
ملاحظات معمارية حول بناء منصة تحليلات الويب الأكثر قابلية للتحقق في العالم بين المنصات التي تضع الخصوصية أولًا، على Cloudflare Workers وD1.
كيف يجعل الإتلاف اليومي للملح المؤقت تجزئات الزوار السابقة عصيّة على هجمات القوة الغاشمة
لأن IPv4 لا يضم سوى نحو 4.3 مليار عنوان، يمكن عكس تجزئة ثابتة لـ (IP + User-Agent) في دقائق باستخدام جدول قوس قزح (rainbow table) على وحدة GPU. إليك كيف يدوّر Analytics House ملحًا بطول 256 بت مولَّدًا عبر CSPRNG كل يوم UTC في Cloudflare D1، ويتلف ملح الأمس نهائيًا بمجرد إقفال الجداول التجميعية.
تحسب معظم منصات التحليلات «الخالية من ملفات تعريف الارتباط» تجزئة يومية لـ (daily_salt + site_id + IP + User-Agent) كي تتمكن من عدّ الزوار الفريدين يوميًا دون تعيين ملفات تعريف ارتباط في المتصفح. لكن إذا كان الملح مشتقًا من سرّ ثابت أو محفوظًا على القرص إلى أجل غير مسمّى، فإن أي شخص يخترق قاعدة البيانات، أو يفرض الوصول إليها بأمر قضائي، يستطيع تجربة فضاء عناوين IPv4 البالغ 32 بت بالكامل بالقوة الغاشمة لسلسلة User-Agent معروفة.
في Analytics House، يُولَّد لكل يوم UTC ملح عشوائي مستقل بطول 256 بت عبر crypto.getRandomValues()، ويُخزَّن في جدول meta في Cloudflare D1 تحت المفتاح salt:YYYY-MM-DD. وخلال اليوم، تحسب طلبات /collect الواردة في ذاكرة Worker معرّفَي الزائر والجلسة عبر SHA-256 مملّح ومقتطع إلى 64 بت، ثم تتخلص فورًا من عنوان IP الخاص بالعميل ومن سلسلة User-Agent الخام.
كل 15 دقيقة، يُقفل مُشغِّل Cron المجدول أيام UTC المكتملة في جداول تجميعية مُعدّة مسبقًا (rollup_day وrollup_dim). وبمجرد أن يتجاوز مؤشر التقدّم (watermark) يومَ UTC، تحذف الدالة shredExpiredSalts() كل ملح أقدم من المؤشر المُقفَل. وبمجرد محو ذلك المفتاح ذي الـ 256 بت، لا توجد طريقة عملية لربط معرّف زائر سابق بعنوان IP، أو لربط زيارات يوم بزيارات يوم آخر. وتظل المعرّفات بيانات مستعارة (pseudonymous)، لذا تظل بقية وسائل الحماية سارية.
وضع انعدام السجل الخام والتنقية التلقائية للبيانات الشخصية على الحافة في Cloudflare Workers
كثيرًا ما تُسرِّب عناوين URL في التطبيقات وحمولات الأحداث المخصّصة، عن طريق الخطأ، رموزَ إعادة التعيين أو معرّفات UUID أو عناوين البريد الإلكتروني أو أرقام بطاقات الائتمان. تعرّف على كيفية تعقيم جدار حماية البيانات الشخصية المتزامن على الحافة لبيانات القياس قبل الكتابة في D1، وكيف يحذف وضع انعدام السجل الخام صفوف الأحداث الخام نهائيًا عند إقفال الجداول التجميعية.
نادرًا ما يقصد المطوّرون إرسال بيانات شخصية إلى خدمة التحليلات، ومع ذلك فإن عناوين URL لإعادة تعيين كلمة المرور (/reset-password/eyJhbGci...)، ومسارات الملفات الشخصية للمستخدمين (/users/alice@example.com)، وخصائص إتمام الشراء، كثيرًا ما تسرّب سلاسل حساسة إلى قواعد بيانات التحليلات.
يشغّل Analytics House أداة حتمية لتنقية البيانات الشخصية داخل Cloudflare Worker قبل أن يصل أي حدث إلى D1. تُزال سلاسل الاستعلام والأجزاء (fragments) من عناوين URL؛ وتُحجب أثناء المعالجة مقاطع المسار المطابقة لعناوين البريد الإلكتروني ([email])، أو معرّفات UUID ([uuid])، أو رموز JWT ([jwt])، أو عناوين IPv4 ([ip])، أو الرموز عالية العشوائية بترميز hex/base64 ([token]). وتُفحص خصائص الأحداث المخصّصة بشكل تكراري بحثًا عن المفاتيح الحساسة (email وpassword وtoken وsecret وssn وphone وcredit_card وapi_key) وأرقام بطاقات الائتمان التي تجتاز التحقق بخوارزمية Luhn.
بالنسبة إلى الفرق التي تخضع لمتطلبات امتثال صارمة، يذهب تفعيل وضع انعدام السجل الخام (ephemeral_raw) خطوة أبعد: فعند إقفال يوم UTC في الجداول التجميعية، تُحذف فورًا الصفوف الخام الخاصة بذلك اليوم في جدول events، فلا يبقى سوى العدّادات اليومية المجمّعة.
ثقة معمارية بلا عناوين IP: مُرحِّل Cloudflare Worker من الطرف الأول
حتى عندما يتعهد مزوّد التحليلات بعدم تسجيل عناوين IP، فإن طلبات HTTPS العادية تظل تكشف عنوان IP الخاص بالزائر لخادم الحافة لدى المزوّد. ومع وكيل Cloudflare Worker من الطرف الأول الذي يُنشر بنقرة واحدة، يزيل نطاقك الخاص عنوان IP الخاص بالزائر قبل تمرير رمز ترحيل مُجهَّل الهوية.
في إعداد التحليلات التقليدي، يتصل متصفح الزائر مباشرةً بنطاق مزوّد التحليلات. وهذا يعني أن عليك الوثوق بسياسة المزوّد في عدم تسجيل CF-Connecting-IP.
ولأن Analytics House مبني على Cloudflare بالكامل (100%)، يُنشئ كل مشروع في لوحة التحكم سكربت Cloudflare Worker مستقلًا من الطرف الأول يمكنك نشره على مسار في نطاقك الخاص (مثل yoursite.com/_ea/*).
عندما يحمّل زائر موقعك، يستقبل Worker الخاص بك الطلب، ويحسب ملخّص SHA-256 بمفتاح سري لـ (UTC_date + CF-Connecting-IP + User-Agent) باستخدام قيمة سرية لا تغادر حساب Cloudflare الخاص بك أبدًا، ويزيل عنوان IP الخاص بالزائر، ثم لا يمرّر إلى Analytics House سوى الترويسة المُبهَمة X-EA-Visitor-Relay ورمز الدولة (موقع تقريبي).
هل تريد فحص الضمانات التشفيرية المباشرة؟
اقرأ مواصفات الخصوصية أو استكشف مرجع API.