From c7446a5d4c614477d0ee1a12c74d368aafe0a67e Mon Sep 17 00:00:00 2001 From: grendervill Date: Tue, 22 Sep 2026 20:39:44 +0300 Subject: [PATCH] =?UTF-8?q?feat(security):=20security.txt=20=D0=BE=D1=82?= =?UTF-8?q?=D0=B4=D0=B0=D1=91=D1=82=D1=81=D1=8F,=20npm=20audit=20=D0=B8=20?= =?UTF-8?q?SBOM=20=D0=B2=20AppSec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /.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, если есть). --- .well-known/security.txt | 3 +++ Makefile | 13 ++++++++++++- internal/server/static.go | 4 ++++ web/public/.well-known/security.txt | 9 +++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 web/public/.well-known/security.txt diff --git a/.well-known/security.txt b/.well-known/security.txt index 747cf42..8660ffe 100644 --- a/.well-known/security.txt +++ b/.well-known/security.txt @@ -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 и должна совпадать с этой. diff --git a/Makefile b/Makefile index 26d70d6..7896f08 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/internal/server/static.go b/internal/server/static.go index 29f6d38..4c77775 100644 --- a/internal/server/static.go +++ b/internal/server/static.go @@ -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)) } diff --git a/web/public/.well-known/security.txt b/web/public/.well-known/security.txt new file mode 100644 index 0000000..8660ffe --- /dev/null +++ b/web/public/.well-known/security.txt @@ -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 и должна совпадать с этой.