diff --git a/.gitignore b/.gitignore index c0b526d..c8418c3 100644 --- a/.gitignore +++ b/.gitignore @@ -63,12 +63,18 @@ Thumbs.db # ============================================================================= # SSL СЕРТИФИКАТЫ # ============================================================================= +# Kafka SSL сертификаты kafka-ssl/*.jks kafka-ssl/ca-* kafka-ssl/*.pem kafka-ssl/*.key kafka-ssl/*.crt +# PostgreSQL SSL сертификаты +postgres-ssl/*.crt +postgres-ssl/*.key +postgres-ssl/*.pem + # ============================================================================= # ПРОЧИЕ # ============================================================================= diff --git a/Makefile b/Makefile index 23a3274..99888d4 100644 --- a/Makefile +++ b/Makefile @@ -160,22 +160,43 @@ restore: ## Восстановить данные из резервной коп # SSL СЕРТИФИКАТЫ # ============================================================================= -ssl-generate: ## Генерация SSL сертификатов для Kafka +ssl-generate: ## Генерация SSL сертификатов для Kafka и PostgreSQL @echo "🔐 Генерация SSL сертификатов для Kafka..." @mkdir -p ./kafka-ssl @docker run --rm -v $$PWD:/workspace -w /workspace openjdk:11-jre-slim bash -c "apt-get update && apt-get install -y openssl && chmod +x /workspace/kafka-ssl/generate-ssl.sh && /workspace/kafka-ssl/generate-ssl.sh" - @echo "✅ SSL сертификаты созданы в ./kafka-ssl/" + @echo "✅ SSL сертификаты Kafka созданы в ./kafka-ssl/" + @echo "🔐 Генерация SSL сертификатов для PostgreSQL..." + @mkdir -p ./postgres-ssl + @chmod +x ./postgres-ssl/generate-ssl.sh + @./postgres-ssl/generate-ssl.sh + @echo "✅ SSL сертификаты PostgreSQL созданы в ./postgres-ssl/" ssl-clean: ## Очистка SSL сертификатов @echo "🧹 Очистка SSL сертификатов..." @rm -rf ./kafka-ssl/*.jks ./kafka-ssl/ca-* 2>/dev/null || true + @rm -rf ./postgres-ssl/*.crt ./postgres-ssl/*.key 2>/dev/null || true @echo "✅ SSL сертификаты очищены" ssl-info: ## Информация о SSL сертификатах @echo "📋 Информация о SSL сертификатах:" + @echo "" + @echo "🔐 Kafka SSL сертификаты:" @if [ -f "./kafka-ssl/kafka.server.keystore.jks" ]; then \ echo "✅ Серверный keystore найден"; \ docker run --rm -v $$PWD:/workspace -w /workspace openjdk:11-jre-slim keytool -list -keystore /workspace/kafka-ssl/kafka.server.keystore.jks -storepass kafka123 -v | head -20; \ else \ - echo "❌ SSL сертификаты не найдены. Выполните: make ssl-generate"; \ - fi \ No newline at end of file + echo "❌ Kafka SSL сертификаты не найдены"; \ + fi + @echo "" + @echo "🔐 PostgreSQL SSL сертификаты:" + @if [ -f "./postgres-ssl/server.crt" ]; then \ + echo "✅ PostgreSQL сертификаты найдены:"; \ + ls -la ./postgres-ssl/; \ + echo ""; \ + echo "📋 Информация о сертификате сервера:"; \ + openssl x509 -in ./postgres-ssl/server.crt -text -noout | grep -E "(Subject:|Issuer:|Not Before|Not After)"; \ + else \ + echo "❌ PostgreSQL SSL сертификаты не найдены"; \ + fi + @echo "" + @echo "💡 Для генерации сертификатов выполните: make ssl-generate" \ No newline at end of file diff --git a/QUICKSTART.md b/QUICKSTART.md index 2f123bf..a9ea608 100644 --- a/QUICKSTART.md +++ b/QUICKSTART.md @@ -39,7 +39,7 @@ make logs ## 🌐 Веб-интерфейсы - **Kafka UI:** http://localhost:8080 (логин: admin, пароль: admin) -- **PostgreSQL:** localhost:5432 +- **PostgreSQL:** localhost:5432 (SSL: require) - **ClickHouse:** localhost:8123 (реплика 1), localhost:8124 (реплика 2) - **ClickHouse LB:** localhost:8125 (HTTP), localhost:9002 (TCP) diff --git a/README.md b/README.md index 9f858f9..a540c6c 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,10 @@ make logs # Логи всех сервисов - `POSTGRES_USER` — пользователь (по умолчанию sensus) - `POSTGRES_PASSWORD` — пароль (обязательно изменить!) - `POSTGRES_PORT` — порт (по умолчанию 5432) +- `POSTGRES_SSL_MODE` — режим SSL (по умолчанию require) +- `POSTGRES_SSL_CERT_FILE` — путь к сертификату сервера +- `POSTGRES_SSL_KEY_FILE` — путь к приватному ключу сервера +- `POSTGRES_SSL_CA_FILE` — путь к сертификату CA #### ClickHouse - `CLICKHOUSE_DB` — имя базы данных (по умолчанию sensus_metrics) @@ -246,12 +250,20 @@ make restore BACKUP_FILE=postgres_20241201_120000.sql ## Безопасность ### SSL/TLS -Инфраструктура поддерживает SSL/TLS для Kafka: +Инфраструктура поддерживает SSL/TLS для Kafka и PostgreSQL: + +#### Kafka SSL - **Автоматическая генерация** SSL сертификатов при `make setup` - **Поддержка SSL** на порту 9093 - **Клиентские сертификаты** для аутентификации - **Truststore** для проверки сертификатов +#### PostgreSQL SSL +- **Автоматическая генерация** SSL сертификатов при `make setup` +- **Режим SSL** — require (обязательное шифрование) +- **Самоподписанные сертификаты** для разработки +- **Поддержка SSL** на стандартном порту 5432 + ### Рекомендации 1. **Обязательно измените пароли** в файле `.env` 2. **Не коммитьте файл `.env`** в git diff --git a/docker-compose.yml b/docker-compose.yml index 8ce4b1b..4722d73 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -107,9 +107,15 @@ services: POSTGRES_USER: ${POSTGRES_USER:-sensus} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_INITDB_ARGS: ${POSTGRES_INITDB_ARGS:---encoding=UTF-8 --lc-collate=C --lc-ctype=C} + # SSL настройки PostgreSQL + POSTGRES_SSL_MODE: ${POSTGRES_SSL_MODE:-require} + POSTGRES_SSL_CERT_FILE: ${POSTGRES_SSL_CERT_FILE:-/var/lib/postgresql/ssl/server.crt} + POSTGRES_SSL_KEY_FILE: ${POSTGRES_SSL_KEY_FILE:-/var/lib/postgresql/ssl/server.key} + POSTGRES_SSL_CA_FILE: ${POSTGRES_SSL_CA_FILE:-/var/lib/postgresql/ssl/ca.crt} volumes: - postgres-data:/var/lib/postgresql/data - ./init-scripts:/docker-entrypoint-initdb.d:ro + - ./postgres-ssl:/var/lib/postgresql/ssl:ro ports: - "${POSTGRES_PORT:-5432}:5432" networks: @@ -211,8 +217,16 @@ services: LOG_LEVEL: ${AGENT_LOG_LEVEL:-info} KAFKA_BROKERS: kafka:29092 KAFKA_TOPIC: ${KAFKA_TOPIC:-sensus.metrics} + # SSL настройки для Kafka + KAFKA_SSL_ENABLED: ${KAFKA_SSL_ENABLED:-false} + KAFKA_SSL_KEYSTORE_PASSWORD: ${KAFKA_SSL_KEYSTORE_PASSWORD:-kafka123} + KAFKA_SSL_KEY_PASSWORD: ${KAFKA_SSL_KEY_PASSWORD:-kafka123} + KAFKA_SSL_TRUSTSTORE_PASSWORD: ${KAFKA_SSL_TRUSTSTORE_PASSWORD:-kafka123} + KAFKA_SSL_CLIENT_AUTH: ${KAFKA_SSL_CLIENT_AUTH:-none} + KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: ${KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM:-https} volumes: - ../SensusAgent/bin/agent:/bin/agent:ro + - ./kafka-ssl:/var/ssl/private:ro networks: - sensus-network restart: unless-stopped diff --git a/env.example b/env.example index f3c3620..10e8eaa 100644 --- a/env.example +++ b/env.example @@ -51,6 +51,9 @@ KAFKA_SSL_TRUSTSTORE_PASSWORD=kafka123 KAFKA_SSL_CLIENT_AUTH=none KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM=https +# Kafka SSL для клиентов (SensusAgent, SensusWorker) +KAFKA_SSL_ENABLED=false + # ============================================================================= # POSTGRESQL КОНФИГУРАЦИЯ # ============================================================================= @@ -58,6 +61,12 @@ POSTGRES_DB=sensus POSTGRES_USER=sensus POSTGRES_PASSWORD=sensus_secure_password_2024 POSTGRES_PORT=5432 + +# PostgreSQL SSL +POSTGRES_SSL_MODE=require +POSTGRES_SSL_CERT_FILE=/var/lib/postgresql/ssl/server.crt +POSTGRES_SSL_KEY_FILE=/var/lib/postgresql/ssl/server.key +POSTGRES_SSL_CA_FILE=/var/lib/postgresql/ssl/ca.crt POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C # ============================================================================= diff --git a/kafka-ssl/generate-ssl.sh b/kafka-ssl/generate-ssl.sh old mode 100644 new mode 100755 diff --git a/postgres-ssl/ca.srl b/postgres-ssl/ca.srl new file mode 100644 index 0000000..c556d8c --- /dev/null +++ b/postgres-ssl/ca.srl @@ -0,0 +1 @@ +061A48EC483BA1607C89D669681A1BBD2B491BEC diff --git a/postgres-ssl/generate-ssl.sh b/postgres-ssl/generate-ssl.sh new file mode 100755 index 0000000..5b967ee --- /dev/null +++ b/postgres-ssl/generate-ssl.sh @@ -0,0 +1,84 @@ +#!/bin/bash +# Генерация SSL сертификатов для PostgreSQL +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +set -e + +echo "🔐 Генерация SSL сертификатов для PostgreSQL..." + +# Создаем директорию для сертификатов +mkdir -p postgres-ssl + +# Переходим в директорию с сертификатами +cd postgres-ssl + +# Генерируем приватный ключ для CA +echo "📝 Генерация CA ключа..." +openssl genrsa -out ca.key 4096 + +# Генерируем самоподписанный сертификат CA +echo "📝 Генерация CA сертификата..." +openssl req -new -x509 -days 365 -key ca.key -out ca.crt \ + -subj "/C=RU/ST=Moscow/L=Moscow/O=Sensus/OU=IT/CN=ca.sensus.io" + +# Генерируем приватный ключ для сервера +echo "📝 Генерация серверного ключа..." +openssl genrsa -out server.key 4096 + +# Генерируем запрос на сертификат для сервера +echo "📝 Генерация запроса на сертификат сервера..." +openssl req -new -key server.key -out server.csr \ + -subj "/C=RU/ST=Moscow/L=Moscow/O=Sensus/OU=IT/CN=postgres.sensus.io" + +# Создаем конфигурационный файл для расширений +cat > server.conf << EOF +[req] +distinguished_name = req_distinguished_name +req_extensions = v3_req +prompt = no + +[req_distinguished_name] +C = RU +ST = Moscow +L = Moscow +O = Sensus +OU = IT +CN = postgres.sensus.io + +[v3_req] +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment +subjectAltName = @alt_names + +[alt_names] +DNS.1 = postgres.sensus.io +DNS.2 = localhost +DNS.3 = postgres +IP.1 = 127.0.0.1 +IP.2 = 10.99.0.90 +EOF + +# Подписываем сертификат сервера с помощью CA +echo "📝 Подписание серверного сертификата..." +openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \ + -CAcreateserial -out server.crt -days 365 \ + -extensions v3_req -extfile server.conf + +# Устанавливаем правильные права доступа +echo "🔒 Установка прав доступа..." +chmod 600 server.key ca.key +chmod 644 server.crt ca.crt + +# Удаляем временные файлы +rm -f server.csr server.conf + +echo "✅ SSL сертификаты для PostgreSQL успешно сгенерированы!" +echo "" +echo "📁 Созданные файлы:" +echo " - ca.crt (сертификат CA)" +echo " - ca.key (приватный ключ CA)" +echo " - server.crt (сертификат сервера)" +echo " - server.key (приватный ключ сервера)" +echo "" +echo "🔐 Сертификаты готовы для использования в PostgreSQL с SSL режимом 'require'"