Перейти к содержимому

Установка из пакета

Следующий выпуск — 0.4; его релиз на GitHub ещё не опубликован. Команды ниже описывают планируемые артефакты. До публикации собирайте из исходников, а после публикации проверяйте каждый артефакт перед использованием. Наблюдаемый статус записан в docs/releases/0.4-install-surfaces.json.

Это путь для обычного Linux-узла, где движок должен работать как служба, а не в контейнере. Debian/Ubuntu и RHEL/Fedora/SUSE по умолчанию используют systemd. Init Alpine по умолчанию — OpenRC, не systemd. Для контейнеров см. Развёртывание с Docker; для узла без исходящего маршрута — Установка в изолированной среде, на которую эта страница ссылается на шаге обновления.

1. Проверьте выпуск, прежде чем ему доверять

Заголовок раздела «1. Проверьте выпуск, прежде чем ему доверять»

Для продукта безопасности конвейер сборки — часть модели доверия, поэтому здесь никто не просит принять загрузку на веру. Положите пакет, checksums.txt и подпись в один каталог и запустите проверяющий из этого каталога:

Окно терминала
# The verifier is in a source checkout of the release tag, not a release asset; running it
# trusts the checkout. Without one, INSTALL.md shows the cosign + sha256sum commands.
# keyless / Sigstore (default; reaches Rekor over the network)
/path/to/olivares/scripts/verify-release.sh

Релизы подписываются без ключа и не публикуют публичный ключ cosign, поэтому для пакетов, скачанных из релиза, используйте команду без ключа. Ей нужен корневой материал доверия Sigstore, который cosign загружает, если он ещё не в кэше. --offline убирает только обращение к Rekor и не превращает проверку в работу без сети. --key предназначен только для файлов, подписанных закрытым ключом под вашим контролем, и этот публичный ключ нужно получить отдельно от проверяемых файлов.

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

Три формата несут двоичный файл в /usr/bin/olivares, файл окружения в /etc/olivares/olivares.env (config|noreplace), каталог данных /var/lib/olivares и тексты лицензий. .deb и .rpm поставляют укреплённый systemd-юнит. .apk кладёт исполняемый юнит OpenRC в /etc/init.d/olivares с явным штампом package-init, чтобы хуки не угадывали по наличию systemctl на узле. Linux-архивы несут те же адаптеры службы: scripts/install-service.sh и packaging/service/.

Окно терминала
# Debian / Ubuntu
sudo dpkg -i olivares_0.4_linux_amd64.deb
# RHEL / Fedora / SUSE
sudo rpm -Uvh olivares_0.4_linux_amd64.rpm
# Alpine
sudo apk add --allow-untrusted olivares_0.4_linux_amd64.apk

Установка создаёт системного пользователя и группу olivares (оболочка /usr/sbin/nologin, домашний каталог /var/lib/olivares), создаёт /var/lib/olivares с режимом 0750 во владении этого пользователя и создаёт /etc/olivares. systemd-пакеты перезагружают systemd, когда есть systemctl; пакеты OpenRC не включают и не запускают службу. Он ничего не запускает — см. чего пакет не делает.

На Debian/Ubuntu и RHEL/Fedora/SUSE:

Окно терминала
sudo systemctl enable --now olivares

На OpenRC (.apk из этого исходного дерева):

Окно терминала
sudo rc-service olivares start
# необязательно; пакет этого не делает:
sudo rc-update add olivares default

Токен первого запуска находится в /var/log/olivares.log (и в logread, если работает syslogd). Дополнительные флаги из OLIVARES_EXTRA_ARGS добавляются с отключённым globbing и разбиваются по пробелам; вложенные кавычки не интерпретируются, а файл окружения не исполняется как shell.

На ранее опубликованном Alpine нет systemctl, и у того .apk нет юнита OpenRC. Запустите движок от служебного пользователя; токен первого запуска печатается в stdout:

Окно терминала
sudo -u olivares olivares serve --data-dir=/var/lib/olivares \
--listen=:8443 --grpc-listen=:8444 --checkpoint-interval=1h

Упакованный systemd-юнит запускает движок от непривилегированного пользователя olivares с пустым bounding-набором capabilities — он не держит ни ambient, ни bounding capabilities — и NoNewPrivileges=true, так что ничто из запущенного им не может их получить. Сверху он несёт ProtectSystem=full (/usr, /boot, /efi и /etc только для чтения), PrivateDevices=true, ProtectClock=true, ProtectKernelTunables=true, ProtectKernelModules=true, ProtectKernelLogs=true, ProtectControlGroups=true, RestrictNamespaces=user net mnt (сессия получает собственные пространства имён пользователя и сети, а помощник, держащий хуки и настройки Git папки только для чтения, получает собственное пространство имён монтирования, где фильтр системных вызовов разрешает mount; все прочие типы запрещены), RestrictSUIDSGID=true, RestrictRealtime=true, LockPersonality=true, SystemCallArchitectures=native, фильтр системных вызовов @system-service, дополнительно отбрасывающий @privileged и @resources, и UMask=0027.

