feat(security): security.txt отдаётся, npm audit и SBOM в AppSec

- /.well-known/security.txt уходил в SPA-заглушку (200 text/html): добавлена
  копия в web/public и явный тип text/plain в статике (RFC 9116, AGENT.md 11.3);
- make security дополнен `npm audit --omit=dev --audit-level=high`;
- новая цель `make sbom` — CycloneDX-отчёт зависимостей (trivy, если есть).
This commit is contained in:
2026-09-22 20:39:44 +03:00
parent 7ec9dbfdee
commit c7446a5d4c
4 changed files with 28 additions and 1 deletions
+3
View File
@@ -4,3 +4,6 @@ Expires: 2027-12-31T00:00:00.000Z
Preferred-Languages: ru, en
Canonical: https://gl.mhspx.su/.well-known/security.txt
Policy: https://gl.mhspx.su/security
# Этот файл отдаётся по адресу /.well-known/security.txt: копия для сборки
# лежит в web/public/.well-known/security.txt и должна совпадать с этой.
+12 -1
View File
@@ -142,18 +142,29 @@ generate: tools ## Проверить сгенерированные артеф
else echo "==> sqlc: запросов пока нет, пропускаем"; fi
.PHONY: security
security: tools ## AppSec: govulncheck, gitleaks, trivy (по возможности)
security: tools ## AppSec: govulncheck, gitleaks, npm audit, trivy (по возможности)
@mkdir -p $(BUILD_DIR)
@echo "==> govulncheck"
@govulncheck ./cmd/... ./internal/... || { echo "govulncheck нашёл уязвимости"; exit 1; }
@echo "==> gitleaks"
@$(ROOT)/scripts/gitleaks-scan.sh
@echo "==> npm audit (web, только production-зависимости)"
@cd $(WEB_DIR) && npm audit --omit=dev --audit-level=high || { echo "npm audit нашёл уязвимости"; exit 1; }
@echo "==> trivy filesystem scan"
@if command -v trivy >/dev/null 2>&1; then \
trivy fs --quiet --scanners vuln,secret,misconfig --exit-code 1 \
--skip-dirs .cache --skip-dirs .git --skip-dirs web/node_modules .; \
else echo "trivy not installed — skipped"; fi
.PHONY: sbom
sbom: ## SBOM зависимостей в build/sbom.cdx.json (trivy, если установлен)
@mkdir -p $(BUILD_DIR)
@if command -v trivy >/dev/null 2>&1; then \
trivy fs --quiet --format cyclonedx --output $(BUILD_DIR)/sbom.cdx.json \
--skip-dirs .cache --skip-dirs web/node_modules . && \
echo "SBOM: $(BUILD_DIR)/sbom.cdx.json"; \
else echo "trivy не установлен — SBOM не собран (запустите на сервере сборки)"; fi
.PHONY: secrets-scan
secrets-scan: tools ## Только проверка на утечки секретов
@$(ROOT)/scripts/gitleaks-scan.sh
+4
View File
@@ -63,6 +63,10 @@ func staticContentType(rel string) string {
return "text/css; charset=utf-8"
case ".svg":
return "image/svg+xml"
case ".txt":
// security.txt (RFC 9116): в минимальном alpine-окружении mime может
// не знать расширение и отдать октет-поток.
return "text/plain; charset=utf-8"
}
return mime.TypeByExtension(filepath.Ext(rel))
}
+9
View File
@@ -0,0 +1,9 @@
# Политика безопасности glchat (RFC 9116)
Contact: mailto:security@gl.mhspx.su
Expires: 2027-12-31T00:00:00.000Z
Preferred-Languages: ru, en
Canonical: https://gl.mhspx.su/.well-known/security.txt
Policy: https://gl.mhspx.su/security
# Этот файл отдаётся по адресу /.well-known/security.txt: копия для сборки
# лежит в web/public/.well-known/security.txt и должна совпадать с этой.