11 KiB
SecretText — Сервис безопасной передачи одноразовых секретов
SecretText — это self-hosted веб-приложение на Flask, предназначенное для конфиденциальной передачи одноразовых паролей, ключей шифрования и защищенных текстовых заметок. Сервис работает по принципу «прочитано — удалено», минимизируя цифровой след.
🚀 Основные возможности
- Одноразовые секреты: Ссылка на секрет автоматически уничтожается в Redis сразу после первого просмотра получателем.
- Двусторонний обмен (Запросы секретов): Возможность создать защищенную ссылку-запрос с уникальным токеном, перейдя по которой, сторонний пользователь может безопасно отправить секрет вам в личный кабинет.
- Симметричное шифрование: Все секреты шифруются «на лету» с помощью библиотеки
cryptography(алгоритм Fernet/AES) перед отправкой в оперативную память. - Встроенная защита от атак:
- Защита от перебора ссылок (Anti-Bruteforce) с прогрессивной блокировкой IP-адресов в Redis.
- Ограничение частоты запросов (Rate Limiting) для предотвращения DoS-атак и спама.
- Строгая санитизация входных данных (
bleach) и защита от CSRF-атак.
- Панель администратора: Встроенный аудит событий безопасности, просмотр системных логов, управление пользователями (активация/деактивация) и просмотр статистики.
- Мультиязычные шаблоны: Готовые двуязычные блоки (RU/EN) с кнопками автоматического копирования в один клик.
- Автономность: Проект не использует внешние CDN. Все библиотеки (Bootstrap 5, Bootstrap Icons) упакованы локально в папке
static.
🛠️ Подготовка к первому запуску
1. Системные требования
Для работы приложения необходимы:
- Python 3.10 или выше
- Redis Server (для хранения зашифрованных секретов и сессий)
- MariaDB / MySQL (для хранения учетных записей пользователей и логов безопасности)
2. Клонирование репозитория и окружение
git clone https://git.palchikov.name/PalchikovAleksandr/secrettext.git
cd secrettext
# Создание и активация виртуального окружения
python -m venv .venv
source .venv/bin/activate # Для Linux/macOS
# .venv\Scripts\activate # Для Windows
# Установка зависимостей
pip install -r requirements.txt
3. Настройка конфигурации (.env)
Создайте файл .env в корневом каталоге проекта и заполните его учетными данными:
# Flask конфигурация
FLASK_ENV=production
DEBUG=False
SECRET_KEY=укажите_случайный_длинный_хеш
ENCRYPTION_PASSWORD=укажите_стойкий_пароль_для_шифрования_секретов
SALT=укажите_случайный_соленый_хеш
# Настройки MariaDB / MySQL
DB_HOST=localhost
DB_PORT=3306
DB_USER=secretuser
DB_NAME=secrettext
DB_PASSWORD=ваш_пароль_от_базы_данных
# Настройки Redis
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=пароль_redis_если_есть
# Безопасность админки
ADMIN_USERNAME=admin
ADMIN_PASSWORD=придумайте_сложный_пароль_админа
ADMIN_ALLOWED_IPS=127.0.0.1,::1
ADMIN_ALLOW_ALL=False
⚠️ Внимание: Обязательно добавьте .env в ваш .gitignore, чтобы случайно не опубликовать пароли в репозитории.
🏁 Запуск приложения
Шаг 1. Инициализация базы данных
Перед самым первым запуском раскомментируйте блок инициализации в main.py (примерно 121-123 строки):
with app.app_context():
database.init_db()
create_admin()
Запустите приложение один раз, чтобы создались таблицы в MariaDB и сгенерировалась учетная запись администратора, указанная в .env. После успешного создания закомментируйте этот блок обратно, чтобы сервер не выполнял избыточные проверки при каждом перезапуске.
Или ещё проще, запустить Python в интерактивном режиме и выполнить инициализацию вручную, чтобы точно не забыть закомментировать код.
Сразу после установки сменить пароль администратора через интерфейс, даже если он задан в .env. Это защитит от случайной утечки, если файл с настройками попадёт в чужие руки.
Шаг 2. Запуск в режиме разработки
python main.py
Приложение станет доступно по адресу http://localhost:5000.
🔒 Рекомендации по настройке в продакшене (Production)
Запуск напрямую через python main.py предназначен только для разработки. При развертывании в реальной сети строго следуйте правилам ниже:
1. Использование боевого WSGI-сервера
Для стабильной и многопоточной работы Flask-приложения в продакшене рекомендуется использовать чистый Python WSGI-сервер, например Waitress. Это исключает проблемы с потоками встроенного сервера разработки:
# Установка сервера
pip install waitress
# Запуск приложения через WSGI-интерфейс
waitress-serve --host=127.0.0.1 --port=5000 main:app
2. При использование HTTPS (Apache)
Поскольку сервис обрабатывает пароли, передача данных по незащищенному протоколу HTTP категорически запрещена. Настройте Apache в качестве Reverse Proxy (используя модули mod_proxy и mod_proxy_http) и установите SSL-сертификат (например, бесплатный от Let's Encrypt через certbot).
Пример конфигурации виртуального хоста (VirtualHost) в Apache:
<VirtualHost *:443>
ServerName yourdomain.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
# Запрет доступа к скрытым файлам и папкам в корне (включая .env)
<FilesMatch "^\.">
Require all denied
</FilesMatch>
# Настройка Reverse Proxy на локальный боевой WSGI-сервер (Waitress)
ProxyRequests Off
ProxyPreserveHost On
# Проксирование всех запросов на приложение, запущенное на порту 5000
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
# Дополнительные заголовки безопасности для прокси
ProxySetHeader X-Forwarded-Proto https
ProxySetHeader X-Forwarded-Host %{HTTP_HOST}s
ProxySetHeader X-Real-IP %{REMOTE_ADDR}s
# Логирование
ErrorLog ${APACHE_LOG_DIR}/secrettext_error.log
CustomLog ${APACHE_LOG_DIR}/secrettext_access.log combined
</VirtualHost>
3. Настройка заголовков за прокси-сервером
При работе за Nginx Proxy обязательно убедитесь, что в main.py корректно обрабатывается заголовок X-Forwarded-For. Это необходимо, чтобы встроенная система rate-limiting и блокировки брутфорса видела реальные IP-адреса злоумышленников, а не локальный адрес самого Nginx (127.0.0.1).
4. Ротация логов и очистка Redis
В файле database.py предусмотрена функция cleanup_old_data(). Рекомендуется настроить системный планировщик Cron для ежедневного вызова скрипта очистки старых логов безопасности и просроченных записей:
0 3 * * * /home/shurik/pass_toket/.venv/bin/python -c "import database; database.cleanup_old_data()"
📄 Лицензия
Этот проект является полностью свободным программным обеспечением и передан в общественное достояние. Вы можете копировать, изменять, публиковать, использовать, компилировать, продавать или распространять этот код как в исходном, так и в скомпилированном виде, в любых целях, коммерческих или некоммерческих, любыми способами.