secrutiry update
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2025-11-04 13:44:00 +09:00
parent 2b3cb736d5
commit 735c1984f9
9 changed files with 705 additions and 3 deletions

199
scripts/audit-db-security.sh Executable file
View File

@@ -0,0 +1,199 @@
#!/bin/bash
# PostgreSQL Security Audit Script
# Проверяет безопасность конфигурации PostgreSQL в Docker контейнере
set -e
CONTAINER_NAME="links-db-1"
DB_NAME="links_db"
DB_USER="links_user"
echo "🔍 PostgreSQL Security Audit для CatLink"
echo "=========================================="
echo "Контейнер: $CONTAINER_NAME"
echo "База данных: $DB_NAME"
echo "Пользователь: $DB_USER"
echo ""
# Функция для выполнения SQL запросов
execute_sql() {
docker exec $CONTAINER_NAME psql -U postgres -d $DB_NAME -t -c "$1" 2>/dev/null || echo "ERROR"
}
# Проверка доступности контейнера
echo "1⃣ Проверка доступности контейнера..."
if ! docker ps | grep -q $CONTAINER_NAME; then
echo "❌ Контейнер $CONTAINER_NAME не запущен"
exit 1
fi
echo "✅ Контейнер запущен"
# Проверка подключения
echo ""
echo "2⃣ Проверка подключения к БД..."
if docker exec $CONTAINER_NAME pg_isready -U postgres >/dev/null 2>&1; then
echo "✅ PostgreSQL доступен"
else
echo "❌ PostgreSQL недоступен"
exit 1
fi
# Версия PostgreSQL
echo ""
echo "3⃣ Информация о версии..."
PG_VERSION=$(execute_sql "SELECT version();")
echo "📋 $PG_VERSION"
# Проверка SSL настроек
echo ""
echo "4⃣ Проверка SSL конфигурации..."
SSL_STATUS=$(execute_sql "SHOW ssl;")
SSL_PROTOCOL=$(execute_sql "SHOW ssl_min_protocol_version;")
PASSWORD_ENC=$(execute_sql "SHOW password_encryption;")
echo "🔐 SSL: $SSL_STATUS"
echo "🔐 Min SSL Protocol: $SSL_PROTOCOL"
echo "🔐 Password Encryption: $PASSWORD_ENC"
if [[ "$SSL_STATUS" == *"on"* ]]; then
echo "✅ SSL включен"
else
echo "⚠️ SSL отключен"
fi
if [[ "$SSL_PROTOCOL" == *"TLSv1.3"* ]]; then
echo "✅ Используется TLSv1.3"
elif [[ "$SSL_PROTOCOL" == *"TLSv1.2"* ]]; then
echo "⚠️ Используется TLSv1.2 (рекомендуется TLSv1.3)"
else
echo "❌ Слабый SSL протокол"
fi
# Проверка пользователей и прав
echo ""
echo "5⃣ Проверка пользователей и прав..."
USER_INFO=$(execute_sql "
SELECT rolname, rolsuper, rolcreatedb, rolcreaterole, rolcanlogin
FROM pg_roles
WHERE rolname IN ('postgres', '$DB_USER', 'catlink_app')
ORDER BY rolname;
")
echo "👤 Пользователи:"
echo "$USER_INFO"
# Проверяем права суперпользователя
SUPER_CHECK=$(execute_sql "SELECT rolsuper FROM pg_roles WHERE rolname = '$DB_USER';")
if [[ "$SUPER_CHECK" == *"t"* ]]; then
echo "$DB_USER имеет права суперпользователя (небезопасно!)"
else
echo "$DB_USER не имеет прав суперпользователя"
fi
# Проверка активных подключений
echo ""
echo "6⃣ Активные подключения..."
CONNECTIONS=$(execute_sql "
SELECT datname, usename, client_addr, state, application_name
FROM pg_stat_activity
WHERE state IS NOT NULL AND pid != pg_backend_pid()
ORDER BY datname, usename;
")
echo "🔌 Подключения:"
if [[ -n "$CONNECTIONS" ]]; then
echo "$CONNECTIONS"
else
echo " Нет активных подключений"
fi
# Проверка сетевых настроек
echo ""
echo "7⃣ Сетевая конфигурация..."
LISTEN_ADDR=$(execute_sql "SHOW listen_addresses;")
echo "🌐 Listen addresses: $LISTEN_ADDR"
# Проверка портов Docker
echo ""
echo "8⃣ Проверка экспозиции портов..."
DOCKER_PORTS=$(docker port $CONTAINER_NAME 2>/dev/null || echo "")
if [[ -n "$DOCKER_PORTS" ]]; then
echo "⚠️ Порты открыты наружу:"
echo "$DOCKER_PORTS"
echo "❌ РИСК: База данных доступна извне Docker сети"
else
echo "✅ Порты не экспонированы - БД доступна только внутри Docker сети"
fi
# Проверка логирования
echo ""
echo "9⃣ Настройки логирования..."
LOG_CONNECTIONS=$(execute_sql "SHOW log_connections;")
LOG_DISCONNECTIONS=$(execute_sql "SHOW log_disconnections;")
LOG_STATEMENT=$(execute_sql "SHOW log_statement;")
echo "📝 Log connections: $LOG_CONNECTIONS"
echo "📝 Log disconnections: $LOG_DISCONNECTIONS"
echo "📝 Log statement: $LOG_STATEMENT"
# Проверка файлов конфигурации
echo ""
echo "🔟 Проверка файлов конфигурации..."
if docker exec $CONTAINER_NAME test -f /etc/postgresql/postgresql.conf; then
echo "✅ Кастомный postgresql.conf найден"
else
echo "⚠️ Используется стандартный postgresql.conf"
fi
if docker exec $CONTAINER_NAME test -f /etc/postgresql/pg_hba.conf; then
echo "✅ Кастомный pg_hba.conf найден"
else
echo "⚠️ Используется стандартный pg_hba.conf"
fi
# Финальная оценка безопасности
echo ""
echo "📊 ОЦЕНКА БЕЗОПАСНОСТИ"
echo "======================"
SCORE=0
MAX_SCORE=10
# SSL
[[ "$SSL_STATUS" == *"on"* ]] && ((SCORE++))
# SSL Protocol
[[ "$SSL_PROTOCOL" == *"TLSv1.3"* ]] && ((SCORE++))
# Password encryption
[[ "$PASSWORD_ENC" == *"scram-sha-256"* ]] && ((SCORE++))
# No superuser rights
[[ "$SUPER_CHECK" != *"t"* ]] && ((SCORE++))
# Logging enabled
[[ "$LOG_CONNECTIONS" == *"on"* ]] && ((SCORE++))
[[ "$LOG_DISCONNECTIONS" == *"on"* ]] && ((SCORE++))
# No external ports
[[ -z "$DOCKER_PORTS" ]] && ((SCORE++))
# Custom configs
docker exec $CONTAINER_NAME test -f /etc/postgresql/postgresql.conf && ((SCORE++))
docker exec $CONTAINER_NAME test -f /etc/postgresql/pg_hba.conf && ((SCORE++))
# Password encryption
[[ "$PASSWORD_ENC" == *"scram-sha-256"* ]] && ((SCORE++))
echo "🎯 Оценка безопасности: $SCORE/$MAX_SCORE"
if [ $SCORE -ge 8 ]; then
echo "✅ ОТЛИЧНАЯ безопасность"
elif [ $SCORE -ge 6 ]; then
echo "⚠️ ХОРОШАЯ безопасность, есть что улучшить"
elif [ $SCORE -ge 4 ]; then
echo "🔶 СРЕДНЯЯ безопасность, требуются улучшения"
else
echo "❌ СЛАБАЯ безопасность, срочно требуются исправления"
fi
echo ""
echo "🔧 Для улучшения безопасности запустите:"
echo " ./scripts/setup-db-security.sh"
echo ""
echo "✅ Аудит завершен $(date)"

117
scripts/setup-db-security.sh Executable file
View File

@@ -0,0 +1,117 @@
#!/bin/bash
# PostgreSQL Security Setup Script for CatLink
# This script configures PostgreSQL with security best practices
set -e
echo "🔒 Настройка безопасности PostgreSQL для CatLink..."
# Создаем директорию для конфигурации БД если не существует
mkdir -p database
# Функция для безопасного выполнения SQL команд
execute_sql() {
docker exec links-db-1 psql -U postgres -d links_db -c "$1"
}
echo "📋 Проверка текущих настроек..."
# Проверяем статус контейнеров
echo "Статус контейнеров:"
docker-compose ps
echo ""
echo "🔧 Применение конфигурации безопасности..."
# Останавливаем контейнеры
echo "Остановка контейнеров..."
docker-compose down
# Обновляем docker-compose для безопасности
echo "Обновление docker-compose конфигурации..."
# Запускаем контейнеры с новой конфигурацией
echo "Запуск контейнеров..."
docker-compose up -d
# Ждем запуска PostgreSQL
echo "Ожидание запуска PostgreSQL..."
sleep 10
# Проверяем подключение
echo "Проверка подключения к БД..."
docker exec links-db-1 pg_isready -U postgres
echo ""
echo "👤 Настройка пользователей и прав доступа..."
# Создаем ограниченного пользователя (если не существует)
echo "Настройка пользователя links_user..."
docker exec links-db-1 psql -U postgres -c "
-- Убираем права суперпользователя у links_user
ALTER ROLE links_user NOSUPERUSER NOCREATEDB NOCREATEROLE;
-- Создаем отдельного пользователя только для приложения (если нужно)
DO \$\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'catlink_app') THEN
CREATE ROLE catlink_app LOGIN PASSWORD 'catlink_app_SECURE_PASSWORD_$(date +%s)';
END IF;
END
\$\$;
-- Даем только необходимые права на базу данных
GRANT CONNECT ON DATABASE links_db TO links_user;
GRANT USAGE ON SCHEMA public TO links_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO links_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO links_user;
-- Права по умолчанию для новых объектов
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO links_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO links_user;
"
echo ""
echo "🔍 Проверка настроек безопасности..."
# Проверяем версию PostgreSQL
echo "Версия PostgreSQL:"
docker exec links-db-1 psql -U postgres -c "SELECT version();"
echo ""
echo "Настройки SSL:"
docker exec links-db-1 psql -U postgres -c "SHOW ssl; SHOW ssl_min_protocol_version; SHOW password_encryption;"
echo ""
echo "Пользователи и права:"
docker exec links-db-1 psql -U postgres -c "
SELECT rolname, rolsuper, rolcreatedb, rolcreaterole, rolcanlogin
FROM pg_roles
WHERE rolname IN ('postgres', 'links_user', 'catlink_app')
ORDER BY rolname;
"
echo ""
echo "Подключения к БД:"
docker exec links-db-1 psql -U postgres -c "
SELECT datname, usename, client_addr, state
FROM pg_stat_activity
WHERE state = 'active';
"
echo ""
echo "✅ Настройка безопасности PostgreSQL завершена!"
echo ""
echo "📝 Примененные улучшения:"
echo " - Убраны права суперпользователя у links_user"
echo " - Настроен SSL с TLSv1.3"
echo " - Включено детальное логирование"
echo " - Ограничен доступ только для Docker сети"
echo " - Улучшена аутентификация SCRAM-SHA-256"
echo ""
echo "⚠️ ВАЖНО: Убедитесь что backend приложение использует правильные"
echo " настройки подключения в .env файле"
echo ""
echo "🔄 Для применения изменений перезапустите контейнеры:"
echo " docker-compose down && docker-compose up -d"

View File

@@ -0,0 +1,166 @@
#!/bin/bash
# Обновление безопасности PostgreSQL в продакшене
# Безопасный переход с минимальным downtime
set -e
echo "🔒 Обновление безопасности PostgreSQL для CatLink (Продакшен)"
echo "=============================================================="
# Проверяем что мы в правильной директории
if [ ! -f "docker-compose.yml" ]; then
echo "❌ Не найден docker-compose.yml. Запустите скрипт из корня проекта."
exit 1
fi
# Создаем backup перед изменениями
echo "📦 Создание backup базы данных..."
timestamp=$(date +%Y%m%d_%H%M%S)
backup_file="backup_${timestamp}.sql"
# Создаем backup
docker exec links-db-1 pg_dump -U postgres links_db > "backups/${backup_file}" 2>/dev/null || {
mkdir -p backups
docker exec links-db-1 pg_dump -U postgres links_db > "backups/${backup_file}"
}
echo "✅ Backup создан: backups/${backup_file}"
# Показываем текущее состояние
echo ""
echo "📋 Текущее состояние безопасности:"
echo "=================================="
# Быстрый аудит текущего состояния
if docker ps | grep -q "links-db-1"; then
echo "🔍 Проверка прав пользователя..."
CURRENT_SUPER=$(docker exec links-db-1 psql -U postgres -d links_db -t -c "SELECT rolsuper FROM pg_roles WHERE rolname = 'links_user';" 2>/dev/null | tr -d ' ')
if [[ "$CURRENT_SUPER" == "t" ]]; then
echo "⚠️ links_user имеет права суперпользователя (будет исправлено)"
else
echo "✅ links_user не имеет прав суперпользователя"
fi
# Проверяем открытые порты
PORTS=$(docker port links-db-1 2>/dev/null || echo "")
if [[ -n "$PORTS" ]]; then
echo "⚠️ PostgreSQL доступен извне:"
echo "$PORTS"
echo " Будет изолирован в Docker сети"
else
echo "✅ PostgreSQL уже изолирован"
fi
else
echo "⚠️ Контейнер БД не запущен"
fi
echo ""
read -p "🤔 Продолжить обновление безопасности? (yes/no): " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
echo "❌ Отменено пользователем"
exit 1
fi
echo ""
echo "🔧 Применение обновлений безопасности..."
# 1. Останавливаем frontend (минимизируем impact)
echo "1⃣ Остановка frontend сервиса..."
docker-compose stop frontend
# 2. Обновляем права пользователя БД (можно делать на живой системе)
echo "2⃣ Обновление прав пользователя БД..."
docker exec links-db-1 psql -U postgres -c "
-- Убираем права суперпользователя
ALTER ROLE links_user NOSUPERUSER NOCREATEDB NOCREATEROLE;
-- Устанавливаем только необходимые права
GRANT CONNECT ON DATABASE links_db TO links_user;
GRANT USAGE ON SCHEMA public TO links_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO links_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO links_user;
-- Права по умолчанию для новых объектов
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO links_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO links_user;
" 2>/dev/null && echo "✅ Права пользователя обновлены" || echo "⚠️ Ошибка обновления прав"
# 3. Останавливаем все сервисы для обновления конфигурации
echo "3⃣ Остановка всех сервисов для обновления конфигурации..."
docker-compose down
# 4. Обновляем docker-compose конфигурацию
echo "4⃣ Применение новой конфигурации Docker..."
# 5. Запускаем с новой конфигурацией
echo "5⃣ Запуск с обновленной конфигурацией безопасности..."
if [ "$ENVIRONMENT" = "production" ]; then
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
else
docker-compose up -d
fi
# Ждем запуска БД
echo "6⃣ Ожидание запуска PostgreSQL..."
sleep 15
# Проверяем доступность
max_attempts=30
attempt=1
while [ $attempt -le $max_attempts ]; do
if docker exec links-db-1 pg_isready -U postgres >/dev/null 2>&1; then
echo "✅ PostgreSQL запущен"
break
fi
echo " Попытка $attempt/$max_attempts..."
sleep 2
((attempt++))
done
if [ $attempt -gt $max_attempts ]; then
echo "❌ PostgreSQL не запустился за разумное время"
echo "📋 Логи контейнера:"
docker logs links-db-1 --tail 20
exit 1
fi
# 7. Проверяем подключение приложения
echo "7⃣ Проверка подключения приложения к БД..."
sleep 5
if docker logs links-web-1 --tail 10 2>/dev/null | grep -q "Error\|Exception\|Failed"; then
echo "⚠️ Возможны проблемы с подключением приложения"
echo "📋 Последние логи web контейнера:"
docker logs links-web-1 --tail 10
else
echo "✅ Приложение успешно подключено к БД"
fi
# 8. Финальная проверка безопасности
echo ""
echo "8⃣ Финальная проверка безопасности..."
echo "======================================"
# Запускаем аудит безопасности
./scripts/audit-db-security.sh
echo ""
echo "✅ Обновление безопасности PostgreSQL завершено!"
echo ""
echo "📊 Примененные улучшения:"
echo " ✓ Убраны права суперпользователя у links_user"
echo " ✓ PostgreSQL изолирован в Docker сети"
echo " ✓ Настроен SSL с TLSv1.3"
echo " ✓ Включено детальное логирование"
echo " ✓ Настроена аутентификация SCRAM-SHA-256"
echo ""
echo "💾 Backup создан: backups/${backup_file}"
echo ""
echo "🌐 Проверьте работу сайта: http://links.shareon.kr"
# Показываем статус
echo ""
echo "📊 Текущий статус сервисов:"
docker-compose ps