Wpis z mikrobloga

#php #programowanie #azure #symfony

Dostałem zadanie przechowanie loginu i hasła do bazy mysql w Azure Vault zamiast w lokalnym configu.
Nie wiem czy w ogóle da się to zrobić, ale osobiście nie widzę w tym żadnego sensu. Przecież atakujący po uzyskaniu dostępu do VM na którym jest aplikacja może dostać się do hasła bazy danych, nieważne gdzie jest przechowywane. Czy to przez debug kodu, czy uzyskania hasła z azure vault bo przecież jest na zaufanym VM.

Czy nie jest sensowniej po prostu zabezpieczyć usera bazy pozwalając na połączenie tylko z jednego IP w podsieci?
Ew. można też zaszyfrować hasło w symfony, ale to też żadne zabezpieczenie.
A może da się do tematu bezpieczeństwa hasła do bazy podejść inaczej?
  • 19
@Klopsztanga: OP mówi o loginie i haśle do bazy

@gajowy_marucha: co do tego:

atakujący po uzyskaniu dostępu do VM na którym jest aplikacja może dostać się do hasła bazy danych


I tak i nie, jeżeli miałbyś aplikację w kontenerze z odpowiednimi uprawnieniami, z filesystemem w trybie RO, to utrudniasz takie działanie bo nie możesz ani wrzucić webshella, ani wbić po SSH.

Ale ogólnie tak, trochę przerost nad treścią, chociaż zawsze
@Klopsztanga: OP mówi o loginie i haśle do bazy


@aso824: ahhh racja xD

Do OPA:
Gdzie byś trzymał config? Na serwerze? A co się stanie, gdy serwer będziesz musiał postawić od zera? Skąd weźmiesz hasło?
No i jak ogarniesz rotacje hasła?
Dlatego korzysta się z vault, gdzie możesz ustawiać permissions kto ma dostęp do hasła, ustawić rotacje itp.
@Klopsztanga:

Gdzie byś trzymał config?

No można zaszyfrować hasło i mieć je nawet w repo. Poza repo jest tylko klucz prywatny. Symfony ma to od wersji 4.x badajże.

Dlatego korzysta się z vault, gdzie możesz ustawiać permissions kto ma dostęp do hasła, ustawić rotacje itp.

No ok, ale jak to ogarnąć w symfony bo nawet nie wiem gdzie zacząć :/
@gajowy_marucha: nie, definitywnie nie.
Hasło powinno być pobierane podczas stawiania instancji, i pozniej co godzine pobierane :)
"Perfect world".

Możesz w PHP zrobić fetcher. Pobierasz hasło z vault gdy nie istnieje w cache, zapisujesz do lokalnego cache na 1h, np. pliku, a pozniej przekazujesz do doctrine/dbal
@Klopsztanga:

Możesz w PHP zrobić fetcher. Pobierasz hasło z vault gdy nie istnieje w cache, zapisujesz do lokalnego cache na 1h, np. pliku, a pozniej przekazujesz do doctrine/dbal


no ok, ale widzę tu tylko sens z punktu widzenia zarządzania hasłami, przecież skoro fetcher zapisuje hasło lokalnie to gdzie tu różnica w bezpieczeństwie?

nie, definitywnie nie.

Nie jestem pewien do czego się tu odnosisz?
no ok, ale widzę tu tylko sens z punktu widzenia zarządzania hasłami, przecież skoro fetcher zapisuje hasło lokalnie to gdzie tu różnica w bezpieczeństwie?


@gajowy_marucha: aby na to odpowiedzieć, muszę się zapytać jak dotychczas zarządzałeś hasłami, wtedy będę mógł powiedzieć jakie profity.
@Klopsztanga: Nie no, ja wiem że jak np hasło jest w pliku tekstowym gdzieś na one drive to nie jest ok.
Będzie manager haseł, czyli teoretycznie żeby postawić nową instancję uprawniona osoba pobiera je z managera (czy to będzie azure czy coś innego) i zapisuje w config, dodatkowo w postaci zaszyfrowanej.
Nie widzę różnicy między tym a automatycznym pobieraniem z vault i zapisywaniem w config (lub cache).

