Skip to content

feat(security): szyfrowanie sekretów integracji w bazie - #923

Merged
mpasternak merged 1 commit into
devfrom
sec/szyfrowanie-sekretow
Oct 24, 2026
Merged

mpasternak merged 1 commit into
devfrom
sec/szyfrowanie-sekretow

Conversation

@mpasternak

@mpasternak mpasternak commented Oct 24, 2026 •

Copy link
Copy Markdown
Member

Co zmieniono

  • Uczelnia.pbn_app_token, Uczelnia.orcid_client_secret, Uczelnia.clarivate_password i BppUser.pbn_token przechodzą na EncryptedTextField (dotąd używany przez dspace_api_password). max_length zostaje (walidacja formularzy); kolumny stają się text.
  • src/bpp/fields.py: klucz z nowej zmiennej DJANGO_BPP_FIELD_ENCRYPTION_KEY (MultiFernet; kilka kluczy po przecinku — pierwszy szyfruje, reszta tylko odczyt), DSPACE_CREDENTIALS_KEY nadal obsługiwany jako klucz zgodności.
    • Bez klucza: zapis jawny z ostrzeżeniem w logu, odczyt rozpoznaje wartości jawne (szyfrogram Fernet zaczyna się od gAAAAA) — instalacje bez klucza działają jak dotąd (wcześniej zapis pola rzucał ImproperlyConfigured).
    • Nieodszyfrowalny szyfrogram (zły/brak klucza) czytany jest jako pusta wartość (jak dotąd), ale ponowny zapis rekordu zachowuje oryginalny szyfrogram zamiast nadpisać go pustym napisem.
    • Niepoprawny format klucza → ImproperlyConfigured przy zapisie (bez cichego przejścia na zapis jawny).
    • Porównanie z "" (exclude(pbn_token="")) działa jak dotąd — pusty napis nie jest szyfrowany.
    • Serializacja (value_to_string: historia zmian django-reversion w adminie Uczelni, dumpdata) zapisuje szyfrogram zamiast wartości jawnej; to_python odszyfrowuje go przy deserializacji, więc przywrócenie wersji odtwarza poprawną wartość. Wersje historii zapisane przed tą zmianą nie są przepisywane.
  • Migracja 0496_uczelnia_bppuser_szyfrowanie_sekretow: AlterField + RunPython szyfrujący istniejące jawne wartości (surowy SQL, nie przez ORM), gdy klucz jest dostępny; bez klucza pomija z komunikatem. Cofnięcie odszyfrowuje.
  • manage.py zaszyfruj_sekrety (idempotentne, --rotuj przepisuje szyfrogramy na główny klucz, --dry-run).
  • System checki (src/bpp/checks.py, same Warningi — nie blokują startu/migrate/buildu): bpp.W101 brak klucza, bpp.W102 zły format klucza, bpp.W103 w bazie są szyfrogramy nieodszyfrowalne aktualnym kluczem, bpp.W104 klucz jest, ale zostały wartości jawne. W103/W104 tylko z listą baz (migrate, check --database default), błąd bazy → pominięcie.
  • Dokumentacja: docs/administrator/zaawansowane.md (nowa sekcja: generowanie klucza, rotacja, utrata klucza), docs/administrator/integracja-dspace.md.

Uwagi

Testy

  • Nowe: src/bpp/tests/test_szyfrowanie_sekretow.py (pole, MultiFernet/stary klucz, brak klucza, zły klucz, zachowanie nieodszyfrowalnej wartości przy zapisie, surowa zawartość kolumn, exclude(pbn_token=""), QuerySet.update, klient PBN dostaje odszyfrowane tokeny, migracja w obie strony, komenda z --rotuj/--dry-run, system checki, serializacja i przywracanie wersji z django-reversion bez wartości jawnej).
  • Lokalnie: nowe testy + test_encrypted_field — 28 passed; testy modułów dotkniętych zmianą (dspace_api, admin integracji Uczelni, DjangoQL sekrety, pbn_api, orcid_integration, pbn_downloader_app, bpp_setup_wizard, clarivate, pbn_wysylka_oswiadczen, importer PBN, oidc) — 995 passed.
  • makemigrations --check — bez zmian; ruff, pre-commit — OK.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UJ23Rb1c5UtxHTfAke9ENQ

@gitguardian

gitguardian Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

️✅ There are no secrets present in this pull request anymore.

If these secrets were true positive and are still valid, we highly recommend you to revoke them.
While these secrets were previously flagged, we no longer have a reference to the
specific commits where they were detected. Once a secret has been leaked into a git
repository, you should consider it compromised, even if it was deleted immediately.
Find here more information about risks.


🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.

@mpasternak
mpasternak force-pushed the sec/szyfrowanie-sekretow branch from 62afd2d to 8d977cf Compare October 24, 2026 17:23
Pola Uczelnia.pbn_app_token, Uczelnia.orcid_client_secret,
Uczelnia.clarivate_password i BppUser.pbn_token przechodzą na
EncryptedTextField (migracja 0496 szyfruje istniejące wartości, gdy
klucz jest dostępny; cofnięcie odszyfrowuje).

- klucz: nowa zmienna DJANGO_BPP_FIELD_ENCRYPTION_KEY (MultiFernet,
  kilka kluczy po przecinku); DSPACE_CREDENTIALS_KEY nadal obsługiwany
- bez klucza zapis jawny z ostrzeżeniem, odczyt rozpoznaje wartości
  jawne; nieodszyfrowalny szyfrogram czytany jako pusty, ale ponowny
  zapis rekordu go zachowuje
- serializacja (historia zmian django-reversion, dumpdata) zapisuje
  szyfrogram; deserializacja go odszyfrowuje
- manage.py zaszyfruj_sekrety (idempotentne, --rotuj, --dry-run)
- system checki bpp.W101-W104 (brak/zły klucz, nieodszyfrowalne
  i jawne wartości w bazie; te ostatnie tylko z --database)
- dokumentacja administratora i testy

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UJ23Rb1c5UtxHTfAke9ENQ
@mpasternak
mpasternak force-pushed the sec/szyfrowanie-sekretow branch from 8d977cf to 756ea14 Compare October 24, 2026 18:30
@mpasternak
mpasternak merged commit c11dfb7 into dev Oct 24, 2026
23 of 24 checks passed
@mpasternak
mpasternak deleted the sec/szyfrowanie-sekretow branch October 24, 2026 18:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant