feat: Add PostgreSQL SSL support with sslmode=require
- Add SSL configuration to PostgreSQL in docker-compose.yml - Create PostgreSQL SSL certificate generation script - Add PostgreSQL SSL environment variables to env.example and .env - Update Makefile with PostgreSQL SSL commands (ssl-generate, ssl-clean, ssl-info) - Update .gitignore to exclude PostgreSQL SSL certificates - Update documentation in README.md and QUICKSTART.md - Test PostgreSQL SSL certificate generation Features: - PostgreSQL SSL mode: require (mandatory encryption) - Self-signed certificates for development - Automatic certificate generation via make ssl-generate - SSL certificate management via Makefile commands Author: Сергей Антропов Site: https://devops.org.ru
This commit is contained in:
parent
a3a5fb9953
commit
4db3e01513
6
.gitignore
vendored
6
.gitignore
vendored
@ -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
|
||||
|
||||
# =============================================================================
|
||||
# ПРОЧИЕ
|
||||
# =============================================================================
|
||||
|
27
Makefile
27
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"; \
|
||||
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"
|
@ -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)
|
||||
|
||||
|
14
README.md
14
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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
# =============================================================================
|
||||
|
0
kafka-ssl/generate-ssl.sh
Normal file → Executable file
0
kafka-ssl/generate-ssl.sh
Normal file → Executable file
1
postgres-ssl/ca.srl
Normal file
1
postgres-ssl/ca.srl
Normal file
@ -0,0 +1 @@
|
||||
061A48EC483BA1607C89D669681A1BBD2B491BEC
|
84
postgres-ssl/generate-ssl.sh
Executable file
84
postgres-ssl/generate-ssl.sh
Executable file
@ -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'"
|
Loading…
x
Reference in New Issue
Block a user