2013-06-05 11 views
9

Mamy instalację Ubuntu12.04 + PHP + nginx na naszych serwerach. Nasi programiści mają dostęp do/usr/lib/php5/i/var/www/folders. Pracujemy nad wieloma projektami i w danym momencie mamy 50-100 różnych aplikacji/modułów, każdy z db active.Zabezpieczanie haseł w konfiguracji nginx Multi-Dev

Chcielibyśmy wymyślić mechanizm zabezpieczenia naszych haseł DB z następujących względów:

  • Do administratorów tworzą hasło i zarejestrować go gdzieś (plik lub SQLite db czy coś takiego)
  • Aplikacje udostępniają klucz wskazujący, który DB i jakie poziomy uprawnień są potrzebne, a moduł zwraca obiekt zawierający wszystko, co jest potrzebne do połączenia. Coś jak "user_manager.client1.ro", "user_manager.client1.rw".
  • Mechanizm powinien zapewniać konkretne hasło do aplikacji, a przez to dostępne przez "www-dane", ale wszystkie inne hasła nie będą widoczne, dopóki ich klucze nie będą znane.

Udało nam się uzyskać prototyp na ten cel, ale centralny moduł dostarczający hasła działa w przestrzeni danych www, stąd plik/sqlite może być zawsze dostępny przez dowolny inny plik w/var/www/lub/usr/lib/php5 i stąd wszystkie hasła mogą zostać naruszone.

Czy istnieje sposób ustawienia elementów w taki sposób, że moduł dostarczający hasła działa z uprawnieniami roota, a aplikacja żąda od niego haseł? Wiem, że możemy zbudować dla niego zupełnie nową usługę, ale wydaje się, że jest zbyt wiele do zbudowania i utrzymania (zwłaszcza, że ​​ta usługa staje się naszym pojedynczym punktem awarii).

Jakieś sugestie?

+0

Aby lepiej zrozumieć swoje pytanie: czy moduł jest napisany w PHP? Czy potrzebujesz rozwiązania, które bezwzględnie używa tego modułu, czy możesz po prostu grać z uprawnieniami do plików? Czy każdy programista musi mieć dostęp do wszystkich plików? – St0rM

+0

Centralny moduł dostarczający hasła jest obecnie w PHP i jest niczym innym, jak zwykłą klasą PHP. Jesteśmy otwarci na pomysły, więc wszystko z uprawnieniami do plików jest w porządku z nami. Jeśli chodzi o programistę, który ma dostęp do wszystkich plików - biorąc pod uwagę, że jesteśmy niewielkim zespołem z każdym deweloperem, który ma na sobie wiele czapek, oddzielenie dostępu będzie dość trudne - więc nie pójdę na kompromis. – Shreeni

+0

Nie ma możliwości, bym mógł to rozwiązać, jeśli chcesz, aby każdy programista uzyskał dostęp do wszystkiego i uniemożliwił im dostęp do bazy danych. Dajesz im dostęp do czegoś, co ma ten dostęp (tj. Kod), aby mieli dostęp do bazy danych. Mogą na przykład napisać wiersz kodu, który odczyta hasło i zapisać go w ukrytym pliku ... Uważam, że w samym pytaniu jest coś nie tak. – St0rM

Odpowiedz

1

Korzystanie uprawnienia, można zrobić coś takiego:

1) dać jednego programistę użytkownikowi

2) chown każdy folder w/var/www/do użytkownika www-data i specyficzną grupę dla że strona, coś jak: /var/www/site-a www-data grupa-a /var/www/site-www-b dane grupa-b itp

3) chmod każdym katalogu (i wszystkie podkatalogi i pliki z -R) do 770

4) dodawać każdego programistę do każdej grupy, dla której faktycznie pracuje.

0

Innym podejściem, o którym wspomniałem w dokumencie different answer, jest dostarczenie kluczy kryptograficznych za pośrednictwem interfejsu API, gdy aplikacja o to poprosi.

Twoi nienaruszeni twórcy wyszukają API za pomocą unikalnego klucza, aby uzyskać odpowiednie poświadczenia. Klucz można odwzorować na zestaw poświadczeń (dla deweloperów w kilku projektach).

Jeśli chronisz interfejs API poprzez filtrowanie client certificate lub IP, zmniejszysz ryzyko wycieku danych (jeśli klucz dostępu zostanie zgubiony, musisz nadal znajdować się we właściwej sieci lub mieć certyfikat dostępu do interfejsu API). Preferowałbym certyfikat, jeśli ufasz programistom (za komentarzem).

0

Najprostszym rozwiązaniem jest uruchomienie aplikacji, która zarządza poświadczeniami i przekazuje je programistom z innej instancji serwera WWW (oczywiście słuchając innego portu), a następnie można uruchomić tę instancję jako inny użytkownik i dokręcić w dół uprawnienia, aby tylko ten użytkownik miał dostęp do tajnych plików, których potrzebuje.

Ale utwórz dodatkowego użytkownika, nie uruchamiaj go jako root.

Pod apache wskazywałbym na suexec lub suPHP. Ale ponieważ nie używasz Apache, nie jest to opcja dla ciebie.

Powiązane problemy