feat(Docker, encryption): add mandatory ENCRYPTION_KEY environment variable for IPSec password encryption; update documentation and Docker configurations to reflect changes
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m18s
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m18s
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
docker run -d \
|
docker run -d \
|
||||||
--name s3-lists-manager \
|
--name s3-lists-manager \
|
||||||
-p 3001:3001 \
|
-p 3001:3001 \
|
||||||
|
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||||||
git.shts.su/[repository]:latest
|
git.shts.su/[repository]:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ docker run -d \
|
|||||||
docker run -d \
|
docker run -d \
|
||||||
--name s3-lists-manager-tabler \
|
--name s3-lists-manager-tabler \
|
||||||
-p 3001:3001 \
|
-p 3001:3001 \
|
||||||
|
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||||||
git.shts.su/[repository]:tabler
|
git.shts.su/[repository]:tabler
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -40,6 +42,7 @@ docker rm s3-lists-manager
|
|||||||
docker run -d \
|
docker run -d \
|
||||||
--name s3-lists-manager \
|
--name s3-lists-manager \
|
||||||
-p 3001:3001 \
|
-p 3001:3001 \
|
||||||
|
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||||||
git.shts.su/[repository]:latest
|
git.shts.su/[repository]:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -51,6 +54,7 @@ docker rm s3-lists-manager-tabler
|
|||||||
docker run -d \
|
docker run -d \
|
||||||
--name s3-lists-manager-tabler \
|
--name s3-lists-manager-tabler \
|
||||||
-p 3001:3001 \
|
-p 3001:3001 \
|
||||||
|
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||||||
git.shts.su/[repository]:tabler
|
git.shts.su/[repository]:tabler
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -70,6 +74,7 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
- NODE_ENV=production
|
- NODE_ENV=production
|
||||||
|
- ENCRYPTION_KEY=${ENCRYPTION_KEY} # Обязательно! Используйте .env файл или secrets
|
||||||
|
|
||||||
s3-lists-manager-tabler:
|
s3-lists-manager-tabler:
|
||||||
image: git.shts.su/[repository]:tabler
|
image: git.shts.su/[repository]:tabler
|
||||||
@@ -79,6 +84,12 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
- NODE_ENV=production
|
- NODE_ENV=production
|
||||||
|
- ENCRYPTION_KEY=${ENCRYPTION_KEY} # Обязательно! Используйте .env файл или secrets
|
||||||
|
```
|
||||||
|
|
||||||
|
**Создайте файл `.env` в той же директории:**
|
||||||
|
```bash
|
||||||
|
ENCRYPTION_KEY=your-64-hex-character-key-here
|
||||||
```
|
```
|
||||||
|
|
||||||
Запуск:
|
Запуск:
|
||||||
@@ -88,10 +99,31 @@ docker-compose up -d
|
|||||||
|
|
||||||
## 🔧 Переменные окружения
|
## 🔧 Переменные окружения
|
||||||
|
|
||||||
| Переменная | Описание | По умолчанию |
|
| Переменная | Описание | По умолчанию | Обязательная |
|
||||||
|------------|----------|--------------|
|
|------------|----------|--------------|--------------|
|
||||||
| `NODE_ENV` | Окружение Node.js | `production` |
|
| `NODE_ENV` | Окружение Node.js | `production` | Нет |
|
||||||
| `PORT` | Порт для запуска сервера | `3001` |
|
| `PORT` | Порт для запуска сервера | `3001` | Нет |
|
||||||
|
| `ENCRYPTION_KEY` | Ключ шифрования для IPSec паролей (64 hex символа) | - | **Да** |
|
||||||
|
|
||||||
|
### ENCRYPTION_KEY
|
||||||
|
|
||||||
|
**Важно**: `ENCRYPTION_KEY` является обязательным параметром для работы с IPSec паролями. Этот ключ используется для шифрования/дешифрования паролей, хранящихся в S3.
|
||||||
|
|
||||||
|
**Генерация ключа:**
|
||||||
|
```bash
|
||||||
|
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Пример запуска с ENCRYPTION_KEY:**
|
||||||
|
```bash
|
||||||
|
docker run -d \
|
||||||
|
--name s3-lists-manager \
|
||||||
|
-p 3001:3001 \
|
||||||
|
-e ENCRYPTION_KEY=your-64-hex-character-key-here \
|
||||||
|
git.shts.su/[repository]:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
**⚠️ Внимание**: Используйте один и тот же `ENCRYPTION_KEY` для всех запусков контейнера. При изменении ключа старые зашифрованные пароли не смогут быть расшифрованы.
|
||||||
|
|
||||||
## 📊 Мониторинг
|
## 📊 Мониторинг
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,11 @@ COPY backend/services ./services
|
|||||||
COPY backend/utils ./utils
|
COPY backend/utils ./utils
|
||||||
COPY --from=frontend-builder /app/frontend/dist ./public
|
COPY --from=frontend-builder /app/frontend/dist ./public
|
||||||
|
|
||||||
|
# ENCRYPTION_KEY должен быть установлен через переменные окружения при запуске контейнера
|
||||||
|
# Это обязательный параметр для работы с IPSec паролями
|
||||||
|
# Пример: docker run -e ENCRYPTION_KEY=your-64-hex-character-key ...
|
||||||
|
# Для генерации ключа: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
|
||||||
|
|
||||||
EXPOSE 3001
|
EXPOSE 3001
|
||||||
USER nonroot
|
USER nonroot
|
||||||
CMD ["server.js"]
|
CMD ["server.js"]
|
||||||
@@ -5,21 +5,38 @@
|
|||||||
|
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
|
|
||||||
// Ключ шифрования из переменной окружения
|
// Ключ шифрования из переменной окружения (обязателен для работы с IPSec паролями)
|
||||||
const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY || crypto.randomBytes(32).toString('hex');
|
const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY;
|
||||||
|
|
||||||
|
if (!ENCRYPTION_KEY) {
|
||||||
|
console.warn('WARNING: ENCRYPTION_KEY is not set. IPSec password encryption/decryption will fail.');
|
||||||
|
console.warn('Please set ENCRYPTION_KEY environment variable (64 hex characters for AES-256).');
|
||||||
|
console.warn('You can generate a key with: node -e "console.log(require(\'crypto\').randomBytes(32).toString(\'hex\'))"');
|
||||||
|
}
|
||||||
|
|
||||||
const ALGORITHM = 'aes-256-gcm';
|
const ALGORITHM = 'aes-256-gcm';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Получить ключ шифрования (32 байта)
|
* Получить ключ шифрования (32 байта)
|
||||||
*/
|
*/
|
||||||
function getEncryptionKey() {
|
function getEncryptionKey() {
|
||||||
// Если ENCRYPTION_KEY - hex строка, конвертируем в Buffer
|
if (!ENCRYPTION_KEY) {
|
||||||
if (ENCRYPTION_KEY.length === 64) {
|
throw new Error('ENCRYPTION_KEY environment variable is not set. Cannot encrypt/decrypt IPSec passwords.');
|
||||||
return Buffer.from(ENCRYPTION_KEY, 'hex');
|
|
||||||
}
|
}
|
||||||
// Иначе используем как есть и дополняем/обрезаем до 32 байт
|
|
||||||
|
// Если ENCRYPTION_KEY - hex строка (64 символа для 32 байт), конвертируем в Buffer
|
||||||
|
if (ENCRYPTION_KEY.length === 64) {
|
||||||
|
try {
|
||||||
|
return Buffer.from(ENCRYPTION_KEY, 'hex');
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(`Invalid ENCRYPTION_KEY format: not a valid hex string. ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Иначе используем как UTF-8 строку и дополняем/обрезаем до 32 байт
|
||||||
const key = Buffer.from(ENCRYPTION_KEY, 'utf8');
|
const key = Buffer.from(ENCRYPTION_KEY, 'utf8');
|
||||||
if (key.length === 32) return key;
|
if (key.length === 32) return key;
|
||||||
|
|
||||||
// Дополняем или обрезаем до 32 байт
|
// Дополняем или обрезаем до 32 байт
|
||||||
const result = Buffer.alloc(32);
|
const result = Buffer.alloc(32);
|
||||||
key.copy(result, 0, 0, Math.min(key.length, 32));
|
key.copy(result, 0, 0, Math.min(key.length, 32));
|
||||||
|
|||||||
Reference in New Issue
Block a user