Безопасность: ключи на хостах, mTLS и подписанные релизы
Sard управляет бэкапами, но не держит ключей от них. Ниже — что именно защищено, чем и чего это не защищает.
Сервер — плоскость управления, а не хранитель ключей
Адреса хранилищ, пароли репозиториев и ключи доступа остаются на хостах агентов и на сервер не передаются. Компрометация сервера не раскрывает бэкапы, но позволяет запускать шаги на агентах: этого мы не скрываем.
Агент звонит сам, по взаимному TLS
Агент подключается к серверу по gRPC с mTLS, поэтому на хостах не открывается ни одного входящего порта. Порт агентов 9090 открыт, но без сертификата от CA сервера доступна только регистрация, и та по одноразовому токену с ограниченным сроком.
Собственный CA
- Сервер сам выпускает сертификаты агентов. Ключ CA лежит в файле с правами 0600, срок CA 10 лет. Можно импортировать существующий CA.
- Сертификат сервера действует 90 дней и перевыпускается сам, а его ключ живёт только в памяти.
- Агент продлевает свой сертификат сам, не прерывая работу. Консоль и Telegram предупреждают, если срок подходит к концу.
- Потеря ключа CA означает повторную регистрацию всех агентов, поэтому ключ уходит в самобэкап и его советуют хранить отдельно от базы.
Секреты: по имени, из файла, только туда, куда разрешено
Конфиг источника называет секрет по имени, а значение лежит в файле на хосте агента. Куда отдать секрет, решает оператор хоста: привязка называет плагин, хост и базу, и пароль не уйдёт никуда больше, что бы ни прислал сервер. Для PostgreSQL по умолчанию действуют scram-sha-256 и проверка TLS-сертификата сервера. Значения секретов маскируются в логах шагов.
Вход администратора и консоль
- Пароль от 12 до 1024 символов хранится как хэш Argon2id. Пять неверных попыток за 15 минут блокируют адрес на 15 минут.
- Первый вход идёт по одноразовому коду из лога сервера.
- Консоль по умолчанию слушает только 127.0.0.1: по HTTP без TLS идут пароль и код настройки, поэтому перед ней ставят TLS-прокси.
Подписанные релизы
Релизы агента и файлы установки подписаны minisign, образы в GHCR подписаны cosign. К релизам прилагаются SBOM (CycloneDX) и провенанс сборки GitHub. Ключ релиза нужно брать из репозитория, а не с сервера, с которого скачали пакет. Всё проверяется и без доступа в интернет.
Об уязвимостях
Не создавайте публичный issue: порядок приватного сообщения описан в SECURITY.md репозитория.