Юнит не скрывает домашние и временные каталоги и разрешает исполняемую память: он задаёт ProtectHome=false, PrivateTmp=false и MemoryDenyWriteExecute=false. Движок достаёт всё, что обычные права на файлы разрешают учётной записи olivares, включая /home, /tmp и /var/tmp, чтобы выбранные для сессий папки оставались доступны. Изоляция вместо этого действует на уровне сессии: перед запуском каждого агентного инструмента или stdio-сервера MCP движок применяет политику Landlock, которая разрешает ему писать в папку сессии, домашний каталог инструмента и свой временный каталог и никогда не даёт добраться до каталога данных движка, /etc/olivares и собственных учётных данных учётной записи движка. Средам выполнения агентов и MCP на Node/V8 нужна исполняемая JIT-память, поэтому MemoryDenyWriteExecute=false. На ядре без Landlock движок отказывается запускать сессии; olivares doctor называет причину.

26.10.0 поставлялась с более строгим юнитом: вся файловая система только для чтения, кроме каталога данных, домашние каталоги скрыты, приватный /tmp и никакой записываемой исполняемой памяти. 26.10.1 ослабила его до значений выше. Любую из этих настроек можно вернуть в drop-in (systemctl edit olivares). Тогда папки сессий в домашних каталогах или в /tmp и инструменты на основе JIT перестанут работать, а при файловой системе только для чтения каждой папке сессии вне каталога данных нужна своя строка ReadWritePaths=.

На Alpine по умолчанию эти директивы systemd не применяются к ранее опубликованному .apk, потому что systemd-юнит этой полезной нагрузки не запущен. Пакеты .apk, собранные из этого исходного дерева, вместо этого работают под OpenRC: они используют учётную запись olivares, пишут токен первого запуска в /var/log/olivares.log и не реализуют директивы песочницы systemd.

Слушатели по умолчанию принимают соединения из сети — --listen=:8443 для HTTP (REST плюс встроенная консоль) и --grpc-listen=:8444 для gRPC, dual-stack-шаблон. Это сервер, и защищают его включённый TLS, отсутствие учётных данных по умолчанию и одноразовый токен настройки. Ограничивайте их намеренно через OLIVARES_EXTRA_ARGS=--listen=127.0.0.1:8443 --grpc-listen=127.0.0.1:8444 в /etc/olivares/olivares.env — эти флаги добавляются после собственных флагов юнита, и побеждает последний — и поставьте перед ними собственное завершение TLS. Для IPv6 loopback используйте --listen=[::1]:8443.

Это сбой, который стоит знать заранее на systemd-узле, потому что симптом не называет причину.

Внепроцессные коннекторы первой стороны поставляются встроенными в двоичный файл. При загрузке движок извлекает нужные во частный scratch и исполняет их как подпроцессы. Если TMPDIR не задан, scratch создаётся под <data-dir>/tmp; только незаписываемый каталог данных заставляет движок упасть в системный временный каталог. Явный TMPDIR всегда побеждает.

Поэтому упакованная systemd-служба по умолчанию использует /var/lib/olivares/tmp, а не /tmp. Проверьте раздел, который реально будет держать исполняемый scratch:

Окно терминала
check_scratch_mount() {
target=${1:-/var/lib/olivares}
opts=$(findmnt -no OPTIONS --target "$target") || {
printf '%s\n' "cannot read mount options for $target (missing path or permission)" >&2
return 1
}
[ -n "$opts" ] || {
printf '%s\n' "mount options for $target are unknown" >&2
return 1
}
case ",$opts," in
*,noexec,*) printf '%s\n' 'noexec — set TMPDIR' ;;
*) printf '%s\n' 'exec-capable — nothing to do' ;;
esac
}
check_scratch_mount /var/lib/olivares

Если там noexec, направьте TMPDIR на каталог, доступный на запись пользователю olivares и лежащий на разделе, допускающем исполнение:

Окно терминала
sudo install -d -o olivares -g olivares -m 0750 /run/olivares-exec-tmp
sudo systemctl edit olivares # creates a drop-in; do not edit the shipped unit
[Service]
Environment=TMPDIR=/run/olivares-exec-tmp
ReadWritePaths=/run/olivares-exec-tmp

Затем перезапустите. Если exec отвергнут с EACCES или ENOEXEC, ошибка движка называет раздел извлечения и два органа перемещения (TMPDIR и data-dir); она не сообщает о noexec-разделе как об отсутствующем коннекторе.

