Sekvyr

Open sourceAGPL-3.0self-hostedверсия 1.0.2

Секреты живут в панели, а не в переписке

Пароли, токены и настройки приложений хранятся в одной панели на вашем сервере. Поменяли значение в браузере, и серверы сами подтянут его в свои .env. Админку можно закрыть от всех, кроме своих адресов, а серверы могут значения только читать.

Docker Compose нужен только Postgres агент для Linux Kubernetes без хранимых токенов русский и английский
sekvyr.example.ruувеличить
Главный экран Sekvyr: проекты по группам, окружения, серверы

Что умеет

Все, ради чего обычно ставят хранилище секретов, и ничего лишнего.

Проекты, окружения, папки

В проекте свои окружения, например dev, stage и prod, а ключи в них можно разложить по папкам. .env загружается и выгружается целиком, общие значения можно брать из другого окружения. Поиск по Ctrl+K ищет по всей панели, так что и среди сотни проектов нужное находится быстро.

История и откат

Значение не перезаписывается, каждая правка сохраняется отдельной версией. Видно, что было в ключе вчера и что поменялось за неделю, любую версию можно вернуть одной кнопкой. Удаленный ключ тоже возвращается.

Права вплоть до папки

Доступ выдается на проект, окружение или папку. Можно разрешить видеть только список ключей: разработчик знает, какие переменные нужны приложению, но паролей от прода не видит. У права бывает срок, а для важного можно потребовать второй фактор. Права проверяет сам сервер, поэтому в обход интерфейса их тоже не обойти.

Подтверждение правок

Правка от младшей роли сначала ждет подтверждения старшего и до этого не уходит на серверы. Свою правку подтвердить нельзя, а с какой роли нужно подтверждение, решает владелец.

Сервер одной командой

Панель показывает команду, вы запускаете ее на сервере. Агент получает свою учетную запись, в панели от нее остается только хеш. Дальше он сам забирает изменения, обновляет .env и перезапускает приложение. Обновляется агент тоже сам и ставит только версии с правильной подписью.

Kubernetes без хранимых токенов

Поду не нужен токен, сохраненный в кластере. Он предъявляет панели короткоживущий токен своего ServiceAccount, а панель проверяет его подпись по ключам кластера. Если у вас уже стоит External Secrets Operator, можно работать через него.

Переезд с Infisical и Vault

Значения переносятся из Infisical и Vault KV. Перед переносом видно, что добавится, а что уже есть, существующие значения по умолчанию не трогаются. Доступы к старому хранилищу панель не сохраняет.

Порядок в ключах

К ключу можно написать, зачем он нужен, и поставить дату замены, панель напомнит заранее. Видно, каких обязательных ключей не хватает и какие никто не читал целый год. Окружения можно сравнить, не показывая значений, а changeme в проде панель найдет сама.

Бэкапы и оповещения

Каждую ночь панель делает шифрованный бэкап и сообщит, если он не сделался. Восстановление одной командой, перед обновлением бэкап снимается сам. Оповещения идут в Telegram или на вебхук, значений в них нет. Раз в неделю приходит сводка изменений.

Как это выглядит

Скриншоты сделаны в настоящей панели на демо-данных: проекты, серверы и адреса на них выдуманы.

Безопасность

Главное правило: даже с украденной базой значения не прочитать. Все остальное построено вокруг него.

Шифрование по уровням

Каждое значение зашифровано AES-256-GCM ключом своего окружения, а ключи окружений зашифрованы корневым ключом. Значение привязано к своему месту в базе: его не получится перенести в другое окружение или подменить чужим.

Панель запирается

После перезапуска панель заперта, и пока не введут корневой ключ, значения не может прочитать никто, даже владелец. Ключ можно разделить на доли между несколькими людьми (по умолчанию нужно 3 из 5), вводить целиком или хранить файлом на сервере, тогда панель отпирается сама.

Серверы только читают

Подключенный сервер не может изменить или удалить секрет: таких запросов для серверов в панели просто нет. Это проверяет тест при каждой сборке, так что случайно такой запрос не появится.

Журнал, который не подправить

Каждая запись журнала хранит хеш предыдущей, и раз в сутки панель проверяет, что цепочка цела. Записи можно сразу отправлять на внешний вебхук, чтобы их не удалили вместе с базой. Самих значений в журнале нет.

Шифрование в браузере

Для особо важных проектов значения шифруются прямо в браузере ключом, которого у сервера нет совсем. Но если забыть пароль проекта, значения уже не вернуть.

Аварийный доступ

Все значения можно выгрузить в один зашифрованный файл под своим паролем. Открывается он отдельной утилитой, без панели и без интернета, на случай если панели уже нет.

Подробно о том, от чего Sekvyr защищает, а от чего нет, написано в модели безопасности и модели угроз.

Чем отличается

Sekvyr не пытается заменить Vault целиком. Он сделан для случая, который встречается чаще: десятки серверов, пара человек на инфраструктуре и желание видеть все в одном месте.

SekvyrHashiCorp VaultInfisical
Как начать открыть панель, все видно сразу разобраться с политиками на HCL, движками секретов и терминологией веб-панель, по идее ближе всего к Sekvyr
Что нужно для работы только Postgres встроенное хранилище Raft или Consul Postgres и Redis
В чем силен .env-файлы, история версий, доставка на серверы, журнал динамические секреты, PKI, шифрование как сервис интеграции с CI и облаками
Лицензия AGPL-3.0, все функции бесплатны BSL 1.1 MIT, часть функций платная

Установка

Нужен сервер на Linux со свободными портами 80 и 443. Команда поставит Docker, если его нет, поднимет Caddy с сертификатом Let's Encrypt и запустит панель из готовых образов, сразу с ночными шифрованными бэкапами. В конце она покажет адрес панели и пароль владельца.

$curl -fsSL https://raw.githubusercontent.com/mihsergeev/Sekvyr/main/ops/quickstart-ru.sh | sudo sh

Свой домен не обязателен: панель сразу откроется по адресу вида <ip-сервера>.sslip.io с обычным сертификатом. Но без списка адресов админка открыта всем, поэтому для постоянной установки укажите домен и адреса, с которых в нее можно заходить:

$curl -fsSL https://raw.githubusercontent.com/mihsergeev/Sekvyr/main/ops/quickstart-ru.sh | sudo sh -s -- --domain sekvyr.example.ru --allow-ips "203.0.113.10"

Войдите и смените пароль, включите второй фактор. Пароль от установщика лежит в .env в открытом виде.

Заведите сейф. Доли корневого ключа показываются один раз, раздайте их разным людям.

Настройте оповещения, чтобы сразу узнать, если с панелью что-то не так.

Подключите первый сервер. Панель покажет готовую команду для установки агента.

Ручная установка, свой HTTPS-прокси, Kubernetes и бэкапы описаны в документации. Готовые образы панели собраны под amd64, на других серверах установщик сам соберет панель из исходников.