11 KiB
Система Ключей Montana Protocol
Простыми словами
Представь что у тебя есть:
- Ключи от машины — чтобы ездить и управлять
- Ключи от сейфа — где лежат твои деньги
Это РАЗНЫЕ ключи. Если украдут ключи от машины — деньги в сейфе целы.
В 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
# 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
Как запустить бота
# 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