Projekt Django realizuje cztery kroki:
- Rejestracja uzytkownika pod
/register/. - Logowanie pod
/login/z certyfikatem wygenerowanym przezgenerate_cert.py. - Automatyczne uruchomienie
secure_backup.pypo logowaniu tego samego uzytkownika z innego IP. Backup nie jest tworzony ponownie, jezeli aktualny dump bazy ma taki sam hash jak poprzedni. - Pobranie odszyfrowanej kopii zapasowej z panelu administracyjnego pod
/admin/download-backup/.
Interfejs rejestracji i logowania jest zbudowany w React. Django pozostaje backendem dla sesji, CSRF, walidacji i autoryzacji. Po instalacji zależności zbuduj zasoby frontendu:
cd frontend
npm install
npm run build
cd ..Wynik komendy trafia do fakeaccountapp/static/react/ i jest serwowany przez Django. Po zmianach w frontend/src/ uruchom ponownie npm run build.
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python manage.py migratePostgreSQL pozostaje domyślną bazą aplikacji. Aby skonfigurować dodatkowe połączenie
PostgreSQL, skopiuj .env.example do .env i uzupełnij zmienne POSTGRES_*.
Połączenie jest dostępne w Django pod aliasem default.
Jeżeli zdecydujesz się używać SQLite, stosuj poniższą komendę.
python manage.py migrate --database=sqliteUruchom serwer nasłuchujący na wszystkich interfejsach sieciowych:
python manage.py runserver 0.0.0.0:8000Na tym komputerze otwórz http://127.0.0.1:8000/register/. Na urządzeniu w tej samej prywatnej sieci Wi-Fi użyj adresu LAN komputera, na przykład http://192.168.1.22:8000/register/.
HTTP jest przeznaczone wyłącznie do krótkich testów w zaufanej sieci. Nie używaj go z prawdziwymi hasłami ani w sieci publicznej, ponieważ dane nie są szyfrowane.
Komenda tworzy lokalne CA oraz certyfikat serwera w formacie PEM zgodnym z OpenSSL:
python manage.py generate_certPowstaja pliki:
certs/ca.crt- lokalny certyfikat CA, ktory trzeba dodac do zaufanych certyfikatow systemu/przegladarki, zeby strona nie byla oznaczana jako podejrzana.certs/key.pem- klucz serwera.certs/cert.pem- certyfikat serwera z SAN dlalocalhost,127.0.0.1,::1oraz wykrytych adresów LAN.certs/openssl.cnf- konfiguracja SAN dla OpenSSL.
Jezeli openssl.exe jest dostepny w PATH, komenda uzyje OpenSSL CLI. Jezeli nie jest dostepny, uzyje fallbacku cryptography i wygeneruje te same pliki PEM.
Uruchomienie HTTPS:
python manage.py runhttpsAdres aplikacji:
https://127.0.0.1:8000/register/
Adres dla innych urzadzen w tej samej sieci WiFi:
https://192.168.1.22:8000/register/
runhttps domyslnie nasluchuje na 0.0.0.0:8000, czyli na localhost i prywatnych adresach sieciowych komputera. Podczas startu wypisuje adresy LAN wykryte na tej maszynie.
Po zmianie sieci WiFi albo adresu IP wygeneruj certyfikat ponownie:
python manage.py generate_cert
python manage.py runhttpsJesli automatyczne wykrywanie IP nie trafi we wlasciwy adres, podaj go recznie:
python manage.py generate_cert --ip 192.168.1.22Uwaga: ostrzezenie przegladarki zniknie dopiero po zaufaniu certs/ca.crt w systemie albo przegladarce. Sam certyfikat lokalny bez zaufanego CA zawsze bedzie traktowany jako podejrzany.
Reczne utworzenie zaszyfrowanej kopii:
python manage.py secure_backupWymuszenie nowej kopii mimo duplikatu:
python manage.py secure_backup --forceOdszyfrowanie do stdout:
python manage.py secure_backup --decryptZaszyfrowane pliki sa zapisywane w secure_backups/backup.enc oraz secure_backups/backup_meta.json.
Po rejestracji aplikacja zapisuje IP startowe w modelu LoginLog. Po kazdym udanym logowaniu aplikacja zapisuje kolejne IP. Jezeli IP logowania jest inne niz poprzedni adres tego samego uzytkownika, aplikacja wywoluje create_secure_backup(skip_duplicate=True).
Dla testow przez proxy aplikacja czyta pierwszy adres z naglowka X-Forwarded-For, a potem REMOTE_ADDR.
Endpoint /logout/ obsluguje zwykle wejscie GET i przekierowuje do /login/.
Jezeli przegladarka pokazuje ERR_CONNECTION_REFUSED, serwer runhttps nie jest uruchomiony albo zostal zamkniety.
Jezeli przegladarka pokazuje ERR_TIMED_OUT, najczestsza przyczyna byla w komendzie runhttps: TLS nie moze blokowac glownej petli serwera. Aktualna wersja owija SSL w watku pojedynczego polaczenia, wiec kilka rownoleglych wejsc na /register/ powinno odpowiadac bez zawieszania.
Szybki test lokalny:
python -c "import ssl, urllib.request; print(urllib.request.urlopen('https://127.0.0.1:8000/register/', context=ssl._create_unverified_context(), timeout=5).status)"Poprawny wynik to 200.
python manage.py testTest integracyjny backupu wymaga pakietu cryptography. Gdy pakiet nie jest zainstalowany, ten test zostanie pominiety.
Raport bazy Django uruchom z katalogu glownego:
python scripts\report_python_users_by_ip.pyMozesz podac inna baze jako pierwszy argument. Skrypt wyswietla osobno
uzytkownikow z jednym unikalnym IP oraz tych, ktorzy logowali sie z wiecej niz
jednego IP. Aby wygenerowac ten sam raport z PostgreSQL skonfigurowanego w
Django (POSTGRES_* w .env), uruchom:
python scripts\report_python_users_by_ip.py --postgres