Используйте systemctl edit, никогда прямое редактирование /usr/lib/systemd/system/olivares.service: этот файл принадлежит пакету, и обновление его заменяет.

quickstart — это serve с дружелюбными значениями по умолчанию и направляющим баннером. Он никогда не изобретает учётные данные по умолчанию; он указывает на встроенную консоль, чтобы создать первого администратора с одноразовым токеном.

Если вы уже обслуживаете под упакованным systemd-юнитом, не запускайте quickstart — токен настройки первого запуска печатается в журнал:

Окно терминала
journalctl -u olivares | sed -n '/FIRST-BOOT SETUP/,/========================/p'

Если вы запустили serve на переднем плане (Alpine по умолчанию), тот же баннер — в stdout.

Откройте консоль по https://127.0.0.1:8443 (при первом запуске генерируется самоподписанный сертификат), предъявите этот токен и создайте администратора. Токен одноразовый.

На рабочей станции, чтобы осмотреться без установки службы, olivares quickstart делает то же самое на переднем плане с --listen/--grpc-listen/--data-dir, если нужно уйти от значений по умолчанию.

Источник — это место, откуда движок принимает наблюдения. Глаголы разделены по тому, чего стоит каждый, и их стоит использовать в этом порядке: plan говорит, что изменилось бы, и ничего не пишет, validate говорит, что конфигурация согласована сама по себе без обращения к сети, test реально открывает источник, чтобы доказать, что он отвечает, а set применяет. Конфигурация несёт ссылки на секреты (store:<name>), никогда значения.

pgAudit читает журнал аудита PostgreSQL, поэтому log_path — единственное обязательное поле:

Окно терминала
# coherent by itself? (writes nothing, opens no socket)
sudo -u olivares olivares sources validate --name pg-prod --kind pgaudit \
--tenant <your-tenant-id> \
--config log_path=/var/log/postgresql/postgresql.log \
--data-dir /var/lib/olivares
# does it actually answer? (opens the source for real)
sudo -u olivares olivares sources test --name pg-prod --kind pgaudit \
--tenant <your-tenant-id> \
--config log_path=/var/log/postgresql/postgresql.log \
--data-dir /var/lib/olivares
# apply it
sudo -u olivares olivares sources set --name pg-prod --kind pgaudit \
--tenant <your-tenant-id> \
--config log_path=/var/log/postgresql/postgresql.log \
--actor "$(id -un)" --reason "onboard the production audit log" \
--data-dir /var/lib/olivares

Три вещи в командной строке выше — не наполнитель:

  • --tenant обязателен. Источник должен назвать делового арендатора, которому принадлежат наблюдения; без него команда отказывается, а не угадывает владельца аудиторских данных.
  • --actor и --reason требует set, и только set. Привилегированная офлайн-операция должна записать, кто её выполнил и зачем. validate не нуждается ни в одном, потому что ничего не пишет — асимметрия и есть смысл.
  • format по умолчанию csvlog, а follow — true, поэтому стандартному развёртыванию pgAudit не нужно ни то ни другое.

Применение печатает, что изменилось, поле за полем, и говорит, как заставить работающий движок подхватить это без перезапуска — POST /v1/console/runtime/reload или SIGHUP. Под упакованным systemd-юнитом это sudo systemctl reload olivares. Если вы запустили serve на переднем плане, отправьте SIGHUP этому процессу.

Служебному пользователю нужен доступ на чтение к этому файлу журнала; в большинстве дистрибутивов это значит добавить olivares в группу adm или postgres — намеренная выдача с вашей стороны, а не то, что пакет делает за вас.

Используйте один способ обновления на хост. Хост, установленный из пакета или из репозитория, обновляется своим менеджером пакетов (apt, dnf, apk или новым пакетом); olivares upgrade отказывается заменять двоичный файл, которым владеет пакет.

Менеджер пакетов владеет /usr/bin/olivares при любой установке из пакета (deb, rpm, apk, AUR). Замена этого файла на месте оставила бы базу данных пакетов описывающей файл, которого в таком виде уже нет, поэтому olivares upgrade отказывается: он завершается с кодом 2 до любой загрузки и называет путь через пакет. Обновляйте менеджером пакетов. olivares upgrade --check по-прежнему работает: он показывает план и ничего не меняет:

Окно терминала
sudo olivares upgrade --check # what would change, without changing anything

Там, где менеджер пакетов не владеет двоичным файлом (его положил install.sh или вы вручную), olivares upgrade заменяет его на месте, и свойства безопасности — причина пользоваться им там: он никогда не заменяет двоичный файл, пока скачанный кандидат не прошёл успешный exec-зонд, хранит резервную копию с меткой времени и возвращается к этой копии, если зонд после замены не проходит. --target <путь> — переопределение оператора: он заменяет файл, который вы назвали, включая /usr/bin/olivares, и после этого база данных пакетов не совпадает с этим файлом.

