sentinel

Проекты, которые следуют приведенным ниже лучшим практикам, могут добровольно и самостоятельно оценить себя и продемонстрировать, что они получили значок Open Source Security Foundation (OpenSSF).

Не существует набора практик, гарантирующего, что у программного обеспечения никогда не будет недостатков или уязвимостей; даже формальные методы могут не помочь, если спецификации или допущения ошибочны. Также не существует какой-либо практики, которая могла бы гарантировать, что проект будет поддерживать здоровое и хорошо функционирующее сообщество разработчиков. Однако следующие хорошие правила могут помочь улучшить результаты проектов. Например, некоторые правила описывают ревью несколькими участниками перед выпуском, что может помочь найти технические уязвимости, которые было бы сложно найти другим способом, и помочь построить доверие и желание дальнейшего взаимодействия между разработчиками из разных компаний. Чтобы получить значок, нужно выполнить все критерии с ключевыми словами "НЕОБХОДИМО"/"ОБЯЗАН"/"НЕДОПУСТИМО", все критерии со словом "СЛЕДУЕТ" либо должны удовлетворяться, либо должно быть приведено обоснование их невыполнения, и все критерии со словом "ЖЕЛАТЕЛЬНО" могут быть удовлетворены ИЛИ неудовлетворены (желательно, чтобы они были хотя бы рассмотрены). Если вы хотите ввести общий комментарий вместо объяснения, почему текущая ситуация приемлема, начните текст с '//' и пробела. Приветствуется обратная связь через сайт на GitHub в виде issues или pull requests. Существует также список рассылки для общих вопросов.

