diff --git a/.gitea/workflows/security.yml b/.gitea/workflows/security.yml index 4685283..f214fa0 100644 --- a/.gitea/workflows/security.yml +++ b/.gitea/workflows/security.yml @@ -54,3 +54,19 @@ jobs: run: | semgrep --config=p/javascript --config=p/react --config=p/typescript --config=p/security-audit \ --severity=ERROR --severity=WARNING --no-error --quiet --metrics=off --timeout=120 . || true + + # ── 4. npm audit: HIGH/CRITICAL CVE в зависимостях ──────────────── + # Раньше был в Dockerfile, но там кэшировался при unchanged package-lock.json. + # Вынесен сюда — реально запускается каждый push. + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: npm audit + run: | + if [ -f package-lock.json ]; then + npm audit --audit-level=high --omit=dev || true + else + echo "No package-lock.json — skip npm audit" + fi diff --git a/.gitleaks.toml b/.gitleaks.toml new file mode 100644 index 0000000..e499afb --- /dev/null +++ b/.gitleaks.toml @@ -0,0 +1,35 @@ +# GitLeaks config для сателлитных сайтов hhivp. +# Extends default rules and adds allowlist for known false-positives. +# https://github.com/gitleaks/gitleaks#configuration + +[extend] +useDefault = true + +[allowlist] +description = "Allowlist for IndexNow public keys + legacy WP plugin code" + +# Пути, которые целиком игнорируем +paths = [ + # IndexNow validation file (32-hex .txt в корне или в public/). + # Это публичный ключ, по дизайну отдаётся всем — НЕ секрет. + '''public/[a-f0-9]{32}\.txt''', + '''^[a-f0-9]{32}\.txt$''', + + # Legacy WordPress plugin code (akismet, jetpack, wpforms-lite, wp-cache). + # Все "ключи" внутри — placeholder/template/internal параметры, + # не настоящие секреты. Импортировано из старого WP-сайта как static. + '''wp-content/.*''', + + # Минифицированные ассеты — часто содержат hash'и/токены, не секреты. + '''.*\.min\.(js|css)$''', + '''dist/.*''', + '''build/.*''', +] + +# Конкретные паттерны, которые false-positive +regexes = [ + # Наш scripts/indexnow.js: const KEY = '<32-hex>' — IndexNow public key. + '''const\s+KEY\s*=\s*['"][a-f0-9]{32}['"]''', + # Аналог для других форм объявления того же ключа. + '''KEY\s*[:=]\s*['"][a-f0-9]{32}['"]''', +] diff --git a/Dockerfile b/Dockerfile index 46f9a8f..9485cb3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,13 +3,11 @@ # ─── Stage 1: build static site (Astro SSG) ──────────────────────────────── FROM node:22-alpine AS build WORKDIR /app +SHELL ["/bin/sh", "-o", "pipefail", "-c"] COPY package.json package-lock.json ./ RUN npm ci -# Security: npm audit для HIGH/CRITICAL CVE в зависимостях (warning-only). -RUN npm audit --audit-level=high --omit=dev 2>&1 | tee /tmp/npm-audit.log || true - COPY . . RUN npm run build