307 lines
9.8 KiB
Markdown
307 lines
9.8 KiB
Markdown
# SBOM и release checklist
|
|
|
|
Документ фиксирует минимальный порядок подготовки публичного релиза
|
|
AWatch-rus: исходники, сборка, артефакты, сторонние компоненты,
|
|
лицензии, публичная гигиена и экспертная проверка.
|
|
|
|
## 1. Идентификация релиза
|
|
|
|
Перед сборкой зафиксировать:
|
|
|
|
- product name: `AWatch-rus, программный продукт`;
|
|
- repository: `AWatch-rus`;
|
|
- release tag: `vX.Y.Z`;
|
|
- commit: вывод `git rev-parse HEAD`;
|
|
- дата сборки;
|
|
- ответственный правообладатель/maintainer;
|
|
- состав release assets.
|
|
|
|
Команды:
|
|
|
|
```bash
|
|
git status --short
|
|
git rev-parse HEAD
|
|
git tag --points-at HEAD
|
|
```
|
|
|
|
Критерий:
|
|
|
|
- рабочее дерево не содержит незапланированных tracked-изменений;
|
|
- tag указывает на проверенный commit;
|
|
- release notes соответствуют фактическому составу поставки.
|
|
|
|
## 2. Публичная гигиена репозитория
|
|
|
|
Проверить отсутствие приватных идентификаторов в публичных документах:
|
|
|
|
```bash
|
|
PRIVATE_MARKERS_REGEX='<PRIVATE_HOSTNAME>|<PRIVATE_PUBLIC_DOMAIN>|<LOCAL_OPERATOR_HOME>|<ROOT_PRIVATE_PATH>'
|
|
git grep -n -E "$PRIVATE_MARKERS_REGEX" -- \
|
|
README.md docs REGISTER_RU_SOFTWARE.md PRODUCT_DESCRIPTION_RU.md \
|
|
SECURITY_OVERVIEW_RU.md adk-rust/RUNBOOK.md || true
|
|
```
|
|
|
|
Проверить реальные IP в release-facing документах:
|
|
|
|
```bash
|
|
git grep -n -E '10\\.10\\.10\\.|192\\.168\\.' -- \
|
|
README.md docs REGISTER_RU_SOFTWARE.md PRODUCT_DESCRIPTION_RU.md \
|
|
SECURITY_OVERVIEW_RU.md adk-rust/RUNBOOK.md || true
|
|
```
|
|
|
|
Критерий:
|
|
|
|
- в документах нет приватных IP, доменов, usernames и live hostnames;
|
|
- допускаются только placeholders: `<AW_SERVER_HOST>`, `<GRAFANA_HOST>`,
|
|
`<PUBLIC_GATEWAY_FQDN>`, `HOST-EXAMPLE`, `WINDOWS_USER_EXAMPLE`;
|
|
- приватные configs находятся только в ignored-файлах.
|
|
|
|
## 3. Контроль секретов
|
|
|
|
Проверить, что в репозиторий не попали secrets:
|
|
|
|
```bash
|
|
git ls-files | grep -E '(^|/)secrets(/|$)|\\.env$|inventory\\.ini$' || true
|
|
git grep -n -E 'sk_[A-Za-z0-9]|pk_[A-Za-z0-9]|BEGIN OPENSSH PRIVATE KEY|password\\s*=' -- . || true
|
|
```
|
|
|
|
Рекомендуемый дополнительный контроль:
|
|
|
|
```bash
|
|
gitleaks detect --source . --no-git --redact
|
|
```
|
|
|
|
Критерий:
|
|
|
|
- директория `secrets/` не отслеживается Git;
|
|
- `.env`, `inventory.ini`, tokens, passwords и private keys отсутствуют в
|
|
tracked-файлах;
|
|
- если секрет ранее был опубликован, он ротируется вне этого checklist.
|
|
|
|
## 4. Сборка Rust workspace
|
|
|
|
Собрать Rust-компоненты:
|
|
|
|
```bash
|
|
cd adk-rust
|
|
cargo fmt --all -- --check
|
|
cargo test --workspace
|
|
cargo clippy --workspace --all-targets -- -D warnings
|
|
cargo build --release --workspace
|
|
cd ..
|
|
```
|
|
|
|
Критерий:
|
|
|
|
- formatting clean;
|
|
- tests green;
|
|
- clippy без warnings;
|
|
- release-бинарники собраны.
|
|
|
|
## 5. Проверка Python-исключений
|
|
|
|
Python в проекте допускается только как:
|
|
|
|
- Telegram runtime, который решено оставить на Python;
|
|
- совместимые legacy fallbacks;
|
|
- installer/ops helpers, пока они не являются ядром продукта;
|
|
- тестовые и migration utilities.
|
|
|
|
Проверка:
|
|
|
|
```bash
|
|
git ls-files '*.py'
|
|
```
|
|
|
|
Критерий:
|
|
|
|
- Python-файлы имеют понятную роль;
|
|
- ядро AWatch-rus позиционируется как Rust-first;
|
|
- README/registry docs не обещают отсутствие Python там, где он еще остается.
|
|
|
|
## 6. Third-party license inventory
|
|
|
|
Основной license inventory:
|
|
|
|
- [`../THIRD_PARTY_LICENSES_RU.md`](../THIRD_PARTY_LICENSES_RU.md)
|
|
|
|
Проверить минимум:
|
|
|
|
- ActivityWatch components: MPL-2.0 или лицензии конкретных upstream parts;
|
|
- Grafana: AGPL-3.0 или актуальная лицензия используемой версии;
|
|
- Prometheus: Apache-2.0;
|
|
- Hayabusa: лицензия upstream и правила распространения;
|
|
- Ansible: GPL-3.0-or-later;
|
|
- Rust crates: по `cargo metadata`, `cargo about`, `cargo deny`;
|
|
- Python dependencies: по `pip-licenses` или lock-файлам;
|
|
- JavaScript/Node dependencies для Playwright/UI helpers: по `npm ls` и
|
|
package metadata.
|
|
|
|
Критерий:
|
|
|
|
- для каждого крупного компонента указан upstream, license, роль и риск;
|
|
- copyleft-компоненты не скрыты;
|
|
- release notes не противоречат лицензиям.
|
|
|
|
## 7. SBOM
|
|
|
|
Сформировать машинные перечни зависимостей.
|
|
|
|
Для release-readiness v0.2 используется единый генератор:
|
|
|
|
```bash
|
|
bash scripts/generate_release_sbom_v0_2.sh dist/release-v0.2
|
|
```
|
|
|
|
Он формирует:
|
|
|
|
- `cyclonedx-rust-v0.2.json`;
|
|
- `spdx-rust-v0.2.json`;
|
|
- `cargo-metadata-v0.2.json`;
|
|
- `cargo-tree-v0.2.txt`;
|
|
- `python-inputs-v0.2.txt`;
|
|
- `RELEASE_ASSETS_MANIFEST-v0.2.json`;
|
|
- `SHA256SUMS-v0.2.txt`.
|
|
|
|
Rust:
|
|
|
|
```bash
|
|
cd adk-rust
|
|
cargo metadata --format-version 1 > ../sbom-cargo-metadata.json
|
|
cargo tree --workspace > ../sbom-cargo-tree.txt
|
|
cd ..
|
|
```
|
|
|
|
Python, если используется виртуальное окружение:
|
|
|
|
```bash
|
|
python3 -m pip freeze > sbom-python-freeze.txt
|
|
```
|
|
|
|
Node/Playwright, если используется frontend smoke tooling:
|
|
|
|
```bash
|
|
npm ls --all --json > sbom-npm-tree.json
|
|
```
|
|
|
|
OS packages на эталонной VM:
|
|
|
|
```bash
|
|
dpkg-query -W -f='${Package}\\t${Version}\\n' > sbom-debian-packages.tsv
|
|
```
|
|
|
|
Критерий:
|
|
|
|
- SBOM artifacts приложены к release assets или сохранены в build archive;
|
|
- SBOM не содержит секретов;
|
|
- SBOM соответствует проверяемому commit/tag.
|
|
|
|
## 8. Release assets
|
|
|
|
Собрать install-kit и бинарные артефакты только из проверенного commit:
|
|
|
|
```bash
|
|
scripts/rebuild_install_kit.sh
|
|
scripts/validate_install_kit.sh
|
|
```
|
|
|
|
Критерий:
|
|
|
|
- dated zip/tar.gz не лежат в корне tracked-репозитория;
|
|
- архивы публикуются как GitHub Release assets;
|
|
- checksum каждого asset зафиксирован.
|
|
|
|
Пример фиксации checksum:
|
|
|
|
```bash
|
|
sha256sum dist/* install-kit-awindows-*.zip install-kit-awindows-*.tar.gz \
|
|
> SHA256SUMS
|
|
```
|
|
|
|
Проверка release assets v0.2:
|
|
|
|
```bash
|
|
RELEASE_VERIFY_PUBLIC_KEY=<RELEASE_PUBLIC_KEY.pem> \
|
|
bash scripts/verify_release_assets.sh dist/release-v0.2
|
|
```
|
|
|
|
CI self-test:
|
|
|
|
```bash
|
|
bash scripts/verify_release_assets.sh --self-test
|
|
```
|
|
|
|
## 9. Документы для реестра российского ПО
|
|
|
|
Проверить наличие и актуальность:
|
|
|
|
- `REGISTER_RU_SOFTWARE.md`;
|
|
- `PRODUCT_DESCRIPTION_RU.md`;
|
|
- `THIRD_PARTY_LICENSES_RU.md`;
|
|
- `docs/INSTALL_FOR_EXPERT_RU.md`;
|
|
- `docs/ARCHITECTURE_RU.md`;
|
|
- `docs/ADMIN_GUIDE_RU.md`;
|
|
- `docs/OPERATOR_GUIDE_RU.md`;
|
|
- `docs/OWNERSHIP_RU.md`;
|
|
- `docs/REGISTRY_CHECKLIST_RU.md`.
|
|
|
|
Критерий:
|
|
|
|
- документы согласованы по названию продукта;
|
|
- не заявляются DLP/SIEM/EDR/XDR/сертифицированная СЗИ как основной класс;
|
|
- позиционирование: операционный контроль, технический аудит, автоматизация
|
|
эксплуатации ИТ-инфраструктуры.
|
|
|
|
## 10. Экспертная установка
|
|
|
|
Проверить релиз на чистой VM по:
|
|
|
|
- [`INSTALL_FOR_EXPERT_RU.md`](INSTALL_FOR_EXPERT_RU.md)
|
|
|
|
Критерий:
|
|
|
|
- чистая VM проходит путь установка -> сборка -> проверка;
|
|
- ActivityWatch API отвечает;
|
|
- базовые AWatch-rus checks работают;
|
|
- diagnostic bundle собран;
|
|
- инструкция воспроизводима без доступа к личному стенду разработчика.
|
|
|
|
## 11. GitHub metadata
|
|
|
|
Проверить публичную страницу репозитория:
|
|
|
|
- description заполнен;
|
|
- website/homepage заполнен;
|
|
- topics заполнены;
|
|
- license отображается;
|
|
- releases содержат бинарные/install-kit assets;
|
|
- root README не содержит приватных адресов и личных путей.
|
|
|
|
Критерий:
|
|
|
|
- проект выглядит как поставляемое ПО, а не как личный стенд;
|
|
- About/Topics/Website заполнены;
|
|
- license detected на GitHub.
|
|
|
|
## 12. Финальный gate перед публикацией
|
|
|
|
Команды:
|
|
|
|
```bash
|
|
git diff --check
|
|
git status --short
|
|
PRIVATE_MARKERS_REGEX='<PRIVATE_HOSTNAME>|<PRIVATE_PUBLIC_DOMAIN>|<LOCAL_OPERATOR_HOME>|<ROOT_PRIVATE_PATH>'
|
|
git grep -n -E "$PRIVATE_MARKERS_REGEX" -- \
|
|
README.md docs REGISTER_RU_SOFTWARE.md PRODUCT_DESCRIPTION_RU.md \
|
|
SECURITY_OVERVIEW_RU.md adk-rust/RUNBOOK.md || true
|
|
```
|
|
|
|
Критерий публикации:
|
|
|
|
- diff не содержит whitespace errors;
|
|
- tracked changes входят в один понятный commit;
|
|
- release-facing docs обезличены;
|
|
- install-kit artifacts вынесены в Release assets;
|
|
- SBOM/license checklist приложен или воспроизводим;
|
|
- tag создан только после прохождения проверок.
|