montana/Русский/Сеть/ЗАЩИТА_СЕТИ_MONTANA.md

429 lines
15 KiB
Markdown
Raw Permalink 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.

# Montana Protocol — Security Specification
# Техническая спецификация защиты сети
**Version:** 2.0
**Status:** MAINNET
**Date:** 2026-01-23
**Authors:** Alejandro Montana
---
## Abstract
Montana Protocol представляет собой распределённую систему консенсуса, основанную на доказательстве присутствия во времени (Atemporal Coordinate Presence, ACP). Настоящая спецификация описывает криптографические, сетевые и программные защитные механизмы протокола.
Базовые защитные механизмы:
- **ML-DSA-65 (FIPS 204)** — постквантовая цифровая подпись
- **5-Node Leader Election** — распределённое управление без единой точки отказа
- **Attack Detection + Random Failover** — обнаружение атак и непредсказуемое переключение мастера
- **Breathing Sync** — git-синхронизация состояния сети
- **Temporal Coordinates (τ₁, τ₂, τ₃, τ₄)** — иерархические временные единицы
- **Halving Mechanism** — дефляционная эмиссия
- **AtlantGuard** — защита узла от ресурсных атак
---
## 1. Топология сети
### 1.1 Узлы сети
Montana Protocol функционирует на 5 географически распределённых узлах:
| Позиция | Узел | IP | Регион | Роль |
|---------|------|-----|--------|------|
| 0 | amsterdam | 72.56.102.240 | EU | PRIMARY |
| 1 | moscow | 176.124.208.93 | RU-Central | MIRROR 1 |
| 2 | almaty | 91.200.148.93 | KZ | MIRROR 2 |
| 3 | spb | 188.225.58.98 | RU-NW | MIRROR 3 |
| 4 | novosibirsk | 147.45.147.247 | RU-Siberia | MIRROR 4 |
**Исходный код:** [leader_election.py:39-46](Бот/leader_election.py#L39-L46)
```python
BOT_CHAIN: List[Tuple[str, str]] = [
("amsterdam", "72.56.102.240"),
("moscow", "176.124.208.93"),
("almaty", "91.200.148.93"),
("spb", "188.225.58.98"),
("novosibirsk", "147.45.147.247"),
]
```
### 1.2 Конфигурация узлов
Каждый узел идентифицируется через переменную окружения `MONTANA_NODE_NAME`:
```ini
[Service]
Environment="MONTANA_NODE_NAME=moscow"
Environment="PYTHONUNBUFFERED=1"
WatchdogSec=60
Restart=always
RestartSec=15
TimeoutStopSec=30
MemoryMax=512M
MemoryHigh=400M
```
**Исходный код:** [junona.service](Бот/junona.service)
---
## 2. Криптографическая безопасность
### 2.1 ML-DSA-65 (FIPS 204)
Montana Protocol использует постквантовый алгоритм подписи ML-DSA-65 (Module Lattice Digital Signature Algorithm), стандартизованный NIST как FIPS 204.
| Параметр | Значение |
|----------|----------|
| Алгоритм | ML-DSA-65 (Dilithium) |
| Стандарт | FIPS 204 |
| Уровень безопасности | NIST Level 3 |
| Private Key | 4032 байта |
| Public Key | 1952 байта |
| Signature | 3309 байт |
| Адрес | `mt` + SHA256(pubkey)[:20].hex() = 42 символа |
**Исходный код:** [node_crypto.py](Бот/node_crypto.py)
### 2.2 Формат адреса
```python
def generate_address(public_key: bytes) -> str:
"""Генерация Montana адреса из публичного ключа ML-DSA-65."""
hash_bytes = hashlib.sha256(public_key).digest()[:20]
return "mt" + hash_bytes.hex() # mt + 40 hex chars = 42 total
```
Пример адреса: `mt7a3f2e1d4c5b6a8f9e0d1c2b3a4f5e6d7c8b9a0`
---
## 3. Leader Election
### 3.1 Алгоритм выбора мастера
Детерминированный алгоритм определения активного мастера:
```python
def am_i_the_master(self) -> bool:
"""Проверяет, является ли текущий узел мастером."""
for name, ip in self.chain:
if name == self.node_name:
return True # Дошли до себя — я мастер
if check_node_health(ip):
return False # Узел выше жив — он мастер
return False
```
**Исходный код:** [leader_election.py:326-349](Бот/leader_election.py#L326-L349)
### 3.2 Health Check
Проверка здоровья узла выполняется через HTTP endpoint на порту 8889:
```python
def check_node_health(ip: str) -> bool:
"""Проверяет здоровье узла через HTTP health endpoint."""
try:
url = f"http://{ip}:8889/health"
response = requests.get(url, timeout=5)
return response.status_code == 200
except:
return False
```
**Исходный код:** [leader_election.py:102-134](Бот/leader_election.py#L102-L134)
### 3.3 Интервалы проверки
| Параметр | Значение | Назначение |
|----------|----------|------------|
| CHECK_INTERVAL | 5 сек | Интервал проверки здоровья узлов |
| STARTUP_DELAY | 7-15 сек | Задержка при старте (избежание конфликта polling) |
| FAILOVER_TIME | < 10 сек | Время переключения на резервный узел |
---
## 4. Обнаружение атак
### 4.1 AttackDetector
Класс `AttackDetector` отслеживает метрики, указывающие на атаку:
```python
class AttackDetector:
def __init__(self):
self.failure_count = 0
self.max_failures = 10
self.response_times = deque(maxlen=10)
self.cpu_threshold = 80.0
self.response_time_threshold = 5.0
self.network_threshold = 100 * 1024 * 1024 # 100 MB/s
self.under_attack = False
```
**Исходный код:** [leader_election.py:190-232](Бот/leader_election.py#L190-L232)
### 4.2 Метрики обнаружения атак
| Метрика | Порог | Действие |
|---------|-------|----------|
| CPU Usage | > 80% | Флаг атаки |
| Network Traffic | > 100 MB/s входящего | Флаг атаки |
| Failure Count | > 10 подряд | Флаг атаки |
| Response Time (avg) | > 5 секунд | Флаг атаки |
### 4.3 Random Failover при атаке
При обнаружении атаки цепочка узлов перемешивается случайным образом:
```python
def shuffle_chain_on_attack(self, external_trigger: bool = False):
"""Перемешивает цепочку при обнаружении атаки."""
if not self.attack_detector.is_under_attack() and not external_trigger:
return
logger.warning("АТАКА ОБНАРУЖЕНА! Переход на случайный failover")
shuffled = list(self.chain)
random.shuffle(shuffled)
healthy_nodes = [
(name, ip) for (name, ip) in shuffled
if check_node_health(ip)
]
if healthy_nodes:
self.chain = healthy_nodes
self.chain_shuffled = True
```
**Исходный код:** [leader_election.py:395-430](Бот/leader_election.py#L395-L430)
---
## 5. AtlantGuard — Защита узла
### 5.1 Архитектура
Класс `AtlantGuard` обеспечивает локальную защиту узла от ресурсных атак:
```python
class AtlantGuard:
def __init__(self):
self.start_time = time.time()
self.request_log = {}
self.registration_log = []
self.suspicious_ips = set()
self.blocked_ips = set()
self.cpu_history = [] # Буфер последних 5 измерений CPU
self.degraded_count = 0 # Счётчик высоких значений подряд
```
**Исходный код:** [junomontanaagibot.py:709-754](Бот/junomontanaagibot.py#L709-L754)
### 5.2 Health Check с защитой от ложных срабатываний
Метод `health_check()` использует скользящее среднее CPU для предотвращения ложных алертов:
```python
def health_check(self) -> Dict[str, Any]:
# Скользящее среднее CPU (последние 5 измерений)
cpu_instant = psutil.cpu_percent(interval=None)
self.cpu_history.append(cpu_instant)
if len(self.cpu_history) > 5:
self.cpu_history.pop(0)
cpu_avg = sum(self.cpu_history) / len(self.cpu_history)
# Защита от ложных спайков: требуем 3 подряд высоких значения
if cpu_avg > 90 or memory.percent > 90:
self.degraded_count += 1
if self.degraded_count >= 3:
status = "degraded"
else:
status = "healthy"
else:
status = "healthy"
self.degraded_count = 0
```
**Исходный код:** [junomontanaagibot.py:1001-1051](Бот/junomontanaagibot.py#L1001-L1051)
### 5.3 Пороги AtlantGuard
| Метрика | Порог | Статус |
|---------|-------|--------|
| CPU (среднее за 5 измерений) | > 90% | degraded (после 3 подряд) |
| Memory | > 90% | degraded (после 3 подряд) |
| Suspicious IPs | > 5 | degraded |
| Under attack flag | true | under_attack |
### 5.4 Rate Limiting
```python
MAX_REQUESTS_PER_MINUTE = 60 # Запросов/мин с одного источника
MAX_REGISTRATIONS_PER_HOUR = 20 # Новых регистраций/час
MAX_NODE_SYNCS_PER_MINUTE = 10 # Синхронизаций узла/мин
MAX_API_CALLS_PER_MINUTE = 100 # API вызовов/мин на endpoint
```
**Исходный код:** [junomontanaagibot.py:734-738](Бот/junomontanaagibot.py#L734-L738)
---
## 6. Breathing Sync
### 6.1 Механизм синхронизации
Git-синхронизация состояния сети каждые 12 секунд:
```
Цикл:
Вдох (Inhale) — git pull с rebase
12 секунд работы
Выдох (Exhale) — git add + commit + push
Повтор
```
**Исходный код:** [breathing_sync.py](Бот/breathing_sync.py)
### 6.2 Интеграция с Leader Election
Breathing Sync активируется только для мастер-узла:
```python
only_when_master=True
is_master_func=lambda: self.is_master
```
---
## 7. Временные координаты
### 7.1 Иерархия
| Единица | Длительность | Назначение |
|---------|--------------|------------|
| **τ₁** | 60 секунд | Интервал подписи Presence Proof |
| **τ₂** | 600 секунд (10 минут) | Слайс эмиссии |
| **τ₃** | 1,209,600 секунд (14 дней) | Checkpoint |
| **τ₄** | 126,144,000 секунд (4 года) | Эпоха халвинга |
### 7.2 Соотношения
```
1 τ₄ = 104 τ₃ = 209,664 τ₂ = 126,144,000 секунд
1 τ₃ = 2016 τ₂ = 1,209,600 секунд
1 τ₂ = 10 τ₁ = 600 секунд
```
**Исходный код:** [time_bank.py:44-80](Бот/time_bank.py#L44-L80)
---
## 8. TIME_BANK
### 8.1 Резерв
```python
BANK_TOTAL_MINUTES = 21_000_000 # 21 млн минут (~40 лет)
BANK_TOTAL_SECONDS = 1_260_000_000 # 1.26 млрд секунд
```
### 8.2 Halving
```python
def halving_coefficient(tau4_count: int) -> float:
"""Коэффициент халвинга для текущей эпохи."""
return 1.0 / (2 ** tau4_count)
```
| Эпоха τ₄ | Годы | Коэффициент | 1 секунда = |
|----------|------|-------------|-------------|
| 0 | 0-4 | 1.0 | 1.0 Ɉ |
| 1 | 4-8 | 0.5 | 0.5 Ɉ |
| 2 | 8-12 | 0.25 | 0.25 Ɉ |
| 3 | 12-16 | 0.125 | 0.125 Ɉ |
**Исходный код:** [time_bank.py:88-113](Бот/time_bank.py#L88-L113)
---
## 9. Синхронизация сети
### 9.1 Состояние на 2026-01-23
| Узел | MD5 Hash | Статус | Python | telegram-bot |
|------|----------|--------|--------|--------------|
| amsterdam | 5a0ac1903151eef7a85cd72f3060eb6c | active | 3.12.3 | 22.5 |
| moscow | 5a0ac1903151eef7a85cd72f3060eb6c | active | 3.12.3 | 22.5 |
| almaty | 5a0ac1903151eef7a85cd72f3060eb6c | active | 3.12.3 | 22.5 |
| spb | 5a0ac1903151eef7a85cd72f3060eb6c | active | 3.12.3 | 22.5 |
| novosibirsk | 5a0ac1903151eef7a85cd72f3060eb6c | active | 3.12.3 | 22.5 |
### 9.2 Деплой
Rolling deploy выполняется скриптом `deploy_nodes.sh`:
```bash
./deploy_nodes.sh # Rolling deploy (по одному)
./deploy_nodes.sh --fast # Быстрый deploy (опасно)
./deploy_nodes.sh --node moscow # Только один узел
```
**Исходный код:** [deploy_nodes.sh](Бот/deploy_nodes.sh)
---
## 10. Файловая структура
```
Монтана_Montana_蒙大拿/Русский/Бот/
├── junomontanaagibot.py # Главный бот (229 KB)
├── leader_election.py # Leader Election + AttackDetector
├── time_bank.py # TIME_BANK + Presence Proofs
├── node_crypto.py # ML-DSA-65 криптография
├── breathing_sync.py # Git синхронизация
├── montana_db.py # База данных + Event Sourcing
├── junona_ai.py # AI интеграция (OpenAI/Anthropic)
├── contracts.py # Смарт-контракты времени
├── deploy_nodes.sh # Скрипт деплоя
└── junona.service # Systemd unit
```
---
## 11. Известные ограничения
| Проблема | Severity | Статус |
|----------|----------|--------|
| Split-brain через local lock | HIGH | Требует distributed lock |
| tau4_count не персистит | MEDIUM | Сбрасывается при рестарте |
| time.time() может быть изменён root | LOW | Требует time.monotonic() + NTP |
| Presence Proofs не верифицируются | MEDIUM | Генерируются, но не проверяются |
---
## Заключение
Montana Protocol реализует многоуровневую защиту:
1. **Постквантовая криптография (ML-DSA-65)** — защита от квантовых компьютеров
2. **5-Node Leader Election** — отсутствие единой точки отказа
3. **AtlantGuard со скользящим средним** — защита от ложных алертов
4. **Random Failover** — непредсказуемость при атаке
5. **Breathing Sync** — консистентность состояния сети
---
```
Alejandro Montana
Montana Protocol Security Specification v2.0
2026-01-23
```