Nie upieram się że
@gajowy_marucha: no właśnie. vault to taki manager haseł, tylko że można go obsługiwać z poziomu API :)

W twojej sytuacji vault to overkill bo wykorzystujesz chmure jako zwykły "VPS", nie masz kilku serwerów z swoją aplikacją, gdzie manualne ustawiania np. dla 100 serwerów jest czasochłonne.
Nie masz autoscalingu - czyli tworzenie nowych instancji w ramach obciążenia serwera.

vault to manager haseł, gdzie trzymasz hasła. Następnie zezwalasz serwerom by miały dostęp do
@Klopsztanga: No o to mi chodziło, dzieki.

Następnie zezwalasz serwerom by miały dostęp do konkretnych haseł, by w momencie "powstawania" serwera wiedziały skąd je pobrać.


No i to ma sens, czyli byłaby to raczej część deployment, a nie że apka jak chce odpytać serwer to pyta vault o hasło, a tego ktoś ode mnie wymaga:)
@gajowy_marucha: zależy jaką ten ktoś ma longtermową wizję :)

Bo jak chce sobie później ustawić rotację haseł, to bardzo dobry krok w przód.

Ja np. nie wiem jakie teraz mamy hasło do bazy danych. Codziennie się one zmienia. Dlatego jak mnie zwolnią - to uja będę mógł "zaszkodzić" firmie, bo moje hasła będą przestarzałe :) Wszystkie dane bezpieczeństwa zmieniają się codziennie.

A tak to manualnie ustawiasz hasło, jakiś developer zostanie zwolniony
@Klopsztanga:

zależy jaką ten ktoś ma longtermową wizję :)

Bo jak chce sobie później ustawić rotację haseł, to bardzo dobry krok w przód.

Ale czy to nie powinien być proces automatyczny, jakiś proces zapisuje hasło lokalnie - cyklicznie. A nie że apka za każdym razem pyta o hasło przy każdym requeście?

A tak to manualnie ustawiasz hasło, jakiś developer zostanie zwolniony - ale nadal będzie mieć hasło z sobą i krzywdę
Ale czy to nie powinien być proces automatyczny, jakiś proces zapisuje hasło lokalnie - cyklicznie. A nie że apka za każdym razem pyta o hasło przy każdym requeście?


@gajowy_marucha: tak nie powinno być, bo
1. spowalniasz aplikacje. Każdy http request to dodatkowe 10ms
2. Nie wypłacicie się, bo za każdy request się płaci xD

Dane powinny być pobierane tak jak piszesz, w procesie.

Ale jak skoro hasło działa tylko na konkretnym
@Klopsztanga: Uff dobra, chyba mam jasny obraz tego teraz.

Jeśli masz chwilę mógłbyś mi naświetlić z grubsza w jaki sposób działa taki proces zmiany hasła?
Rozumiem że vault sam w sobie nie zmienia hasła w bazie mysql?
Czy np taki proces byłby na serwerze gdzie jest db? Np 1) zmień hasło w bazie 2) zmień hasło w vault?
W jaki sposób VMy dowiadują się o zmianie hasła? Jakaś flaga, np plik
@gajowy_marucha: nie znam się na Ażure, ale w AWS mamy Secret Manager. Do secret manager możemy podpiąć AWS Lambda.
Nasza aws lambda zmienia hasło do bazy danych, zostawiając stare hasło przez następną godzinę. Czyli 2 hasła działają przez następną godzinę.

Po następnym uruchomieniu lambdy, stare hasło jest usuwane, nowe hasło staje się starym, a nowe hasło jest wygenerowane.

Do tego nasze aplikacje synchronizują to co jest w SecretManager co 1godzine.