Три флага важны для --check и для запуска с --target:

  • --endpoint — брать обновления из репозитория GitHub, которым вы управляете, а не из значения по умолчанию. Это выход для зеркала или форка.
  • --bundle — Для установки без сети требуется Enterprise. Community проверяет комплект с --bundle --check, не читая лицензию и не устанавливая его.
  • --install-timer — выдать необязательный systemd-таймер и службу, которые проверяют обновления по расписанию. Ничто не ставит это за вас; см. чего пакет не делает. Это генератор systemd. При установке из пакета команда отказывает: /usr/bin/olivares принадлежит менеджеру пакетов, поэтому --install-timer завершается с кодом 2 и не записывает unit. Обновляйте через менеджер пакетов (на appliance Olivares: systemctl start olivares-appliance-update.service).

Учтите, что постановка и exec-зонд происходят в каталоге установки, рядом с целью — не в /tmp, поэтому раздел noexec, обсуждённый выше, не ломает обновление. Раздел noexec на каталоге установки — другое дело и делает установленную версию неизмеримой; этот случай, каналы выпуска, поэтапный выкат и откат — в Обновление и откат.

Пакет записывает /var/lib/olivares/install-manifest.json. Деинсталлятор проверяет полный манифест по подписанному индексу дистрибуции, прежде чем трогать службу или файловую систему; неожиданный путь возвращает 2. Сначала осмотрите, затем явно выберите сохранение:

Окно терминала
sudo olivares uninstall --plan --data-dir /var/lib/olivares
sudo olivares uninstall --preserve --data-dir /var/lib/olivares
sudo olivares uninstall --purge --data-dir /var/lib/olivares --yes

Preserve — политика снятия пакета: она сохраняет конфигурацию, данные, журналы, ключи и их служебную идентичность. В systemd-пакетах хук снятия выполняет --preserve. В OpenRC-пакетах .apk, собранных из этого исходного дерева, хук останавливает службу, если она активна, снимает запись из runlevel по умолчанию, не завершаясь ошибкой, если её никогда не включали, проверяет полный манифест через --plan и даёт apk удалить файлы, принадлежащие пакету. Ранее опубликованные пакеты Alpine проверяли только через --plan, потому что у той полезной нагрузки не было юнита OpenRC, который нужно остановить. Запускайте --purge перед снятием пакета только когда намерение — стереть. Требуется подтверждение, удаляются только проиндексированные пути.

Для переезда хозяйства сначала создайте olivares dr backup, установите назначение и выполните там olivares dr restore. Текущие бандлы используют hmac-sha256-kek-v1 для аутентификации манифеста и каждой нагрузки под вашим KEK. Экспорт более нового движка отклоняется до записей; отдельно аутентифицированный бандл pre-v26.9 явно требует --allow-legacy-unsigned. Руководство по резервному копированию и восстановлению охватывает хранение KEK и доказательство непрерывности после импорта.

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

  • Он не добавляет репозиторий. Ничего не пишется в /etc/apt/sources.list.d, /etc/yum.repos.d или /etc/apk/repositories. Вы установили один файл; установлен был только этот файл. Обновления запускаете вы — новым пакетом; olivares upgrade отказывается заменять двоичный файл, которым владеет пакет.
  • Он не запускает и не включает службу. systemd-пакеты перезагружают systemd, когда есть systemctl, и печатают systemctl enable --now. Пакеты OpenRC печатают rc-service olivares start и не выполняют rc-update add. Запуск остаётся вашим решением. Обновление уже работающей службы OpenRC останавливает её, заменяет файлы и запускает снова; неактивная служба остаётся неактивной.
  • Проверка лицензии никому не звонит. Загрузка того, за что вы заплатили, — да. Проверка лицензии в открытой сборке — офлайн Ed25519, удалённого выключателя нет, и никакой лицензионный ключ не ограничивает и не ухудшает эту сборку — сборка AGPL и есть вся платформа. Нет обязательной телеметрии и исходящего трафика плоскости управления по умолчанию: границу пересекает то, что вы настроили пересекать — вызовы ваших API моделей, выходы SIEM/webhook, которые вы подключили, внешний поставщик эмбеддингов, если вы его подготовили, и любой источник, который опрашивает коннектор (его addr, base_url или endpoint) с заданным вами интервалом.
  • Но olivares upgrade сознательно делает сетевой вызов, когда вы его запускаете — в этом смысл проверки обновлений, и --check показывает план, пока ничего не сдвинулось. Честная форма обещания: проверка лицензии никому не звонит; загрузка того, за что вы заплатили, — да. Используйте --bundle, если путь обновления тоже не должен делать вызовов.
  • Он открывает порт в сеть. Юнит слушает все интерфейсы, пока вы сами его не расширите.