mirror of
https://github.com/Direct-Dev-Ru/go-lcg.git
synced 2025-11-16 01:29:55 +00:00
200 lines
6.2 KiB
Markdown
200 lines
6.2 KiB
Markdown
# 🔒 Функции безопасности 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` - эта документация
|
||
|
||
---
|
||
|
||
**Результат**: Приложение теперь автоматически обеспечивает безопасность соединения в зависимости от конфигурации хоста!
|