Kolejny post o trzymaniu hasła

0

Cześć,

Wiem że temat stary jak świat, ale różne źródła różnie mówią, i sam już się pogubiłem. Normalną sytuacją jest, że np potrzebujemy się połączyć z bazą, więc tutaj już się pojawia pierwsze hasło (do bazy). Oraz w testach, również chcemy się zalogować do aplikacji (czyli hasło do aplikacji). Czasami również chcemy się logować w połączeniu service-to-service, czyli jakimś userem technicznym. No i teraz pojawia się odwieczna kwestia trzymania haseł:

  1. Jako plain text w propertiesach czy w kodzie - to chyba nie wymaga komentarza, w ogóle brak ochrony
  2. Jako zmienne środowiskowe - niby wszystko fajnie, ale czy na pewno daje to najwyższą formę ochrony?
  3. Jakąś biblioteką szyfrującą (np Jasypt) - lepsze niż zmienne środowiskowe?

To o co pytam, to najlepiej połączyć te wszystkie możliwości do jednej "kupy" i stwierdzić, w kolejności, które jest najmniej bezpieczne a które najbardziej bezpieczne.

EDIT: Forma logowania nie ma znaczenia - jeden pies czy trzymamy password czy jakiś token czy inny secret, tak czy siak gdzieś go musimy przechowywać

Zawołam sobie kilku javowców, a co xd
@Shalom (pewnie co chwila wołany na forum), @scibi92, @jarekr000000, @Charles_Ray

3

Pytanie brzmi przed kim chcesz się bronić. Trzymanie haseł w repo jest słabe, bo mogą łatwo wyciec, każdy developer je widzi itd. Ale już kwestia czy to properties na serwerze czy env to bez większej różnicy. Jak ktoś jest w stanie przeczytać properties to /proc/self/environ pewnie też. Szyfrowanie properties niby spoko, tylko że aplikacja musi je sobie umieć odszyfrować (plus w pamięci trzyma odszyfrowane) więc znów w praktyce niewiele to zmienia...

1

Najlepiej generować dynamicznie, np. używając Vault od HashiCorp. Jeśli nie, to IMHO plaintext w pliku konfiguracyjnym na serwerze/zmiennych środowiskowych najlepiej (ale brońcie bogowie przed trzymaniem tych danych w repo).

1

Ja się spotkałem z podejściem, że apka na starcie dostaje hasła w zmiennych środowiskowych albo sama komunikuje się z zewnętrznym secret managerem (config service, Vault).

1

Zmienne srodowiskowe.
(Np. mam niektore w github secrets - automatycznie w czasie buildu są ustawiane i lądują w aplikacji na gke)
Ewentualnie - keystore na serwerze.

Generalnie wiadomo, ze programista da rade to wyciagnac (np. z logow). Ale zostaja po tym slady w zrodłach (ktos odczytał hasło i wstawił do loga). Musi tu byc dobrze zrobiony deployment -czyli na serwer nie moze wpasc cos co nie było w repo kodu.

2

Raczej zmienne środowiskowe, a idealnie jakiś zewnętrzny secret manager (jak używasz Springa to nawet są jakieś automagiczne integracje do Amazon SSMa i pewnie paru innych).

Przy czym wpychania tego typu rzeczy do zmiennych środowiskowych nie lubię - zawsze można się jakoś do nich dokopać, nawet jak pozamykasz wszelkie porty 22 i inne, to może się okazać że wyciągniesz je z hosta przez jakiś docker inspect lub coś podobnego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1