add https server functionality - befor auth functionality implementation

This commit is contained in:
2025-10-23 11:41:03 +06:00
parent 3e1cb1e078
commit e1bd79db8c
27 changed files with 2164 additions and 97 deletions

199
SECURITY_FEATURES.md Normal file
View File

@@ -0,0 +1,199 @@
# 🔒 Функции безопасности LCG
## 🛡️ Автоматическое принуждение к HTTPS
### Логика безопасности
Приложение автоматически определяет, нужно ли использовать HTTPS:
1. **Небезопасные хосты** (не localhost/127.0.0.1) → **принудительно HTTPS**
2. **Безопасные хосты** (localhost/127.0.0.1) → HTTP (если не указано иное)
3. **Переменная `LCG_SERVER_ALLOW_HTTP=true`** → разрешает HTTP для любых хостов
### Примеры
```bash
# Небезопасно - принудительно HTTPS
LCG_SERVER_HOST=192.168.1.100 lcg serve
# Результат: https://192.168.1.100:8080
# Безопасно - HTTP по умолчанию
LCG_SERVER_HOST=localhost lcg serve
# Результат: http://localhost:8080
# Принудительно HTTP для любого хоста
LCG_SERVER_HOST=192.168.1.100 LCG_SERVER_ALLOW_HTTP=true lcg serve
# Результат: http://192.168.1.100:8080
```
## 🔐 SSL/TLS сертификаты
### Автоматическая генерация
Приложение автоматически генерирует самоподписанный сертификат если:
1. Не указаны переменные `LCG_SERVER_SSL_CERT_FILE` и `LCG_SERVER_SSL_KEY_FILE`
2. Не найдены файлы в `~/.config/lcg/server/ssl/cert.pem` и `~/.config/lcg/server/ssl/key.pem`
### Расположение сертификатов
``` text
~/.config/lcg/
├── config/
│ └── server/
│ └── ssl/
│ ├── cert.pem # Сертификат
│ └── key.pem # Приватный ключ
```
### Переменные окружения
| Переменная | Описание | По умолчанию |
|------------|----------|--------------|
| `LCG_CONFIG_FOLDER` | Папка конфигурации | `~/.config/lcg/config` |
| `LCG_SERVER_ALLOW_HTTP` | Разрешить HTTP для любых хостов | `false` |
| `LCG_SERVER_SSL_CERT_FILE` | Путь к сертификату | `""` (авто) |
| `LCG_SERVER_SSL_KEY_FILE` | Путь к ключу | `""` (авто) |
## 🚀 Примеры использования
### Безопасный режим (по умолчанию)
```bash
# Локальный сервер - HTTP
lcg serve
# Внешний сервер - принудительно HTTPS
LCG_SERVER_HOST=192.168.1.100 lcg serve
```
### Настройка SSL сертификатов
```bash
# Использовать собственные сертификаты
LCG_SERVER_SSL_CERT_FILE=/path/to/cert.pem \
LCG_SERVER_SSL_KEY_FILE=/path/to/key.pem \
lcg serve
# Разрешить HTTP для внешних хостов
LCG_SERVER_HOST=192.168.1.100 \
LCG_SERVER_ALLOW_HTTP=true \
lcg serve
```
### Docker контейнер
```dockerfile
FROM golang:1.21-alpine AS builder
# ... build steps ...
FROM alpine:latest
COPY --from=builder /app/lcg /usr/local/bin/
ENV LCG_SERVER_HOST=0.0.0.0
ENV LCG_SERVER_ALLOW_HTTP=false
CMD ["lcg", "serve"]
```
### Systemd сервис
```ini
[Unit]
Description=LCG Server
After=network.target
[Service]
Type=simple
User=lcg
WorkingDirectory=/opt/lcg
ExecStart=/opt/lcg/lcg serve
Environment=LCG_SERVER_HOST=0.0.0.0
Environment=LCG_SERVER_ALLOW_HTTP=false
Restart=always
[Install]
WantedBy=multi-user.target
```
## 🔧 Технические детали
### Генерация сертификата
Самоподписанный сертификат генерируется с:
- **Размер ключа**: 2048 бит RSA
- **Срок действия**: 1 год
- **Поддерживаемые хосты**: localhost, 127.0.0.1, указанный хост
- **Использование**: Server Authentication
### Безопасные хосты
Следующие хосты считаются безопасными для HTTP:
- `localhost`
- `127.0.0.1`
- `::1` (IPv6 localhost)
### Проверка безопасности
```go
// Проверка хоста
if !ssl.IsSecureHost(host) {
// Принудительно HTTPS
useHTTPS = true
}
// Проверка разрешения HTTP
if config.AppConfig.Server.AllowHTTP {
useHTTPS = false
}
```
## 🛠️ Отладка
### Проверка конфигурации
```bash
# Показать текущую конфигурацию
lcg config --full | jq '.server'
# Проверить SSL сертификаты
ls -la ~/.config/lcg/config/server/ssl/
# Проверить переменные окружения
env | grep LCG_SERVER
```
### Логи безопасности
```bash
# Запуск с отладкой
LCG_SERVER_HOST=192.168.1.100 lcg serve --debug
# Проверка SSL
openssl x509 -in ~/.config/lcg/config/server/ssl/cert.pem -text -noout
```
## ⚠️ Важные замечания
### Безопасность
1. **Самоподписанные сертификаты** - браузеры будут показывать предупреждение
2. **Продакшен** - используйте настоящие SSL сертификаты от CA
3. **Сетевой доступ** - HTTPS защищает трафик, но не аутентификацию
### Производительность
1. **HTTPS** - небольшая нагрузка на CPU для шифрования
2. **Сертификаты** - генерируются один раз, затем кэшируются
3. **Память** - сертификаты загружаются в память при запуске
## 📚 Связанные файлы
- `config/config.go` - конфигурация безопасности
- `ssl/ssl.go` - генерация и управление сертификатами
- `serve/serve.go` - HTTP/HTTPS сервер
- `SECURITY_FEATURES.md` - эта документация
---
**Результат**: Приложение теперь автоматически обеспечивает безопасность соединения в зависимости от конфигурации хоста!