Files
go-lcg/docs/SECURITY_FEATURES.md

200 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🔒 Функции безопасности 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` - эта документация
---
**Результат**: Приложение теперь автоматически обеспечивает безопасность соединения в зависимости от конфигурации хоста!