224 lines
11 KiB
Markdown
224 lines
11 KiB
Markdown
|
|
# Система Ключей Montana Protocol
|
|||
|
|
|
|||
|
|
## Простыми словами
|
|||
|
|
|
|||
|
|
Представь что у тебя есть:
|
|||
|
|
1. **Ключи от машины** — чтобы ездить и управлять
|
|||
|
|
2. **Ключи от сейфа** — где лежат твои деньги
|
|||
|
|
|
|||
|
|
Это РАЗНЫЕ ключи. Если украдут ключи от машины — деньги в сейфе целы.
|
|||
|
|
|
|||
|
|
В Montana Protocol так же:
|
|||
|
|
- **Операционные ключи** (keychain) = ключи от машины
|
|||
|
|
- **Криптографические ключи** (ML-DSA-65) = ключи от сейфа
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Архитектура
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ ЛОКАЛЬНЫЙ MAC │
|
|||
|
|
│ (Хранитель сети) │
|
|||
|
|
│ │
|
|||
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|||
|
|
│ │ macOS KEYCHAIN │ │
|
|||
|
|
│ │ │ │
|
|||
|
|
│ │ API Keys: SSH Keys: Servers: │ │
|
|||
|
|
│ │ - Telegram Token - id_ed25519 - Timeweb IP │ │
|
|||
|
|
│ │ - OpenAI Key - jn_srv - Amsterdam IP │ │
|
|||
|
|
│ │ - GitHub Token - passphrase - Users │ │
|
|||
|
|
│ │ - Admin ID - config │ │
|
|||
|
|
│ │ │ │
|
|||
|
|
│ └─────────────────────────────────────────────────────┘ │
|
|||
|
|
│ │ │
|
|||
|
|
│ │ SSH/API │
|
|||
|
|
│ ▼ │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
│ Управление
|
|||
|
|
▼
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ СЕТЬ АТЛАНТОВ │
|
|||
|
|
│ │
|
|||
|
|
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
|
|||
|
|
│ │ Атлант 1 │ │ Атлант 2 │ │ Атлант N │ │
|
|||
|
|
│ │ │ │ │ │ │ │
|
|||
|
|
│ │ ML-DSA-65 │ │ ML-DSA-65 │ │ ML-DSA-65 │ │
|
|||
|
|
│ │ ключи │ │ ключи │ │ ключи │ │
|
|||
|
|
│ │ (свои) │ │ (свои) │ │ (свои) │ │
|
|||
|
|
│ └───────────┘ └───────────┘ └───────────┘ │
|
|||
|
|
│ │
|
|||
|
|
│ Каждый узел = свои криптографические ключи │
|
|||
|
|
│ Децентрализация = безопасность │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Два типа ключей
|
|||
|
|
|
|||
|
|
### 1. Операционные ключи (Keychain)
|
|||
|
|
|
|||
|
|
**Что это:** Ключи для УПРАВЛЕНИЯ инфраструктурой
|
|||
|
|
|
|||
|
|
**Где хранятся:** macOS Keychain на локальном Mac
|
|||
|
|
|
|||
|
|
**Что делают:**
|
|||
|
|
- Подключение к серверам (SSH)
|
|||
|
|
- Запуск ботов (Telegram Token)
|
|||
|
|
- Работа с AI (OpenAI, Anthropic)
|
|||
|
|
- Публикация кода (GitHub)
|
|||
|
|
|
|||
|
|
**Если украдут:**
|
|||
|
|
- Злоумышленник получит доступ к серверам
|
|||
|
|
- Сможет управлять ботом
|
|||
|
|
- НО! Криптовалюта и сеть — в безопасности
|
|||
|
|
|
|||
|
|
**Аналогия:** Ключи от офиса. Вор зайдёт в офис, но сейф не откроет.
|
|||
|
|
|
|||
|
|
### 2. Криптографические ключи (ML-DSA-65)
|
|||
|
|
|
|||
|
|
**Что это:** Постквантовые ключи протокола Montana
|
|||
|
|
|
|||
|
|
**Где хранятся:** На каждом узле (Атланте) отдельно
|
|||
|
|
|
|||
|
|
**Что делают:**
|
|||
|
|
- Подписывают транзакции
|
|||
|
|
- Подтверждают владение средствами
|
|||
|
|
- Участвуют в консенсусе
|
|||
|
|
|
|||
|
|
**Если украдут:**
|
|||
|
|
- Злоумышленник получит доступ ТОЛЬКО к средствам этого узла
|
|||
|
|
- Другие узлы — в безопасности
|
|||
|
|
- Сеть продолжает работать
|
|||
|
|
|
|||
|
|
**Аналогия:** Ключ от личного сейфа. Каждый сейф — отдельный.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Полный список ключей в Keychain
|
|||
|
|
|
|||
|
|
### API Keys
|
|||
|
|
| Имя | Назначение | Команда |
|
|||
|
|
|-----|------------|---------|
|
|||
|
|
| `TELEGRAM_TOKEN_JUNONA` | Токен бота @junomontanaagibot | `security find-generic-password -a "montana" -s "TELEGRAM_TOKEN_JUNONA" -w` |
|
|||
|
|
| `OPENAI_API_KEY` | Ключ OpenAI для GPT-5.2 | `security find-generic-password -a "montana" -s "OPENAI_API_KEY" -w` |
|
|||
|
|
| `ANTHROPIC_API_KEY` | Ключ Anthropic для Claude | `security find-generic-password -a "montana" -s "ANTHROPIC_API_KEY" -w` |
|
|||
|
|
| `GITHUB_TOKEN` | Токен GitHub для публикации | `security find-generic-password -a "montana" -s "GITHUB_TOKEN" -w` |
|
|||
|
|
| `ADMIN_TELEGRAM_ID` | ID владельца в Telegram | `security find-generic-password -a "montana" -s "ADMIN_TELEGRAM_ID" -w` |
|
|||
|
|
| `AI_PROVIDER` | Текущий провайдер AI (openai/anthropic) | `security find-generic-password -a "montana" -s "AI_PROVIDER" -w` |
|
|||
|
|
|
|||
|
|
### SSH Keys
|
|||
|
|
| Имя | Назначение | Формат |
|
|||
|
|
|-----|------------|--------|
|
|||
|
|
| `SSH_KEY_ED25519_PRIVATE` | Приватный ключ для GitHub | base64 |
|
|||
|
|
| `SSH_KEY_ED25519_PUBLIC` | Публичный ключ для GitHub | plain text |
|
|||
|
|
| `SSH_KEY_JN_SRV_PRIVATE` | Приватный ключ для серверов | base64, зашифрован |
|
|||
|
|
| `SSH_KEY_JN_SRV_PUBLIC` | Публичный ключ для серверов | plain text |
|
|||
|
|
| `SSH_KEY_JN_SRV_PASSPHRASE` | Пароль для расшифровки jn_srv | plain text |
|
|||
|
|
| `SSH_CONFIG` | Конфигурация SSH (~/.ssh/config) | base64 |
|
|||
|
|
|
|||
|
|
### Servers
|
|||
|
|
| Имя | Значение | Назначение |
|
|||
|
|
|-----|----------|------------|
|
|||
|
|
| `SERVER_TIMEWEB_IP` | 176.124.208.93 | Timeweb сервер |
|
|||
|
|
| `SERVER_TIMEWEB_USER` | root | Пользователь Timeweb |
|
|||
|
|
| `SERVER_AMS_IP` | 72.56.102.240 | Amsterdam сервер |
|
|||
|
|
| `SERVER_AMS_USER` | root | Пользователь Amsterdam |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Как восстановить SSH на новом Mac
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. Создать папку .ssh
|
|||
|
|
mkdir -p ~/.ssh
|
|||
|
|
chmod 700 ~/.ssh
|
|||
|
|
|
|||
|
|
# 2. Восстановить ключи из Keychain
|
|||
|
|
security find-generic-password -a "montana" -s "SSH_KEY_ED25519_PRIVATE" -w | base64 -d > ~/.ssh/id_ed25519
|
|||
|
|
security find-generic-password -a "montana" -s "SSH_KEY_ED25519_PUBLIC" -w > ~/.ssh/id_ed25519.pub
|
|||
|
|
security find-generic-password -a "montana" -s "SSH_KEY_JN_SRV_PRIVATE" -w | base64 -d > ~/.ssh/jn_srv
|
|||
|
|
security find-generic-password -a "montana" -s "SSH_KEY_JN_SRV_PUBLIC" -w > ~/.ssh/jn_srv.pub
|
|||
|
|
security find-generic-password -a "montana" -s "SSH_CONFIG" -w | base64 -d > ~/.ssh/config
|
|||
|
|
|
|||
|
|
# 3. Установить права доступа
|
|||
|
|
chmod 600 ~/.ssh/id_ed25519
|
|||
|
|
chmod 600 ~/.ssh/jn_srv
|
|||
|
|
chmod 644 ~/.ssh/*.pub
|
|||
|
|
chmod 644 ~/.ssh/config
|
|||
|
|
|
|||
|
|
# 4. Passphrase для jn_srv
|
|||
|
|
security find-generic-password -a "montana" -s "SSH_KEY_JN_SRV_PASSPHRASE" -w
|
|||
|
|
# Используй при подключении к my-timeweb
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Как запустить бота
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. Перейти в папку бота
|
|||
|
|
cd Монтана_Montana_蒙大拿/Русский/бот
|
|||
|
|
|
|||
|
|
# 2. Загрузить ключи из Keychain в переменные окружения
|
|||
|
|
source load_keys.sh
|
|||
|
|
|
|||
|
|
# 3. Запустить бота
|
|||
|
|
python junomontanaagibot.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Безопасность
|
|||
|
|
|
|||
|
|
### Что защищено:
|
|||
|
|
- Все ключи в macOS Keychain (зашифрованы системой)
|
|||
|
|
- SSH ключ jn_srv дополнительно защищён паролем
|
|||
|
|
- Keychain требует пароль пользователя Mac
|
|||
|
|
|
|||
|
|
### Что НЕ защищает Keychain:
|
|||
|
|
- Криптографические ключи протокола (ML-DSA-65)
|
|||
|
|
- Они на каждом узле свои
|
|||
|
|
- Компрометация Mac ≠ компрометация сети
|
|||
|
|
|
|||
|
|
### Модель угроз:
|
|||
|
|
```
|
|||
|
|
Угроза │ Последствия │ Сеть
|
|||
|
|
─────────────────────────┼──────────────────────┼──────────
|
|||
|
|
Украли Mac │ Доступ к серверам │ Работает
|
|||
|
|
Взломали Keychain │ Доступ к API/SSH │ Работает
|
|||
|
|
Взломали 1 сервер │ Потеря 1 узла │ Работает
|
|||
|
|
Взломали ВСЕ серверы │ Временный простой │ Работает*
|
|||
|
|
|
|||
|
|
* Сеть восстановится — ключи протокола у пользователей
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## FAQ
|
|||
|
|
|
|||
|
|
**Q: Почему ключи в Keychain, а не в файлах?**
|
|||
|
|
A: Keychain зашифрован системой. Файлы .env — открытый текст.
|
|||
|
|
|
|||
|
|
**Q: Что если потерял Mac?**
|
|||
|
|
A: Keychain можно восстановить из iCloud или бэкапа Time Machine.
|
|||
|
|
|
|||
|
|
**Q: Можно ли перенести на Linux?**
|
|||
|
|
A: Да, но нужно использовать другое хранилище (например, `pass` или HashiCorp Vault).
|
|||
|
|
|
|||
|
|
**Q: Как добавить новый ключ?**
|
|||
|
|
A: `security add-generic-password -a "montana" -s "ИМЯ" -w "ЗНАЧЕНИЕ"`
|
|||
|
|
|
|||
|
|
**Q: Как удалить ключ?**
|
|||
|
|
A: `security delete-generic-password -a "montana" -s "ИМЯ"`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Автор
|
|||
|
|
|
|||
|
|
**Alejandro Montana**
|
|||
|
|
|
|||
|
|
*Time is the only real currency*
|