74 lines
2.9 KiB
Bash
74 lines
2.9 KiB
Bash
#!/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-секретов завершена успешно"
|