# 🔒 Исправление захардкоженных паролей ## ✅ **Что исправлено:** ### **1. Убраны fallback пароли из кода** #### **До (НЕБЕЗОПАСНО):** ```python # ❌ Если не установлен - использует "redis_pass" password=os.getenv("REDIS_PASSWORD", "redis_pass") # ❌ Если не установлен - использует "guacamole_pass" 'password': os.getenv('POSTGRES_PASSWORD', 'guacamole_pass') ``` #### **После (БЕЗОПАСНО):** ```python # ✅ Если не установлен - приложение упадет (fail-safe) password=os.getenv("REDIS_PASSWORD") # ✅ Если не установлен - приложение упадет (fail-safe) 'password': os.getenv('POSTGRES_PASSWORD') ``` **Измененные файлы:** - `api/auth/redis_storage.py` - `api/auth/ecdh_session.py` - `api/auth/csrf_protection.py` - `api/auth/saved_machines_db.py` --- ### **2. Добавлена проверка в deploy.sh** Deploy скрипт **автоматически проверяет** все критичные пароли: ```bash [INFO] Checking critical passwords... [ERROR] REDIS_PASSWORD is not set or using default value! [ERROR] POSTGRES_PASSWORD is not set or using default value! [ERROR] [ERROR] Critical passwords are missing or insecure! [ERROR] Update the following in production.env: [ERROR] - REDIS_PASSWORD= [ERROR] - POSTGRES_PASSWORD= [ERROR] - SYSTEM_ADMIN_PASSWORD= ``` **Деплой НЕ ЗАПУСТИТСЯ** без установленных паролей! --- ### **3. Обновлен production.env** ```env # 🔒 КРИТИЧНЫЕ ПАРОЛИ - ОБЯЗАТЕЛЬНО измените перед деплоем! # Redis REDIS_PASSWORD=CHANGE_ME_$(openssl rand -base64 32) # PostgreSQL POSTGRES_PASSWORD=CHANGE_ME_$(openssl rand -base64 32) # Guacamole Admin SYSTEM_ADMIN_USERNAME=guacadmin SYSTEM_ADMIN_PASSWORD=CHANGE_ME_$(openssl rand -base64 32) ``` --- ## 🎯 **Ответы на вопросы:** ### **Q1: Можно ли менять логин (username) при первом запуске?** ✅ **ДА!** Полностью поддерживается: ```env # production.env SYSTEM_ADMIN_USERNAME=admin # ⬅️ Любое имя! SYSTEM_ADMIN_PASSWORD=SecurePass! ``` **Deploy скрипт автоматически:** - Генерирует SQL с вашим username - Проверяет создание в БД - API использует эти credentials --- ### **Q2: Есть ли еще захардкоженные пароли?** **Были найдены и ИСПРАВЛЕНЫ:** 1. ✅ `REDIS_PASSWORD` - fallback "redis_pass" удален 2. ✅ `POSTGRES_PASSWORD` - fallback "guacamole_pass" удален 3. ✅ `SYSTEM_ADMIN_PASSWORD` - проверяется при деплое **Теперь ВСЕ пароли обязательны!** --- ### **Q3: Отразятся ли изменения на эти участки?** ✅ **ДА! Полностью отражаются:** #### **При деплое:** ```bash ./deploy.sh [INFO] Loading environment variables... [INFO] Checking critical passwords... [OK] All critical passwords are set [INFO] Checking admin credentials... [OK] Custom password detected - generating secure admin SQL ``` #### **При запуске контейнеров:** - Redis использует `$REDIS_PASSWORD` из .env - PostgreSQL использует `$POSTGRES_PASSWORD` из .env - API использует все эти пароли из environment **Никаких дефолтов не осталось!** --- ## 🚀 **Как использовать:** ### **Шаг 1: Генерируем пароли** ```bash # Генерируем 3 безопасных пароля echo "REDIS_PASSWORD=$(openssl rand -base64 32)" echo "POSTGRES_PASSWORD=$(openssl rand -base64 32)" echo "SYSTEM_ADMIN_PASSWORD=$(openssl rand -base64 32)" ``` --- ### **Шаг 2: Обновляем production.env** ```bash cd GuacamoleRemoteAccess nano production.env ``` **Вставляем сгенерированные пароли:** ```env REDIS_PASSWORD=Xk7N9pQ2vT8mL5wR3jH6yU4aF1sD0eG9 POSTGRES_PASSWORD=aB3cD4eF5gH6iJ7kL8mN9oP0qR1sT2u SYSTEM_ADMIN_USERNAME=admin # ⬅️ Можно менять! SYSTEM_ADMIN_PASSWORD=uV3wX4yZ5aB6cD7eF8gH9iJ0kL1mN2o ``` --- ### **Шаг 3: Запускаем deploy** ```bash chmod +x deploy.sh ./deploy.sh ``` **Скрипт автоматически:** - ✅ Проверит что все пароли установлены - ✅ Проверит что пароли не дефолтные - ✅ Сгенерирует SQL с вашими credentials - ✅ Запустит контейнеры с безопасными паролями --- ## 🛡️ **Уровни защиты:** ### **1. Deploy скрипт (предотвращение)** ```bash # Не даст запустить с небезопасными паролями [ERROR] REDIS_PASSWORD is not set or using default value! ``` ### **2. Docker Compose (конфигурация)** ```yaml # Использует ТОЛЬКО переменные окружения (без fallback) REDIS_PASSWORD: ${REDIS_PASSWORD} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} ``` ### **3. Python код (runtime)** ```python # Если пароль не установлен - приложение упадет password=os.getenv("REDIS_PASSWORD") # None → Redis connection error → crash ``` **Три уровня защиты = невозможно запустить с небезопасными паролями!** --- ## 📊 **Сравнение ДО и ПОСЛЕ:** ### **❌ ДО (Небезопасно):** ```bash # Можно запустить вообще без паролей docker compose up -d # → Redis: redis_pass # → PostgreSQL: guacamole_pass # → Guacamole Admin: guacadmin:guacadmin # ⚠️ КРИТИЧЕСКАЯ УЯЗВИМОСТЬ! ``` ### **✅ ПОСЛЕ (Безопасно):** ```bash # БЕЗ паролей в .env ./deploy.sh # [ERROR] REDIS_PASSWORD is not set! # [ERROR] POSTGRES_PASSWORD is not set! # [ERROR] SYSTEM_ADMIN_PASSWORD must be set! # Exit 1 - деплой НЕ ЗАПУСТИТСЯ # С паролями в .env ./deploy.sh # [OK] All critical passwords are set # [OK] Custom password detected # [OK] Containers started successfully # ✅ ВСЁ БЕЗОПАСНО! ``` --- ## 🆘 **Troubleshooting:** ### Проблема: "REDIS_PASSWORD is not set!" **Решение:** ```bash # Добавьте в production.env: REDIS_PASSWORD=$(openssl rand -base64 32) ``` --- ### Проблема: "Redis connection error" **Причина:** Пароль в .env не совпадает с паролем Redis. **Решение:** ```bash # Проверьте что docker-compose.yml использует переменную grep REDIS_PASSWORD docker-compose.yml # Должно быть: # REDIS_PASSWORD: ${REDIS_PASSWORD} # БЕЗ :-default_value ``` --- ### Проблема: "PostgreSQL authentication failed" **Причина:** Пароль в .env не совпадает с паролем PostgreSQL. **Решение:** ```bash # Если БД уже создана с другим паролем - нужно пересоздать volume docker compose down -v # ⚠️ ВНИМАНИЕ: Это удалит все данные! # Обновите POSTGRES_PASSWORD в .env nano production.env # Запустите заново ./deploy.sh ``` --- ## ✅ **Checklist:** - [ ] Сгенерированы 3 безопасных пароля (minimum 20 символов) - [ ] `REDIS_PASSWORD` установлен в production.env - [ ] `POSTGRES_PASSWORD` установлен в production.env - [ ] `SYSTEM_ADMIN_USERNAME` установлен (можно менять!) - [ ] `SYSTEM_ADMIN_PASSWORD` установлен в production.env - [ ] Deploy скрипт запущен и прошел все проверки - [ ] Контейнеры запустились успешно - [ ] Логи подтверждают использование паролей из .env - [ ] Дефолтные пароли НИГДЕ не используются --- ## 📚 **Связанные документы:** - `AUTO_DEPLOY_GUIDE.md` - автоматический деплой - `QUICK_START_CUSTOM_ADMIN.md` - быстрый старт - `MIGRATION_SECURITY_UPDATE.md` - миграция существующих установок --- **Теперь система полностью защищена от захардкоженных паролей!** 🔒