
Локальный менеджер паролей для всех
<div align="center"> # APM **Лучший локальный менеджер паролей для всех.** [](https://golang.org) [](LICENSE) [](https://aaravmaloo.github.io/apm) [](https://github.com/aaravmaloo/apm/actions/workflows/ci.yml) [](https://github.com/aaravmaloo/apm/releases/latest) [](https://github.com/aaravmaloo/apm/stargazers) [](https://github.com/aaravmaloo/apm/issues) </div> APM — это быстрый CLI-менеджер паролей с нулевым разглашением, написанный на Go и Rust. Он хранит **более 25 структурированных типов секретов** в одном зашифрованном хранилище — от паролей и TOTP-кодов до SSH-ключей, медицинских записей, фотографий и бинарных файлов. Из этого репозитория поставляются два бинарника: `pm` для личного использования и `pm-team` для общих организационных хранилищ. --- ### Почему APM? - **Быстрый и простой в освоении** — не нужно запоминать команды или флаги. APM сам запросит всё необходимое. Для опытных пользователей, которым нужна максимальная скорость, также доступны флаги CLI. - **Нулевое разглашение** — ваш мастер-пароль никогда не сохраняется. Три отдельных 32-байтовых ключа выводятся с помощью Argon2id. Никто, кроме вас, не может расшифровать ваше хранилище. - **Двойное шифрование** — выберите AES-256-GCM или XChaCha20-Poly1305. Двухуровневая целостность через HMAC-SHA256 поверх аутентификации AEAD. - **Портативность** — один файл хранилища, один бинарник. Берите хранилище куда угодно. - **Опциональное облако** — синхронизация с Google Drive, GitHub или Dropbox. Полностью по желанию; для использования APM аккаунт не требуется. - **Готовность к ИИ** — нативный MCP-сервер с токенами с ограниченной областью действия, чтобы Claude, Cursor или любой совместимый с MCP агент мог безопасно обращаться к вашему хранилищу. - **Готовность к командной работе** — полный RBAC, отделы, рабочие процессы согласования и общие хранилища в `pm-team`. --- ### Быстрый старт ```sh go build -o pm . pm setup # initialize vault and choose security profile pm unlock # start a session pm add # add a secret (interactive) pm get github # fuzzy search and retrieve pm lock # end session ``` **Командная версия:** ```sh cd team go build -o pm-team . ``` ### Типы секретов APM поддерживает **25 структурированных типов секретов** с проверяемыми полями и логикой отображения, специфичной для каждого типа: | # | Тип | # | Тип | |---|------|---|------| | 1 | Пароль | 14 | Реестр Docker | | 2 | TOTP | 15 | Секрет CI/CD | | 3 | Государственный ID | 16 | Защищённая заметка | | 4 | Медицинская запись | 17 | Коды восстановления | | 5 | Данные о поездке | 18 | Сертификат | | 6 | Контакт | 19 | Банковские данные | | 7 | Wi-Fi | 20 | Документ | | 8 | API-ключ | 21 | Лицензия на ПО | | 9 | Токен | 22 | Юридический договор | | 10 | SSH-ключ | 23 | Фото | | 11 | Конфигурация SSH | 24 | Аудио | | 12 | Облачные учётные данные | 25 | Видео | | 13 | Kubernetes | | | --- ### Возможности **Безопасность** - Zero-knowledge вывод ключа Argon2id — мастер-пароль никогда не сохраняется - Двойные AEAD-шифры: AES-256-GCM и XChaCha20-Poly1305 - Двухуровневая проверка целостности HMAC-SHA256 - Четыре настраиваемых профиля безопасности: `standard`, `hardened`, `paranoid`, `legacy` - Watchtower (`pm watchtower`): оценка безопасности от 0 до 100 с выявлением слабых, повторно используемых, старых, скомпрометированных (по желанию, k-анонимно) и раскрытых паролей, истекающих элементов, отсутствующей двухфакторной аутентификации и passkey, рискованных ключей и проверок настройки, а также оценки доверия для каждого элемента и обзор активности - Неверные пароли добавляют растущую задержку (но никогда не постоянную блокировку), общую для CLI, приложения и расширения - Журнал аудита с защитой от подделки, хранящийся вне хранилища **Хранилище** - Единый зашифрованный файл хранилища — переносимый на любое устройство - Пространства для логического разделения (как папки) - Нечёткий поиск с интерактивным браузером и навигацией с клавиатуры - Инспектор метаданных: дата создания, последний доступ, количество обращений, оценка доверия **TOTP** - Живые таймеры обратного отсчёта в интерактивном списке - Постоянный пользовательский порядок - Прямое копирование: `pm totp github` - Интеграция с демоном автозаполнения для автоматической подстановки кодов 2FA **Облачная синхронизация** - Google Drive (OAuth2 PKCE), GitHub (PAT), Dropbox (OAuth2 PKCE) - Сквозное шифрование — провайдеры никогда не видят открытый текст - `.apmignore` для фильтрации записей по провайдеру - Разрешение конфликтов: перезаписать, оставить локальную версию или отменить - Фоновая автосинхронизация **Сессии** - Явная разблокировка/блокировка с настраиваемым сроком действия и тайм-аутом бездействия - Делегированные эфемерные сессии для автоматизации и доступа AI-агентов **Сервер MCP** - Нативный сервер Model Context Protocol - Токены разрешений с ограниченной областью: `read`, `secrets`, `write`, `admin` - Операции записи ожидают вашего одобрения в настольном приложении; ассистенты не могут одобрять собственные изменения - Работает с Claude Desktop, Cursor, Windsurf и любым клиентом MCP **Восстановление** | Фактор | Команда | |--------|---------| | Email OTP | `pm auth email` | | Ключ восстановления | `pm auth recover` | | Кворумные доли (Shamir) | `pm auth quorum-setup` | | Passkey WebAuthn | `pm auth passkey register` | | Одноразовые коды восстановления | `pm auth codes generate` | **Импорт / Экспорт** | Формат | Импорт | Экспорт | |--------|--------|--------| | JSON | `pm import json` | `pm export json` | | CSV | `pm import csv` | `pm export csv` | | TXT | `pm import txt` | `pm export txt` | **Механизм политик** ```yaml name: corporate-standard password_policy: min_length: 14 require_uppercase: true require_numbers: true require_symbols: true rotation_policy: rotate_every_days: 90 notify_before_days: 14 ``` ```sh pm policy load ./policies/ ``` **Team Edition (`pm-team`)** - RBAC с несколькими ролями - Отделы с изолированными доменами шифрования - Рабочие процессы утверждения для конфиденциальных записей - Общие хранилища для совместного использования учётных данных несколькими пользователями --- ### Расширение для браузера Расширение APM для браузера заполняет логины, предлагает одноразовые коды на сайтах, к которым они относятся, сохраняет новые логины, а также создаёт и использует ключи доступа (passkeys). Оно никогда не видит ваш мастер-пароль или закрытый ключ passkey. Оно взаимодействует с небольшим мостом, который APM запускает на вашей собственной машине по адресу `127.0.0.1:41417` (задайте `APM_BRIDGE_PORT`, чтобы использовать другой порт). **Три способа доступа к хранилищу** - С настольным приложением: мост работает, пока приложение открыто. Запросы на сопряжение и разблокировки из браузера отображаются в приложении. - Только с CLI, связанный режим (рекомендуется): выполните `pm extension link` один раз. Это регистрирует `pm` как хост нативного обмена сообщениями в каждом браузере на базе Chromium (Chrome, Edge, Brave, Arc, Vivaldi, Chromium), и с этого момента браузер сам запускает `pm`, когда приложение закрыто. - Только с CLI, из терминала: выполните `pm extension serve` и оставьте его открытым. Он предоставляет тот же API, что и настольное приложение, и показывает каждый запрос на разблокировку, блокировку и сопряжение по мере их возникновения. ```sh pm extension link # once per computer; confirm the code the extension shows pm extension serve # unlocks with your CLI session, or asks for the master password pm extension serve --locked # starts locked; unlock from the extension pm extension serve --idle 5m # locks after 5 minutes without browser activity (default 15m, 0 turns it off) ``` `pm extension serve` выводит строку, когда хранилище разблокировано или заблокировано. Нажмите Ctrl+C, чтобы остановить его; ключ хранилища удаляется из памяти. Если порт занят, команда завершается и сообщает, что приложение APM, возможно, уже обслуживает расширение. **Сопряжение браузера** 1. В расширении выберите Connect. Расширение показывает 6-символьный код, например `K7M-2QX`. 2. Убедитесь, что APM показывает тот же код: настольное приложение открывает диалог, а `pm extension link` или `pm extension serve` запрашивает подтверждение в терминале, например `Connect Chrome on macOS? Code K7M-2QX [y/N]`. 3. Подтвердите. Расширение получает свой токен и считается сопряжённым. Запрос истекает через 2 минуты, и одновременно может ожидать только один. `pm extension serve` отклоняет запросы самостоятельно, когда он запущен не в терминале. Чтобы сопрячь вручную, выполните `pm extension token --show` и вставьте токен в поле ручного сопряжения расширения. **Команды** | Команда | Что она делает | |---------|--------------| | `pm extension link [--browser chrome,edge] [--no-wait]` | Разрешить браузеру запускать `pm` для расширения, когда настольное приложение закрыто | | `pm extension unlink` | Запретить браузерам запускать `pm`. Сопряжение сохраняется | | `pm extension status [--port N]` | Показать, какие браузеры связаны, что сейчас обслуживает расширение, состояние блокировки хранилища и количество элементов, а также отпечаток токена | | `pm extension serve [--port N] [--locked] [--idle 15m]` | Обслуживать расширение из этого терминала до нажатия Ctrl+C | | `pm extension token [--show]` | Вывести токен сопряжения, скрытый, если не указан `--show` | | `pm extension rotate` | Заменить токен сопряжения. Каждый сопряжённый браузер должен сопрячься заново. Запущенный мост подхватит новый токен при следующем запросе | | `pm totp link <entry> <domain>` | Связать одноразовый код с сайтом, чтобы расширение предлагало его там | | `pm totp unlink <entry> [domain]` | Удалить привязки одноразового кода к сайтам | `pm get` показывает passkeys, которые есть у логина, и связанный с ним одноразовый код, а `pm totp` показывает связанный сайт для каждого кода. **Как мост сохраняет приватность** - Он слушает только `127.0.0.1` и отвечает только на запросы, адресованные `127.0.0.1` или `localhost`, что блокирует DNS rebinding. - Он отклоняет любой запрос, чей `Origin` является веб-страницей. CORS-заголовки получают только источники `chrome-extension://`, `moz-extension://` и `safari-web-extension://`. - Каждый вызов, кроме сопряжения, требует токен сопряжения, хранящийся в `bridge_token` в каталоге конфигурации APM и сравниваемый за постоянное время. - Вызовы списка и деталей никогда не включают секретные значения. Расширение запрашивает одно поле за раз, когда вы показываете или заполняете, и APM фиксирует этот доступ. - Passkeys создаются и подписываются внутри APM. Расширение отправляет origin сайта и хеш клиентских данных, а APM проверяет, что сайт может использовать эту relying party, прежде чем подписать. **Несколько сайтов на один логин** Логин хранит свой основной адрес в `website`, а остальные — в `urls`, отображаемые как "Other websites" в настольном приложении. Расширение предлагает логин на странице, соответствующей любому из них. По умолчанию совпадением считается один и тот же регистрируемый домен, поэтому `accounts.google.com` и `mail.google.com` оба соответствуют `google.com`. - Из всплывающего окна вы можете добавить текущий сайт к логину, добавить или удалить сайты, а также сохранить новый логин с несколькими сайтами. - Если вы заполняете логин на сайте, для которого он не сохранён, расширение сначала спрашивает. Выберите "Fill and remember", чтобы заполнить его и добавить этот сайт к логину. - `pm totp link <entry> <domain>` делает то же самое для одноразового кода. **Логотипы сайтов** Настольное приложение и расширение показывают собственный логотип каждого логина вместо его первой буквы. APM загружает логотип сам, с самого сайта, и никогда не обращается к стороннему сервису favicon, который узнал бы о каждом сайте в вашем хранилище. - Что: хост первого сайта, связанного с логином (одноразовый код использует связанный с ним сайт), в нижнем регистре и без `www.` или порта. `localhost`, IP-адреса, `.local`, `.internal` и имена без точки никогда не запрашиваются. - Как: APM загружает `https://<host>/` (не более 512 КиБ), выбирает лучшую иконку, объявленную на странице (`apple-touch-icon`, затем самый большой PNG, затем SVG), и при неудаче переходит к `https://<host>/favicon.ico`. Только HTTPS, не более 3 перенаправлений, 6 секунд на сайт, изображения до 256 КиБ, без cookies. Адреса, разрешающиеся в диапазоны loopback, частные, link-local или CGNAT, отклоняются. Запросы идут напрямую к сайту, а не через системный прокси. - Когда: только пока хранилище разблокировано и запущено настольное приложение или `pm extension serve`, не более 4 сайтов одновременно. Неудачный сайт повторяется через 3 дня; логотип обновляется через 30 дней. - Где: `icons/` в вашем каталоге конфигурации APM (`~/Library/Application Support/apm/icons` на macOS, `~/.config/apm/icons` на Linux, `%AppData%\apm\icons` на Windows). Каждый файл назван по SHA-256 его хоста, и хранится не более 2000 файлов. Кэш не зашифрован: каждый `.json`-файл рядом с изображением содержит имя его хоста, поэтому любой, кто может прочитать ваш каталог конфигурации, увидит, для каких сайтов есть логотипы. - Что узнаёт сайт: ваш IP-адрес и то, что APM запросил его иконку (user agent — `APM/<version> (+icon)`). Ничего о вашей учётной записи. - Как отключить: в настольном приложении откройте Settings, Appearance, отключите «Show website icons» (настройка хранилища `siteIcons`, которую также учитывает `pm extension serve`) и выберите «Clear icon cache», чтобы удалить кэш. Установите `APM_ICONS_OFFLINE=1`, чтобы остановить любые запросы из процесса, например в тестах или CI. Кэшированные логотипы по-прежнему отображаются, пока вы их не очистите. --- ### Профили безопасности | Профиль | Память Argon2 | Итерации | Параллелизм | Сценарий использования | |---------|--------------|------------|-------------|----------| | `standard` | 64 МБ | 3 | 2 | Большинство машин | | `hardened` | 256 МБ | 5 | 4 | Рабочие станции (≥8 ГБ ОЗУ) | | `paranoid` | 512 МБ | 6 | 4 | Серверы (≥16 ГБ ОЗУ) | | `legacy` | PBKDF2 | 600 000 | 1 | Обратная совместимость | APM автоматически определяет количество ядер CPU и объём ОЗУ, чтобы рекомендовать оптимальный профиль во время `pm setup`. ### Статус разработки и история (Эта заметка от владельца) По состоянию на 30 марта 2026 года я работаю над GUI для APM. Изначально это было CLI-приложение. Вопрос #38 подробно всё объясняет. В целом я хочу, чтобы APM охватил ещё более широкую аудиторию. Я буду держать GUI отдельно в репозитории apm-gui или создам организацию и перенесу туда оба репозитория. Я начал APM как по-настоящему личный проект. Всё началось в случайный вечер, когда я захотел создать собственный менеджер паролей. Мне надоел zoho password, так как я использовал его для TOTP. Он был невероятно медленным в работе, а для своих токенов я использовал текстовые файлы, что небезопасно. На данный момент я НЕ планирую забрасывать/закрывать проект. Он останется работоспособным надолго. Я стараюсь делать его лучше каждый день и использую его каждый день. Иногда репозиторий может быть неактивен — это когда я тестирую и экспериментирую с приложением. --- ### Структура релизов | Уровень | Стабильный? | Безопасен для хранилища? | Назначение | |------|---------|-------------|---------| | Canary | ❌ | ❌ | Самый ранний предпросмотр функций — может повредить хранилища | | Alpha | ❌ | ✅ | Нестабильные функции, целостность хранилища сохраняется | | Beta | ✅ | ✅ | Полностью протестированные функции, осторожное развёртывание | | Stable | ✅ | ✅ | Готовые к эксплуатации релизы | > Всегда создавайте резервную копию хранилища перед тем, как пробовать релизы Canary. P.S. Для некоторых релизов некоторые уровни могут не выпускаться в зависимости от того, насколько быстро и просто их можно выпустить, не создавая лишних уровней. --- # Использование ИИ Разработка APM и поддержка всего набора — непростая задача, которую не сделать за один раз. Поэтому мы используем **25%** кода, сгенерированного ИИ (в основном изменения UI и некритичные и не связанные с криптографией изменения). Однако в APM у нас есть некоторые правила использования ИИ; они перечислены ниже. - ИИ используется только для разработки небольших функций и функций, которые не затрагивают хранилище - К изменениям, сделанным ИИ, нужно относиться с осторожностью и тщательно их проверять - Изменения, сделанные ИИ, должны быть тщательно протестированы Эти правила гарантируют, что мы используем ИИ ответственно и делаем APM лучше для всех! ### Документация Полная документация на **[aaravmaloo.github.io/apm](https://aaravmaloo.github.io/apm)** - [Установка](https://aaravmaloo.github.io/apm/getting-started/installation/) - [Первые шаги](https://aaravmaloo.github.io/apm/getting-started/first-steps/) - [Справочник по CLI](https://aaravmaloo.github.io/apm/reference/cli/) - [Архитектура](https://aaravmaloo.github.io/apm/concepts/architecture/) - [Шифрование](https://aaravmaloo.github.io/apm/concepts/encryption/) - [Team Edition](https://aaravmaloo.github.io/apm/guides/team-edition/) - [Интеграция с MCP](https://aaravmaloo.github.io/apm/guides/mcp-integration/) - [Участие в разработке](https://aaravmaloo.github.io/apm/contributing/) --- ### Участие в разработке Мы приветствуем вклад в проект. См. [CONTRIBUTING.md](https://aaravmaloo.github.io/apm/contributing/) для получения рекомендаций. --- ### Лицензия [GPL-3.0 License](https://github.com/aaravmaloo/apm/blob/master/LICENSE) © Aarav Maloo