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

Гид контрибьютора tessera

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

Astra Linux SE / Ubuntu 22.04 / Debian 12:

Окно терминала
sudo apt install -y \
build-essential pkg-config \
libssl-dev libudev-dev libdbus-1-dev libpam0g-dev libsystemd-dev \
softhsm2 opensc opensc-pkcs11 \
pamtester clang

Toolchain Rust — фиксирован в rust-toolchain.toml. При наличии rustup toolchain скачивается автоматически:

Окно терминала
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup show # выберет версию из rust-toolchain.toml
Окно терминала
cargo build --workspace
cargo build --workspace --release
  • Default: без специальных фич.
  • tessera_core/pkcs11-tests — включает интеграционные тесты, требующие реального gost-engine или softhsm2. Рецепт запуска с инициализацией токена softhsm2 — в §2.2.
Окно терминала
cargo test --workspace

Все unit- и integration-тесты должны проходить.

Окно терминала
sudo apt install softhsm2 opensc-pkcs11
softhsm2-util --init-token --slot 0 \
--label test --pin 1234 --so-pin 5678
SOFTHSM2_CONF=/etc/softhsm/softhsm2.conf \
cargo test --workspace --features tessera_core/pkcs11-tests

PKCS#11-тесты добавляют дополнительный набор интеграционных проверок (загрузка модуля, поиск сертификата, проверка CKA_EXTRACTABLE).

Требует Linux + root + установленный tessera:

Окно терминала
# В отдельной VM Astra SE 1.8:
sudo apt install ./target/release/tessera_0.4.0-1_amd64.deb
sudo /usr/share/tessera/integrate-pam.sh --mode=2fa /etc/pam.d/sudo
pamtester sudo alice authenticate

В корне репозитория поставляется .pre-commit-config.yaml. Установка:

Окно терминала
pip install pre-commit
pre-commit install

Что проверяется при коммите:

  • cargo fmt --all -- --check;
  • cargo clippy --workspace --all-targets -- -D warnings;
  • cargo deny check;
  • cargo test --workspace;
  • синтаксис bash-скриптов (bash -n);
  • совпадение версии Cargo.tomldebian/changelog;
  • отсутствие placeholder’ов MAX_INTEGRITY OID в трекаемых файлах.

Если у вас нет pre-commit-фреймворка, можно запускать команды вручную:

Окно терминала
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace

Формат — Conventional Commits:

<type>(<scope>): <subject>
<body>
<footer>

Сообщения коммитов — на английском. Примеры:

  • feat(monitord): handle suspend/resume via D-Bus
  • fix(core): correct CRL freshness check for mode = "crl"
  • docs(install): add Mode A scenario with FAT32 media
  • chore: bump serde to 1.0.x
  • refactor(proto): rename Pong to HelloAck for consistency
  • test(monitord): add suspend_grace e2e test

<scope> соответствует крейту или модулю: monitord, core, proto, pam, install, arch, security, release, dev.

  1. Branch off main:

    Окно терминала
    git checkout -b feat/awesome-feature main
  2. Атомарные коммиты: один логически целостный коммит за раз. PR обычно содержит 1–5 коммитов.

  3. Авто-запуск CI: GitHub Actions:

    • .github/workflows/build.yml — тесты (ubuntu: cargo test, astra-контейнер: cargo nextest run), сборка .deb в обоих вариантах, lintian (ubuntu-нога);
    • .github/workflows/lint.ymlcargo clippy -D warnings и supply-chain (cargo deny, cargo audit);
    • .github/workflows/nightly.yml — ежесуточный прогон тестов в release-профиле. cargo fmt --check гоняется pre-commit-хуком, не в CI.
  4. Code review checklist:

    • есть ли тест на новую функциональность?
    • обновлены ли соответствующие docs (configuration, architecture, threat-model)?
    • не появилось ли новое поле в TOML без документации?
    • не нарушает ли изменение fail-closed инварианты (см. architecture.md §13)?
    • reproducible build не сломался?
  5. Слить через squash + rebase merge. Большие PR — review по 3–5 коммитов; squash в main для чистой истории.

Текущая поддержка реализована в crates/tessera_core/src/token/.

Шаги:

  1. Изучить интерфейсы (PkcsModule, Session, Slot).
  2. Реализовать новый адаптер в подмодуле (например, token/newvendor/).
  3. Зарегистрировать его через crypto_backend = "pkcs11_native" с указанием pkcs11_module = "/usr/lib/libnewvendor.so".
  4. Добавить тесты:
    • positive: загрузка модуля + поиск сертификата;
    • negative: модуль не загрузился (несуществующий путь);
    • non-extractable: проверка CKA_EXTRACTABLE = false.
  5. Обновить документацию:

См. crates/tessera_core/src/host_identity/.

Шаги:

  1. Создать модуль <source>.rs с реализацией трейта HostIdSource.
  2. Зарегистрировать в chain.rs (HostIdentityResolver::from_validated).
  3. Добавить в RawHostIdentity::sources (валидация имени).
  4. Добавить в HostIdSourceKind (ssoc-енум).
  5. Тесты:
    • positive: источник возвращает значение;
    • negative: источник недоступен → следующий в chain срабатывает.
  6. Обновить docs/configuration.md (таблица [host_identity]) и architecture.md §12.

7.1 Где живёт логика авторизации сертификата

Заголовок раздела «7.1 Где живёт логика авторизации сертификата»

Авторизация «какой пользователь на каком хосте» полностью описана в самом сертификате через X.509-расширения и проверяется в коде:

  • crates/tessera_core/src/x509/host_binding_ext.rs — парсинг расширения pam_cert_host_binding (OID и ASN.1-структура — в x509/oids.rs).
  • crates/tessera_core/src/x509/allowed_roles_ext.rs — парсинг расширения pam_cert_allowed_roles.
  • verify_cert_scope — финальная сверка распарсенных записей с host_id_hash и запрошенной ролью, она же pam_user. См. также docs/cert-issuance.md для семантики записей.

Семантика SemVer 2.0.0:

  • MAJOR — breaking changes (несовместимые изменения схемы config.toml, IPC-протокола, удалённые опции конфигурации).
  • MINOR — backward-compatible новая функциональность (новый PKCS#11-провайдер, новый источник host_id, новый стейдж в hooks).
  • PATCH — bug fixes, doc updates, обновления зависимостей без изменения API.

Каждый MAJOR-релиз требует: