# Система Ключей 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*