ваше сообщение коммита

This commit is contained in:
2025-07-27 03:30:13 +03:00
parent 057fe6254c
commit 1835632be9
141 changed files with 32514 additions and 6661 deletions

240
docs/ENCRYPTION_GUIDE.md Normal file
View File

@@ -0,0 +1,240 @@
# 🔐 Полное шифрование всех таблиц в DLE
## 📋 Обзор
Этот подход шифрует **ВСЕ текстовые данные** во **ВСЕХ таблицах** базы данных.
## 🎯 Что шифруется
### **✅ ВСЕ текстовые колонки во ВСЕХ таблицах:**
- `text` - текстовые поля
- `varchar` - строки переменной длины
- `character varying` - строки переменной длины
- `json` - JSON данные
- `jsonb` - бинарные JSON данные
### **❌ НЕ шифруются:**
- `id` - идентификаторы
- `created_at`, `updated_at` - временные метки
- `integer`, `numeric`, `boolean` - числовые и логические типы
- Колонки, уже содержащие `_encrypted` в названии
## 🚀 Пошаговая инструкция
### **Шаг 1: Запуск полного шифрования**
```bash
chmod +x encrypt-all-tables.sh
./encrypt-all-tables.sh
```
### **Шаг 2: Проверка шифрования**
```bash
./decrypt-all-tables.sh
```
### **Шаг 3: Обновление кода приложения**
#### **A. Использование универсального сервиса**
```javascript
const encryptedDataService = require('./services/encryptedDataService');
// Получение данных с автоматической расшифровкой
const users = await encryptedDataService.getData('users', { role: 'admin' });
// Сохранение данных с автоматическим шифрованием
const newUser = await encryptedDataService.saveData('users', {
name: 'Иван Иванов',
email: 'ivan@example.com',
preferences: { theme: 'dark' }
});
// Обновление данных
const updatedUser = await encryptedDataService.saveData('users',
{ name: 'Иван Петров' },
{ id: 1 }
);
// Удаление данных
await encryptedDataService.deleteData('users', { id: 1 });
```
#### **B. Проверка статуса шифрования**
```javascript
const status = await encryptedDataService.getEncryptionStatus();
console.log('Статус шифрования:', status);
// {
// hasEncryptionKey: true,
// encryptedTables: [
// { table_name: 'users', encrypted_columns: '3' },
// { table_name: 'messages', encrypted_columns: '2' }
// ],
// totalEncryptedColumns: 15
// }
```
### **Шаг 4: Обновление существующих роутов**
#### **Пример обновления роута пользователей:**
```javascript
// Было:
router.get('/users', async (req, res) => {
const { rows } = await db.getQuery()('SELECT * FROM users');
res.json(rows);
});
// Стало:
router.get('/users', async (req, res) => {
try {
const users = await encryptedDataService.getData('users');
res.json(users);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
```
#### **Пример обновления роута сообщений:**
```javascript
// Было:
router.post('/messages', async (req, res) => {
const { content, user_id } = req.body;
const { rows } = await db.getQuery()(
'INSERT INTO messages (content, user_id) VALUES ($1, $2) RETURNING *',
[content, user_id]
);
res.json(rows[0]);
});
// Стало:
router.post('/messages', async (req, res) => {
try {
const { content, user_id } = req.body;
const message = await encryptedDataService.saveData('messages', {
content,
user_id
});
res.json(message);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
```
### **Шаг 5: Тестирование**
```bash
# Проверить работу зашифрованных данных
curl -X GET http://localhost:8000/api/users
curl -X POST http://localhost:8000/api/messages -H "Content-Type: application/json" -d '{"content":"Тестовое сообщение","user_id":1}'
# Проверить расшифровку
./decrypt-all-tables.sh
```
### **Шаг 6: Удаление незашифрованных колонок**
```bash
# ВНИМАНИЕ: Это необратимая операция!
./remove-unencrypted-columns.sh
```
## 🔑 Управление ключами
### **Ключ шифрования**
- **Файл**: `./ssl/keys/full_db_encryption.key`
- **Размер**: 32 байта (base64)
- **Алгоритм**: AES-256-CBC
### **Безопасность ключа**
```bash
# Права доступа
chmod 600 ./ssl/keys/full_db_encryption.key
# Резервная копия
cp ./ssl/keys/full_db_encryption.key ./ssl/keys/full_db_encryption.key.backup
# Проверка целостности
sha256sum ./ssl/keys/full_db_encryption.key
```
## 🛡️ Дополнительные меры безопасности
### **1. Шифрование томов Docker**
```yaml
# docker-compose.yml
volumes:
postgres_data:
driver: local
driver_opts:
type: none
o: bind
device: /path/to/encrypted/storage
```
### **2. SSL/TLS для PostgreSQL**
```yaml
# docker-compose.yml
services:
postgres:
command: >
postgres
-c ssl=on
-c ssl_cert_file=/etc/ssl/certs/server.crt
-c ssl_key_file=/etc/ssl/certs/server.key
```
### **3. Шифрование переменных окружения**
```bash
# Для оставшихся переменных окружения
./encrypt-env.sh
```
## 🔍 Мониторинг и аудит
### **Логирование доступа к зашифрованным данным**
```javascript
// В сервисе добавить логирование
console.log(`🔐 Доступ к зашифрованным данным: ${tableName} в ${new Date().toISOString()}`);
```
### **Проверка целостности**
```bash
# Скрипт для проверки целостности зашифрованных данных
./verify-encryption.sh
```
## ⚠️ Важные замечания
### **1. Производительность**
- Шифрование/расшифровка добавляет задержку
- Используйте кэширование для часто используемых данных
- Рассмотрите индексы для зашифрованных колонок
### **2. Резервное копирование**
- **Обязательно** делайте бэкап ключа шифрования
- **Обязательно** делайте бэкап базы данных
- Храните ключ отдельно от данных
### **3. Восстановление**
```bash
# Восстановление из бэкапа
docker exec dapp-postgres psql -U dapp_user -d dapp_db < backup.sql
# Восстановление ключа
cp ./ssl/keys/full_db_encryption.key.backup ./ssl/keys/full_db_encryption.key
```
### **4. Совместимость**
- Приложение работает с зашифрованными и незашифрованными данными
- Fallback на незашифрованные данные при отсутствии ключа
- Постепенная миграция существующих данных
## 🎯 Результат
После применения полного шифрования:
-ВСЕ текстовые данные зашифрованы в БД
- ✅ Ключ шифрования хранится отдельно
- ✅ Приложение работает с зашифрованными данными
- ✅ Fallback на незашифрованные данные при отсутствии ключа
- ✅ Универсальный сервис для работы с данными
- ✅ Возможность ротации ключей
**Максимальная безопасность данных достигнута!** 🔒