إنتقل إلى المحتوى الرئيسي

تشفير قاعدة البيانات

يتضمن Libre WebUI خدمة تشفير على مستوى التطبيق لحماية القيم الحساسة قبل كتابتها في التخزين.

طريقة التشفير

يستخدم الخادم الخلفي AES-256-GCM عبر وحدة التشفير في Node.js. ويجب أن يبلغ طول مفتاح التشفير 32 بايت، ممثلًا بسلسلة سداسية عشرية من 64 حرفًا:

ENCRYPTION_KEY=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

أنشئ مفتاحًا:

openssl rand -hex 32

تخزين المفتاح

يحمّل Libre WebUI المفتاح بالترتيب التالي:

  1. ENCRYPTION_KEY من البيئة.
  2. ملف .encryption_key محفوظ تحت DATA_DIR المحدد.
  3. في مخزن جديد فقط، مفتاح يُنشأ حديثًا ويُكتب كتابة دائمة إلى DATA_DIR/.encryption_key قبل بدء قاعدة البيانات.

إذا وفرت البيئة والملف الدائم مفتاحًا، فيجب أن يتطابقا وإلا يفشل بدء التشغيل. كما يفشل بأمان أي مخزن مشفر قائم يفتقد مفتاحه الأصلي؛ ولا ينشئ Libre مفتاحًا بديلًا لمخزن موجود.

قواعد مهمة للمفتاح

  • انسخ ENCRYPTION_KEY احتياطيًا مع قاعدة البيانات.
  • لا تدوّر المفتاح ما لم تكن لديك خطة لترحيل القيم المشفرة.
  • يعني فقدان المفتاح تعذر استعادة القيم المشفرة.
  • يؤدي تغيير المفتاح من دون إعادة تشفير البيانات إلى تعذر قراءة القيم المشفرة القائمة.

ما الذي يحميه

يُطبق التشفير في مسارات الشيفرة التي تستخدم خدمة التشفير أو مساعدات التخزين المشفر. وهو مصمم لقيم التطبيق الحساسة مثل بيانات الاعتماد وبيانات المستخدم الخاصة التي تعالجها تلك المساعدات.

وليس تشفيرًا للقرص بالكامل، ولا تشفيرًا لصفحات SQLite، ولا تشفيرًا شاملًا بين المستخدم والمتصفح. استخدم تشفير القرص وHTTPS لتلك الطبقات.

بيانات Work

لا يشفّر تشفير التطبيق مهمة Work كاملة. فملفات المصدر وتبعيات المشروع ملفات عادية في وحدات تخزين Docker مسماة خاصة بكل مهمة. وتُخزن محادثات Work ونتائج الأدوات ومخرجات الأوامر وبيانات المهام الوصفية في SQLite، ولا تصبح مشفرة تلقائيًا لمجرد أن بعض مسارات تخزين بيانات الاعتماد تستخدم خدمة التشفير.

احمِ جذر بيانات Docker وDATA_DIR بضوابط وصول وتشفير للقرص عند الحاجة. وانسخ قاعدة البيانات وENCRYPTION_KEY ووحدات تخزين Work المُدارة احتياطيًا معًا. وقد يكشف إرسال مهمة Work إلى نموذج بعيد سياق المحادثة ومخرجات الملفات أو الأوامر المطلوبة لذلك المزوّد؛ ولا يغير تشفير التخزين هذه الحدود الشبكية.

Docker وKubernetes

اضبط مفتاحًا ثابتًا صراحة للإنتاج:

ENCRYPTION_KEY=replace-with-64-hex-characters
DATA_DIR=/data

ركّب DATA_DIR على تخزين دائم. وفي Kubernetes، خزّن المفتاح في Secret واربط البيانات بـ PersistentVolume.

استكشاف الأخطاء وإصلاحها

طول مفتاح غير صالح

يجب أن يتكون المفتاح من 64 حرفًا سداسيًا عشريًا بالضبط. أنشئ مفتاحًا جديدًا باستخدام:

openssl rand -hex 32

تعذر فك تشفير البيانات بعد إعادة النشر

تحقق من استخدام ENCRYPTION_KEY نفسه وتركيب وحدة DATA_DIR نفسها.

أنشأ التطوير مفتاحًا جديدًا

احتفظ بـ DATA_DIR/.encryption_key مع قاعدة البيانات. ويمكنك بدلًا من ذلك ضبط القيمة نفسها عبر ENCRYPTION_KEY؛ وإذا وُجد المصدران فيجب أن يتطابقا.

وثائق ذات صلة