#!/usr/bin/env bash set -euo pipefail ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) K8S_DIR=${K8S_DIR:-"$ROOT_DIR/../k8s"} fail() { echo "Ошибка проверки production-секретов: $1" >&2 exit 1 } require_pattern() { local pattern="$1" local file="$2" local description="$3" grep -Eq "$pattern" "$file" || fail "$description" } forbid_pattern() { local pattern="$1" local file="$2" local description="$3" if grep -Eq "$pattern" "$file"; then fail "$description" fi } [[ -d "$K8S_DIR" ]] || fail "не найдена директория Kubernetes: $K8S_DIR" require_pattern '^app\.jwt\.secret=\$\{JWT_SECRET:\}$' \ "$ROOT_DIR/backend/src/main/resources/application.properties" \ "JWT_SECRET должен быть обязательной переменной без встроенного значения" require_pattern '^[[:space:]]*private String secret;$' \ "$ROOT_DIR/backend/src/main/java/com/magistr/app/config/auth/JwtProperties.java" \ "JwtProperties не должен содержать встроенный секрет" forbid_pattern '^[[:space:]]*kind:[[:space:]]*Secret[[:space:]]*$' \ "$K8S_DIR/config.yaml" \ "config.yaml не должен создавать Secret с отслеживаемыми значениями" for yaml in "$K8S_DIR"/*.yaml; do forbid_pattern '^[[:space:]]*stringData:[[:space:]]*$' "$yaml" \ "production-манифесты не должны содержать stringData" done require_pattern 'secretName:[[:space:]]*tenants-secret' "$K8S_DIR/backend.yaml" \ "tenant-конфигурация должна монтироваться из tenants-secret" require_pattern 'name:[[:space:]]*app-secret' "$K8S_DIR/backend.yaml" \ "backend должен получать JWT_SECRET через app-secret" require_pattern 'SPRING_PROFILES_ACTIVE:[[:space:]]*"production"' "$K8S_DIR/config.yaml" \ "Kubernetes должен явно включать production-профиль" require_pattern 'JWT_REFRESH_COOKIE_SECURE:[[:space:]]*"true"' "$K8S_DIR/config.yaml" \ "production refresh-cookie должен быть Secure" require_pattern 'name:[[:space:]]*otel-postgres-secret' "$K8S_DIR/otel-collector.yaml" \ "OTel Collector должен получать credentials из Secret" if awk ' /^[[:space:]]*password:[[:space:]]*/ && $0 !~ /\$\{env:[A-Z0-9_]+\}/ { unsafe=1 } END { exit unsafe ? 1 : 0 } ' "$K8S_DIR/otel-collector.yaml"; then : else fail "пароли OTel Collector должны задаваться только через env-ссылки" fi if grep -REq 'createInsecureClient|trustAll|X509TrustManager' \ "$ROOT_DIR/backend/src/main/java/com/magistr/app/config/tenant"; then fail "в Kubernetes-клиенте обнаружен небезопасный TLS trust manager" fi echo "Проверка production-секретов завершена успешно"