chore(security): harden public secret scan and document policy
This commit is contained in:
@@ -97,7 +97,7 @@ git grep -n -E 'password|token|secret' -- \
|
||||
ansible/group_vars/aw_server.yml:4:ansible_password: "{{ lookup('env', 'AW_SSH_PASSWORD') }}"
|
||||
ansible/group_vars/aw_windows.yml:4:ansible_password: "{{ lookup('env', 'AW_WINRM_PASSWORD') }}"
|
||||
ansible/group_vars/proxmox-bot.example.yml:1:telegram_bot_token: "CHANGE_ME"
|
||||
ansible/group_vars/pfsense-poller.example.yml:17: api_secret: "replace-me"
|
||||
ansible/group_vars/pfsense-poller.example.yml:17: api_secret: "<SET_VIA_ENV>"
|
||||
docs/INSTALL_RU.md:66:- Telegram bot token;
|
||||
docs/INSTALL_RU.md:67:- evidence upload token.
|
||||
adk-rust/crates/detmir-portal/src/main.rs:1756:fn bearer_token(request: &Request) -> Option<String> {
|
||||
@@ -167,7 +167,7 @@ logic и `CHANGE_ME`/`replace-me`. Реальные статические па
|
||||
ansible/group_vars/aw_server.yml: ansible_password берется из AW_SSH_PASSWORD
|
||||
ansible/group_vars/aw_windows.yml: ansible_password берется из AW_WINRM_PASSWORD
|
||||
ansible/group_vars/proxmox-bot.example.yml: telegram_bot_token: "CHANGE_ME"
|
||||
ansible/group_vars/pfsense-poller.example.yml: api_secret: "replace-me"
|
||||
ansible/group_vars/pfsense-poller.example.yml: api_secret: "<SET_VIA_ENV>"
|
||||
ansible/deploy_proxmox_web_gateway.yml: password генерируется через openssl rand
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
# Политика public secret scanning
|
||||
|
||||
Этот документ описывает публичную проверку репозитория на очевидные секреты.
|
||||
Проверка нужна для инженерной прозрачности и снижения риска случайной
|
||||
публикации токенов, паролей, cookies, private keys и похожих значений.
|
||||
|
||||
GitHub Actions используется как public mirror validation only. Основной
|
||||
registry release evidence должен формироваться в российском build-контуре, а
|
||||
не в GitHub Actions.
|
||||
|
||||
## Принцип проверки
|
||||
|
||||
- Scanner работает fail-closed: при подозрении на committed secret workflow
|
||||
должен завершаться ошибкой.
|
||||
- Scanner выводит только `file:line:rule` и не печатает найденное значение.
|
||||
- Реальные секреты, токены, пароли, cookies, API keys и private keys нельзя
|
||||
хранить в репозитории.
|
||||
- Runtime-секреты должны передаваться через environment variables, защищенные
|
||||
файлы вне репозитория или внешний secret storage.
|
||||
- Документационные примеры должны использовать `<SET_VIA_ENV>`, `<REDACTED>`,
|
||||
`example`, `dummy` или `redacted`.
|
||||
|
||||
## Тестовые значения
|
||||
|
||||
Для unit tests и fixtures допустимы только короткие безопасные значения:
|
||||
|
||||
- `dummy`
|
||||
- `test`
|
||||
- `example`
|
||||
- `redacted`
|
||||
- `secret`, если тест проверяет именно parsing поля и значение короткое
|
||||
|
||||
Не использовать длинные base64, hex, JWT-like или token-like строки даже в
|
||||
тестах. Такие строки выглядят как настоящий secret и должны заменяться на
|
||||
короткий dummy.
|
||||
|
||||
## Inline allow comments
|
||||
|
||||
Если строка безопасна, но scanner не может корректно определить контекст,
|
||||
разрешен точечный inline allow comment:
|
||||
|
||||
```text
|
||||
# public-secret-scan: allow dummy
|
||||
```
|
||||
|
||||
```text
|
||||
// public-secret-scan: allow dummy
|
||||
```
|
||||
|
||||
Allow comment разрешен только для dummy/test fixtures, безопасных placeholder
|
||||
values или runtime-derived значений, где секрет не хранится в репозитории.
|
||||
Нельзя использовать allow comment для реального токена, пароля, cookie, private
|
||||
key или customer evidence.
|
||||
|
||||
## Локальный запуск
|
||||
|
||||
```bash
|
||||
python3 scripts/public_secret_pattern_check.py
|
||||
```
|
||||
|
||||
Ожидаемый успешный результат:
|
||||
|
||||
```text
|
||||
secret_pattern_check=ok
|
||||
```
|
||||
|
||||
## Что делать при срабатывании
|
||||
|
||||
1. Проверить строку вручную.
|
||||
2. Если значение настоящее, удалить его из истории рабочего изменения и
|
||||
заменить на env/config reference.
|
||||
3. Если значение тестовое, заменить на короткий dummy.
|
||||
4. Если это безопасный placeholder или runtime-derived value, переписать строку
|
||||
так, чтобы она не выглядела как секрет, либо добавить точечный inline allow
|
||||
comment.
|
||||
5. Повторить локальный запуск scanner и registry readiness check.
|
||||
@@ -1,5 +1,39 @@
|
||||
# Registry readiness changelog
|
||||
|
||||
## 2026-06-21 public secret scan hardening
|
||||
|
||||
Added:
|
||||
|
||||
- `scripts/public_secret_pattern_check.py` as a reproducible local equivalent
|
||||
of the public GitHub Actions secret-pattern check.
|
||||
- `docs/SECURITY_SCANNING_POLICY_RU.md` describing fail-closed public secret
|
||||
scanning, dummy values and inline allow comments.
|
||||
- README link to the public secret scanning policy.
|
||||
- Registry readiness check integration for the local public secret scanner.
|
||||
|
||||
Changed:
|
||||
|
||||
- Security workflow now calls `python3 scripts/public_secret_pattern_check.py`
|
||||
instead of inline Python.
|
||||
- Secret scan output remains redacted and reports only `file:line:rule`.
|
||||
- Cargo deny workflow command now runs from the Rust workspace and checks
|
||||
advisories, licenses and sources with the repository `deny.toml`.
|
||||
- `CDLA-Permissive-2.0` is explicitly allowed for `webpki-roots`; final
|
||||
registry submission still requires legal review.
|
||||
|
||||
Runtime impact:
|
||||
|
||||
- No runtime/product code changes.
|
||||
- No API changes.
|
||||
- No UI changes.
|
||||
- No deployment behavior changes.
|
||||
|
||||
Reason:
|
||||
|
||||
- First public security workflow exposed false positives on runtime-derived
|
||||
values and safe config lookups. The scanner was hardened without disabling
|
||||
the check and without broad directory allowlists.
|
||||
|
||||
## 2026-06-21 status freeze
|
||||
|
||||
Added:
|
||||
|
||||
Reference in New Issue
Block a user