ข้ามไปยังเนื้อหาหลัก

การเข้ารหัสฐานข้อมูล

Libre WebUI มีบริการเข้ารหัสระดับแอปพลิเคชันสำหรับค่าที่ละเอียดอ่อนก่อนเขียนลงพื้นที่เก็บข้อมูล

วิธีการเข้ารหัส

backend ใช้ AES-256-GCM ผ่าน crypto ของ 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 ทั้งหมด ไฟล์ต้นฉบับและ dependency ของโปรเจกต์ Work เป็นไฟล์ทั่วไปใน volume แบบมีชื่อของ Docker ที่จำกัดตามงาน การสนทนา Work ผลลัพธ์เครื่องมือ เอาต์พุตคำสั่ง และเมทาดาทางานเก็บใน SQLite และไม่ได้เข้ารหัสอัตโนมัติเพียงเพราะเส้นทางเก็บข้อมูลประจำตัวบางส่วนใช้บริการเข้ารหัส

เมื่อจำเป็น ให้ปกป้องรากข้อมูล Docker และ DATA_DIR ด้วยการควบคุมการเข้าถึงและการเข้ารหัสดิสก์ สำรองฐานข้อมูล ENCRYPTION_KEY และ volume Work ที่จัดการไว้พร้อมกัน การส่งงาน Work ไปยังโมเดลระยะไกลอาจเปิดเผยบริบทการสนทนาและเอาต์พุตไฟล์หรือคำสั่งที่ร้องขอแก่ผู้ให้บริการนั้น การเข้ารหัสพื้นที่เก็บข้อมูลไม่เปลี่ยนขอบเขตเครือข่ายดังกล่าว

Docker และ Kubernetes

กำหนดคีย์ที่เสถียรอย่างชัดเจนสำหรับ production:

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

เมานต์ DATA_DIR บนพื้นที่เก็บข้อมูลถาวร ใน Kubernetes ให้เก็บคีย์ใน Secret และเมานต์ข้อมูลบน PersistentVolume

การแก้ปัญหา

ความยาวคีย์ไม่ถูกต้อง

คีย์ต้องมีเลขฐานสิบหก 64 อักขระพอดี สร้างคีย์ใหม่ด้วย:

openssl rand -hex 32

ถอดรหัสข้อมูลไม่ได้หลังติดตั้งใหม่

ยืนยันว่าใช้ ENCRYPTION_KEY เดิมและเมานต์ volume DATA_DIR เดิม

สภาพแวดล้อมพัฒนาสร้างคีย์ใหม่

เก็บ DATA_DIR/.encryption_key ไว้กับฐานข้อมูล หรือกำหนดค่าเดียวกันผ่าน ENCRYPTION_KEY หากมีทั้งสองแหล่ง ค่าต้องตรงกัน

เอกสารที่เกี่ยวข้อง