Гид контрибьютора tessera
Этот документ — гид для разработчика, который впервые открывает репозиторий и хочет внести изменение. Цель: рабочее окружение, прохождение тестов и первый PR за один день.
1. Локальная сборка
Заголовок раздела «1. Локальная сборка»1.1 Системные зависимости
Заголовок раздела «1.1 Системные зависимости»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 clangToolchain Rust — фиксирован в rust-toolchain.toml.
При наличии rustup toolchain скачивается автоматически:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shrustup show # выберет версию из rust-toolchain.toml1.2 Сборка
Заголовок раздела «1.2 Сборка»cargo build --workspacecargo build --workspace --release1.3 Cargo features
Заголовок раздела «1.3 Cargo features»- Default: без специальных фич.
tessera_core/pkcs11-tests— включает интеграционные тесты, требующие реальногоgost-engineили softhsm2. Рецепт запуска с инициализацией токена softhsm2 — в §2.2.
2. Тесты
Заголовок раздела «2. Тесты»2.1 Юнит и обычные интеграционные тесты
Заголовок раздела «2.1 Юнит и обычные интеграционные тесты»cargo test --workspaceВсе unit- и integration-тесты должны проходить.
2.2 Интеграционные тесты с softhsm2
Заголовок раздела «2.2 Интеграционные тесты с softhsm2»sudo apt install softhsm2 opensc-pkcs11softhsm2-util --init-token --slot 0 \ --label test --pin 1234 --so-pin 5678SOFTHSM2_CONF=/etc/softhsm/softhsm2.conf \ cargo test --workspace --features tessera_core/pkcs11-testsPKCS#11-тесты добавляют дополнительный набор интеграционных проверок
(загрузка модуля, поиск сертификата, проверка CKA_EXTRACTABLE).
2.3 Smoke с pamtester
Заголовок раздела «2.3 Smoke с pamtester»Требует Linux + root + установленный tessera:
# В отдельной VM Astra SE 1.8:sudo apt install ./target/release/tessera_0.4.0-1_amd64.debsudo /usr/share/tessera/integrate-pam.sh --mode=2fa /etc/pam.d/sudopamtester sudo alice authenticate3. Pre-commit hooks
Заголовок раздела «3. Pre-commit hooks»В корне репозитория поставляется
.pre-commit-config.yaml. Установка:
pip install pre-commitpre-commit installЧто проверяется при коммите:
cargo fmt --all -- --check;cargo clippy --workspace --all-targets -- -D warnings;cargo deny check;cargo test --workspace;- синтаксис bash-скриптов (
bash -n); - совпадение версии
Cargo.toml↔debian/changelog; - отсутствие placeholder’ов MAX_INTEGRITY OID в трекаемых файлах.
Если у вас нет pre-commit-фреймворка, можно запускать команды
вручную:
cargo fmt --all -- --checkcargo clippy --workspace --all-targets -- -D warningscargo test --workspace4. Стиль коммитов
Заголовок раздела «4. Стиль коммитов»Формат — Conventional Commits:
<type>(<scope>): <subject>
<body>
<footer>Сообщения коммитов — на английском. Примеры:
feat(monitord): handle suspend/resume via D-Busfix(core): correct CRL freshness check for mode = "crl"docs(install): add Mode A scenario with FAT32 mediachore: bump serde to 1.0.xrefactor(proto): rename Pong to HelloAck for consistencytest(monitord): add suspend_grace e2e test
<scope> соответствует крейту или модулю: monitord, core, proto,
pam, install, arch, security, release, dev.
5. Workflow PR
Заголовок раздела «5. Workflow PR»-
Branch off
main:Окно терминала git checkout -b feat/awesome-feature main -
Атомарные коммиты: один логически целостный коммит за раз. PR обычно содержит 1–5 коммитов.
-
Авто-запуск CI: GitHub Actions:
.github/workflows/build.yml— тесты (ubuntu:cargo test, astra-контейнер:cargo nextest run), сборка.debв обоих вариантах,lintian(ubuntu-нога);.github/workflows/lint.yml—cargo clippy -D warningsи supply-chain (cargo deny,cargo audit);.github/workflows/nightly.yml— ежесуточный прогон тестов в release-профиле.cargo fmt --checkгоняется pre-commit-хуком, не в CI.
-
Code review checklist:
- есть ли тест на новую функциональность?
- обновлены ли соответствующие docs (configuration, architecture, threat-model)?
- не появилось ли новое поле в TOML без документации?
- не нарушает ли изменение fail-closed инварианты (см. architecture.md §13)?
- reproducible build не сломался?
-
Слить через squash + rebase merge. Большие PR — review по 3–5 коммитов; squash в
mainдля чистой истории.
6. Как добавить новый PKCS#11-провайдер
Заголовок раздела «6. Как добавить новый PKCS#11-провайдер»Текущая поддержка реализована в
crates/tessera_core/src/token/.
Шаги:
- Изучить интерфейсы (
PkcsModule,Session,Slot). - Реализовать новый адаптер в подмодуле (например,
token/newvendor/). - Зарегистрировать его через
crypto_backend = "pkcs11_native"с указаниемpkcs11_module = "/usr/lib/libnewvendor.so". - Добавить тесты:
- positive: загрузка модуля + поиск сертификата;
- negative: модуль не загрузился (несуществующий путь);
- non-extractable: проверка
CKA_EXTRACTABLE = false.
- Обновить документацию:
- README.md — раздел «Поддерживаемые токены»;
- docs/install.md — раздел установки драйвера;
- docs/configuration.md — таблица модулей;
- docs/threat-model.md — §3.3 (если меняется модель угроз).
7. Как добавить новый источник host_id
Заголовок раздела «7. Как добавить новый источник host_id»См. crates/tessera_core/src/host_identity/.
Шаги:
- Создать модуль
<source>.rsс реализацией трейтаHostIdSource. - Зарегистрировать в
chain.rs(HostIdentityResolver::from_validated). - Добавить в
RawHostIdentity::sources(валидация имени). - Добавить в
HostIdSourceKind(ssoc-енум). - Тесты:
- positive: источник возвращает значение;
- negative: источник недоступен → следующий в chain срабатывает.
- Обновить 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 для семантики записей.
8. Версионирование
Заголовок раздела «8. Версионирование»Семантика 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-релиз требует:
- миграционной заметки в docs/changelog.md;
- обновления
PROTOCOL_VERSIONвcrates/tessera_proto/src/version.rs(если изменяется wire-протокол); - обновления модели угроз (docs/threat-model.md).