Мы с удовольствием предоставляем информацию на нескольких языках, однако, если есть какой-либо конфликт или несоответствие между переводами, английская версия является авторитетной.
Если это ваш проект, пожалуйста, отобразите статус вашего базового значка на странице проекта! Статус базового значка выглядит так: Базовый уровень значка для проекта 14063 - baseline-1 Вот как встроить базовый значок:
Вы можете показать статус базового значка, вставив это в ваш файл markdown:
[![OpenSSF Baseline](https://www.bestpractices.dev/projects/14063/baseline)](https://www.bestpractices.dev/projects/14063)
или вставив это в ваш HTML:
<a href="https://www.bestpractices.dev/projects/14063"><img src="https://www.bestpractices.dev/projects/14063/baseline"></a>


Это критерии Базового Уровня 3. Это критерии версии v2026.08.28.

Baseline Series: Базовый уровень 1 Базовый Уровень 2 Базовый Уровень 3

        

 Основы

  • Общая

    Обратите внимание, что другие проекты могут использовать то же имя.

    The security update management platform for SUSE and openSUSE Linux distributions

    Используйте формат выражения лицензии SPDX; примеры включают «Apache-2.0», «BSD-2-Clause», «BSD-3-Clause», «GPL-2.0+», «LGPL-3.0+», «MIT» и «(BSD-2-Clause OR Ruby)».
    Если используется более одного языка, перечислите их через запятую (пробелы необязательны), и отсортируйте их от наиболее до наименее используемого. Если список длинный, пожалуйста, перечислите по крайней мере три наиболее распространенных. Если языка нет (например, это проект только для документации или только для тестирования), используйте один символ «-» (минус). Для каждого языка используйте общепринятую капитализацию названия, например «JavaScript».
    Common Platform Enumeration (CPE) - это структурированная схема именования для информационных систем, программного обеспечения и пакетов. Она используется в ряде систем и баз данных для отчетов об уязвимостях.

 Элементы управления 12/21

  • Элементы управления


    Когда задаче назначаются разрешения в конвейере CI/CD, исходный код или конфигурация ДОЛЖНЫ назначать только минимальные привилегии, необходимые для соответствующей деятельности. [OSPS-AC-04.02]
    Настройте конвейеры CI/CD проекта так, чтобы по умолчанию назначать пользователям и службам наименьшие доступные разрешения, повышая разрешения только когда это необходимо для конкретных задач. В некоторых системах контроля версий это может быть возможно на уровне организации или репозитория. Если нет, установите разрешения на верхнем уровне конвейера.

    Every workflow declares permissions at either the top level or per-job, restricted to the minimum required for that specific activity. Examples: ci.yml uses only contents: read; build-images.yml grants packages: write only to the publish job; deploy-api-docs.yml splits permissions per job (contents: read for build, pages: write + id-token: write only for the deploy job); release-please.yml sets top-level permissions: {} and grants contents: write, issues: write, pull-requests: write only to the single job that needs them. The repository default workflow permissions are set to read, ensuring any job without explicit permissions receives the minimum.



    Конвейеры CI/CD, принимающие входные данные от доверенных коллабораторов, ДОЛЖНЫ санировать и проверять эти входные данные перед их использованием в конвейере. [OSPS-BR-01.04]
    Конвейеры CI/CD должны санировать (заключать в кавычки, экранировать или завершаться при ожидаемых значениях) все входные данные коллабораторов при явном выполнении рабочих процессов. Хотя коллабораторы в целом являются доверенными, ручные входные данные для рабочего процесса не могут быть проверены и могут быть использованы в злоумышленных целях при захвате учётной записи или угрозе изнутри.

    All workflows that consume collaborator-controlled input (PR title, PR body, branch names) pass those values exclusively through environment variables (env:) rather than inline ${{ }} interpolation in run: blocks — preventing shell injection. The pr-metadata.yml workflow (the only one that processes attacker-controllable input like PR titles and bodies) explicitly uses env: PR_TITLE: ${{ github.event.pull_request.title }} and then references "${PR_TITLE}" with proper quoting in the shell script. The build-images.yml workflow similarly passes image tags via env: IMAGE_TAGS with an inline comment explaining this is done "to avoid shell-injection risk from untrusted ref/tag content." No workflow interpolates untrusted input directly into a run: script.



    Когда создается официальный релиз, все активы в этом релизе ДОЛЖНЫ быть четко связаны с идентификатором релиза или другим уникальным идентификатором для актива. [OSPS-BR-02.02]
    Назначьте уникальный идентификатор версии каждому программному активу, произведенному проектом, следуя единообразному соглашению об именовании или схеме нумерации. Примеры включают SemVer, CalVer или идентификатор git-коммита.

    Each GitHub Release is associated with its unique version tag (v0.3.0, etc.). The container images published to ghcr.io are tagged with the corresponding semver release tag (e.g., ghcr.io/staypirate/sentinel:0.3.0) alongside latest, ensuring the OCI artifact is clearly tied to the release identifier. The release changelog in the GitHub Release body references the exact Git commits (SHAs) included in that version. The uv.lock file is version-bumped by release-please as part of the release commit, associating the locked dependency set with the release.



    НЕОБХОДИМО, чтобы проект определил политику управления секретами и учетными данными, используемыми проектом. Политика должна включать руководства по хранению, доступу и ротации секретов и учетных данных. [OSPS-BR-07.02]
    Задокументируйте, как секреты и учетные данные управляются и используются в рамках проекта. Это должно включать подробную информацию о том, как хранятся секреты (например, с использованием инструмента управления секретами), как контролируется доступ, и как секреты ротируются или обновляются. Убедитесь, что конфиденциальная информация не встроена в исходный код и не хранится в системах контроля версий.

    The project defines a multi-layered secrets management policy across its documentation:

    • Storage: docs/deployment.md (No secrets in workflow files) mandates that CI credentials are stored exclusively in GitHub Secrets (${{ secrets.* }}), never as literals in workflow files. The Repository Secrets section documents each secret's purpose and required permissions.
    • Access: docs/conventions.md (Secret Field Typing) requires all secret configuration fields to use Pydantic SecretStr, preventing accidental exposure via repr/logging/serialization. Log statements are forbidden from including secrets (Secrets and PII Discipline in logging.md).
    • Rotation: docs/deployment.md documents JWT_SECRET_KEY rotation impact (session invalidation, off-peak maintenance window). Environment-variable injection ensures secrets are never baked into images.
    • Prevention: gitleaks pre-commit hook scans for accidentally committed secrets; GitHub Push Protection is enabled at the repository level.


    Когда проект выпустил релиз, документация проекта ДОЛЖНА содержать инструкции по проверке целостности и подлинности активов релиза. [OSPS-DO-03.01]
    Инструкции в проекте должны содержать информацию об используемой технологии, командах для выполнения и ожидаемом выводе. По возможности избегайте хранения этой документации в том же месте, что и конвейер сборки и выпуска, чтобы избежать компрометации как программного обеспечения, так и документации для проверки целостности программного обеспечения в случае единичного нарушения безопасности.

    There are no instructions in the project documentation for verifying the integrity or authenticity of release assets. No cryptographic signatures, checksums, or signed manifests are published alongside releases (as noted in the earlier signing criterion). Without signed assets, there is nothing for a consumer to verify. This is the counterpart to the earlier "release MUST be signed" criterion — both are currently unmet.



    Когда проект выпустил релиз, документация проекта ДОЛЖНА содержать инструкции по проверке ожидаемой личности человека или процесса, создающего программный релиз. [OSPS-DO-03.02]
    Ожидаемая личность может быть в форме идентификаторов ключей, используемых для подписи, эмитента и личности из сертификата sigstore или других подобных форм. По возможности избегайте хранения этой документации в том же месте, что и конвейер сборки и выпуска, чтобы избежать компрометации как программного обеспечения, так и документации для проверки целостности программного обеспечения в случае единичного нарушения безопасности.

    The project does not document how to verify who authored a release. Releases are created by the release-please automation using a RELEASE_TOKEN PAT, but there are no instructions for consumers to verify that a given release was produced by an authorized project maintainer (e.g., via GPG-signed tags, Sigstore identity verification, or GitHub's commit signing verification). The Git tags are unsigned, and no provenance attestation links the release to a specific verified identity.



    Когда проект выпустил релиз, документация проекта ДОЛЖНА включать описательное заявление о масштабе и сроках поддержки для каждого релиза. [OSPS-DO-04.01]
    Для информирования о масштабе и сроках поддержки выпущенных программных активов проекта, проект должен иметь файл SUPPORT.md, раздел "Поддержка" в SECURITY.md или другую документацию, объясняющую жизненный цикл поддержки, включая ожидаемую продолжительность поддержки для каждого релиза, типы предоставляемой поддержки (например, исправления ошибок, обновления безопасности) и любые соответствующие политики или процедуры получения поддержки.

    The project documentation does not include a support policy stating which releases receive security patches, bug fixes, or how long each release is supported. The versioning section in docs/conventions.md defines SemVer interpretation and pre-1.0 rules, but does not state whether only the latest release is supported, whether older minor versions receive backports, or what the expected support duration is for any given release.



    Когда проект выпустил релиз, документация проекта ДОЛЖНА предоставлять описательное заявление о том, когда релизы или версии больше не будут получать обновления безопасности. [OSPS-DO-05.01]
    Для информирования о масштабе и сроках поддержки исправлений безопасности, проект должен иметь SUPPORT.md или другую документацию, объясняющую политику проекта в отношении обновлений безопасности.

    Same gap as above — there is no end-of-life (EOL) or end-of-support policy documented. The project does not state when a given release will stop receiving security updates, nor does it define the conditions under which a version transitions from "supported" to "unsupported."



    Документация проекта ОБЯЗАНА содержать политику, согласно которой соавторы кода проходят проверку перед предоставлением им расширенных прав доступа к чувствительным ресурсам. [OSPS-GV-04.01]
    Опубликуйте исполняемую политику в документации проекта, которая требует, чтобы участники кода были проверены и одобрены до предоставления повышенных разрешений на доступ к критическим ресурсам, таким как одобрение слияния или доступ к секретам. Рекомендуется, чтобы проверка включала установление обоснованной линии идентичности, такой как подтверждение связи участника с известной доверенной организацией.

    The repository is currently single-maintainer (sole owner of all repository permissions). GitHub's built-in access model requires the repository owner to explicitly grant collaborator access — no one can self-escalate. Branch protection rules enforce PR review requirements for all code reaching master. The CONTRIBUTING.md documents the contribution workflow (fork, PR, CI must pass), and the repository owner is the sole merge authority. For a single-maintainer project, this satisfies the criterion — there is no delegation of sensitive access without the owner's explicit action.



    Когда проект выпустил релиз, все скомпилированные выпущенные программные активы ДОЛЖНЫ поставляться со списком компонентов программного обеспечения (Software Bill of Materials). [OSPS-QA-02.02]
    Рекомендуется автоматически генерировать SBOM во время сборки с использованием инструмента, который был проверен на точность. Это позволяет пользователям получать эти данные стандартизированным способом наряду с другими проектами в их среде.

    No SBOM (Software Bill of Materials) is generated or published with releases. The build-images.yml workflow builds and pushes the container image to ghcr.io but does not generate an SBOM (e.g., via docker/build-push-action's sbom option, syft, or trivy). GitHub Releases contain no attached assets at all — no SPDX, CycloneDX, or other SBOM format is produced or distributed alongside the OCI image or the source release.



    Когда проект выпустил релиз, состоящий из нескольких репозиториев исходного кода, все подпроекты ДОЛЖНЫ применять требования безопасности, которые являются столь же строгими или более строгими, чем первичная кодовая база. [OSPS-QA-04.02]
    Любые дополнительные репозитории кода подпроектов, созданные проектом и скомпилированные в релиз, должны применять требования безопасности в соответствии со статусом и целями соответствующей кодовой базы. В дополнение к следованию соответствующим требованиям OSPS Baseline, это может включать требование проверки безопасности, обеспечение отсутствия уязвимостей и обеспечение отсутствия известных проблем безопасности.

    Sentinel is a single-repository project. There is no multi-repo release comprising subprojects — the backend, migrations, task definitions, and specifications all live in this single repository and ship as one OCI image. The frontend will be developed in a separate repository but is not yet released. This criterion does not apply until a release spans mul



    Документация проекта ОБЯЗАНА четко описывать, когда и как выполняются тесты. [OSPS-QA-06.02]
    Добавьте раздел в документацию по участию в проекте, объясняющий, как запускать тесты локально и как запускать тесты в конвейере CI/CD. Документация должна объяснять, что тестируют тесты и как интерпретировать результаты.

    docs/features/platform/testing-strategy.md is the authoritative document for the testing strategy, including when and how tests are run. It defines the test pyramid (unit, integration, e2e), the CI pipeline gate composition, required markers (@pytest.mark.unit, @pytest.mark.integration, @pytest.mark.e2e), and execution model. docs/deployment.md (Workflow Inventory) documents that the CI workflow runs on every push to master and every pull request. CONTRIBUTING.md documents how developers run tests locally (make test, uv run pytest). The pre-commit hook automatically runs the unit test subset on every commit.



    Документация проекта ОБЯЗАНА включать политику, согласно которой все существенные изменения в программном обеспечении, создаваемом проектом, должны сопровождаться добавлением или обновлением тестов соответствующей функциональности в наборе автоматических тестов. [OSPS-QA-06.03]
    Добавьте раздел в документацию по участию в проекте, объясняющий политику добавления или обновления тестов. Политика должна объяснять, что представляет собой значительное изменение и какие тесты должны быть добавлены или обновлены.

    AGENTS.md (Guardrail 6, Mandatory Testing) defines an explicit policy: "Every code change (new feature or modification) MUST include tests." It requires tests for new API endpoints (happy path, validation, auth), new models (creation, constraints, relationships), new services (business logic, edge cases, error handling), and bug fixes (regression tests). The policy explicitly states "NEVER skip tests" and instructs that if asked to skip, the developer must be reminded of the requirement. CONTRIBUTING.md reinforces this under the "Pull Request Checklist" — all PRs must include tests and CI must pass before merge.



    Когда совершается коммит в основную ветку, система контроля версий проекта ДОЛЖНА требовать как минимум одного одобрения изменений человеком, не являющимся автором, перед слиянием. [OSPS-QA-07.01]
    Настройте систему контроля версий проекта так, чтобы она требовала как минимум одного одобрения изменений человеком, не являющимся автором, перед слиянием в релизную или основную ветку. Это можно достичь, требуя, чтобы запрос на включение изменений был рассмотрен и одобрен как минимум одним другим участником, прежде чем его можно будет объединить.

    Branch protection on master requires a pull request before merge, but the required approvals count is set to 0. This means a PR author can merge their own changes without any non-author human review. The project is currently single-maintainer, which makes enforcing non-author approval impractical (there is no second person to approve), but the criterion as stated is not satisfied by the current configuration.



    Когда проект выпустил релиз, проект ДОЛЖЕН выполнить моделирование угроз и анализ поверхности атаки для понимания и защиты от атак на критические пути кода, функции и взаимодействия внутри системы. [OSPS-SA-03.02]
    Моделирование угроз - это деятельность, при которой проект рассматривает кодовую базу, связанные процессы и инфраструктуру, интерфейсы, ключевые компоненты и "думает как хакер", проводя мозговой штурм о том, как система может быть взломана или скомпрометирована. Каждая выявленная угроза перечисляется, чтобы проект мог затем подумать о том, как проактивно избежать или закрыть любые бреши/уязвимости, которые могут возникнуть. Убедитесь, что это обновляется для новых функций или критических изменений.

    The project performs systematic threat modeling and attack surface analysis through its mandatory @security-reviewer invocations (Guardrail 10) on every security-sensitive change. The docs/reviews/ directory contains 50+ review documents with explicit threat model assessments for critical code paths — authentication (local-authentication.md documents brute-force resistance, offline attack models), networking (networking.md documents trusted-upstream assumptions, connection security), RBAC (rbac.md documents pre-disclosure data exposure), and all external integrations. Specifications themselves document threat considerations inline (e.g., API key self-replication prevention, JWT secret minimum length enforcement, session fixation protections, rate limiting requirements). The attack surface is analyzed per-component rather than in a single monolithic document, with each review recording findings, risk acceptance decisions with rationale, and residual risk.



    Любые уязвимости в программных компонентах, не затрагивающие проект, ОБЯЗАНЫ учитываться в документе VEX, дополняющем отчет об уязвимости сведениями о невозможности эксплуатации. [OSPS-VM-04.02]
    Создайте поток VEX, сообщающий о статусе эксплуатируемости известных уязвимостей, включая детали оценки или любые меры по смягчению, препятствующие выполнению уязвимого кода.

    The project does not produce or publish VEX (Vulnerability Exploitability eXchange) documents. While image-scan.yml runs weekly Trivy scans and opens tracking issues for OS-level vulnerabilities, and pip-audit gates Python dependencies on every merge, neither produces a VEX document that formally accounts for non-exploitable vulnerabilities with justification (e.g., "not affected", "false positive", "component not reachable"). There is no CSAF/VEX or OpenVEX artifact generated as part of the release or scanning process.



    Документация проекта ОБЯЗАНА включать политику, определяющую порог для устранения проблем, выявленных при анализе состава программного обеспечения (SCA), связанных с уязвимостями и лицензиями. [OSPS-VM-05.01]
    Задокументируйте в проекте политику, определяющую порог для устранения результатов SCA, связанных с уязвимостями и лицензиями. Включите процесс выявления, приоритизации и устранения этих результатов.

    The project does not document a policy defining remediation timeframes for SCA (Software Composition Analysis) findings. While pip-audit gates every PR (blocking merge if a known-vulnerable dependency is present) and image-scan.yml runs weekly Trivy scans with tracking issues, there is no documented policy specifying:

    • Maximum time allowed to remediate critical/high/medium/low vulnerability findings
    • How license compliance findings are handled (no license scanning is configured)
    • Thresholds or SLAs for when a vulnerability must be addressed vs. accepted as risk


    Документация проекта ОБЯЗАНА включать политику устранения нарушений, выявленных при анализе состава программного обеспечения (SCA), перед каждым выпуском. [OSPS-VM-05.02]
    Задокументируйте в проекте политику для устранения применимых результатов анализа состава программного обеспечения перед любым релизом и добавьте проверки статуса, которые подтверждают соответствие этой политике перед релизом.

    The CI pipeline enforces a strict gate: pip-audit runs on every pull request and blocks merge if any known-vulnerable dependency is detected (backend-security job in ci.yml). This means no release can be created with a known Python dependency vulnerability — the release path requires CI to pass on master, and release-please.yml only triggers after a successful CI run. Additionally, image-scan.yml runs weekly Trivy scans against the published container image for OS-level vulnerabilities and opens tracking issues. The combination ensures SCA violations are addressed (Python deps) or tracked (OS-level) prior to and between releases.



    Все изменения в кодовой базе проекта ОБЯЗАНЫ автоматически проверяться на соответствие задокументированной политике в отношении вредоносных зависимостей и известных уязвимостей в зависимостях, и блокироваться при выявлении нарушений, за исключением случаев, когда они заявлены и подавлены как неэксплуатируемые. [OSPS-VM-05.03]
    Создайте проверку статуса в системе контроля версий проекта, которая запускает инструмент анализа состава программного обеспечения для всех изменений в кодовой базе. Требуйте, чтобы проверка статуса проходила успешно, прежде чем изменения могут быть объединены.

    Every change to the codebase is automatically evaluated by the CI pipeline before merge: pip-audit (in the backend-security job of ci.yml) checks all Python dependencies against known vulnerability databases and blocks the PR if a violation is found. bandit runs static security analysis in the same job. Branch protection requires the "Backend Security Scan" status check to pass — no code reaches master without passing these gates. Dependabot is configured to propose dependency updates weekly, providing proactive notification of vulnerable or outdated dependencies. The suppression mechanism exists via pip-audit's --ignore-vuln flag (though currently unused), which would require explicit declaration of non-exploitability.



    Документация проекта ОБЯЗАНА включать политику, определяющую порог для устранения проблем, выявленных статическим анализом кода безопасности (SAST). [OSPS-VM-06.01]
    Задокументируйте в проекте политику, определяющую порог для устранения результатов статического тестирования безопасности приложений (SAST). Включите процесс выявления, приоритизации и устранения этих результатов.

    The project does not document a policy defining remediation timeframes or thresholds for SAST (Static Application Security Testing) findings. While bandit runs on every PR as part of the backend-security CI job and blocks merge on findings, there is no documented policy specifying:

    • Severity thresholds for blocking vs. non-blocking findings
    • Maximum remediation timeframes by severity level
    • Suppression/acceptance process for false positives (e.g., required justification format for # nosec annotations)


    Все изменения в кодовой базе проекта ОБЯЗАНЫ автоматически проверяться на соответствие задокументированной политике в отношении слабых мест безопасности и блокироваться при выявлении нарушений, за исключением случаев, когда они заявлены и подавлены как неэксплуатируемые. [OSPS-VM-06.02]
    Создайте проверку статуса в системе контроля версий проекта, которая запускает инструмент статического тестирования безопасности приложений (SAST) для всех изменений в кодовой базе. Требуйте, чтобы проверка статуса проходила успешно, прежде чем изменения могут быть объединены.

    All changes to the codebase are automatically evaluated for security weaknesses before merge: bandit (SAST) runs in the backend-security job of ci.yml and blocks the PR on findings. mypy --strict (static type checking) catches type-safety issues that can lead to security weaknesses. Branch protection requires "Backend Security Scan" and "Backend Type Check" to pass — no code reaches master without passing these gates. Suppression is supported via bandit's # nosec inline annotations for declared false positives, and mypy's per-line type-ignore with required error codes (blanket suppressions are forbidden per docs/conventions.md).



Вы можете использовать инструменты и системы ИИ для предложения изменений через простой URL, например https://www.bestpractices.dev/ru/projects/14063/choose/edit?osps_ac_01_01_status=Met&osps_ac_01_01_justification=GitHub+enforced. Смотрите нашу систему автоматизированных предложений о том, как это сделать. Эти данные доступны по лицензии Community Data License Agreement – Permissive, Version 2.0 (CDLA-Permissive-2.0). Это означает, что получатель данных может распространять данные с изменениями или без них, при условии, что получатель данных предоставляет текст данного соглашения вместе с распространяемыми данными. Пожалуйста, укажите в качестве источника Gianluca Gabrielli и участников OpenSSF Best Practices badge.

Владелец анкеты на значок проекта: Gianluca Gabrielli.
2026-08-13 13:55:49 UTC, последнее изменение сделано 2026-08-14 06:09:03 UTC. Последний раз условия для получения значка были выполнены 2026-08-13 16:48:08 UTC.