Po pierwsze , jak już powiedziało kilka osób, niezbędne jest oddzielenie poświadczeń od skryptu. (Oprócz zwiększonego bezpieczeństwa oznacza to również, że możesz ponownie użyć tego samego skryptu dla kilku systemów z różnymi poświadczeniami.)
Po drugie , należy wziąć pod uwagę nie tylko bezpieczeństwo poświadczeń, ale także wpływ, jeśli / kiedy dane poświadczenia zostaną naruszone. Nie powinieneś mieć tylko jednego hasła do całego dostępu do bazy danych, powinieneś mieć różne poświadczenia o różnych poziomach dostępu. Możesz na przykład mieć jednego użytkownika DB, który ma możliwość wyszukiwania w bazie danych - ten użytkownik powinien mieć dostęp tylko do odczytu. Inny użytkownik może mieć uprawnienia do wstawiania nowych rekordów, ale nie może ich usuwać. Trzeci może mieć uprawnienia do usuwania rekordów.
Oprócz ograniczenia uprawnień dla każdego konta, powinieneś mieć również ograniczenia, z którego można korzystać z każdego konta. Na przykład konto używane przez serwer sieciowy nie powinno mieć możliwości łączenia się z innego adresu IP niż adres serwera WWW. Konto z pełnymi uprawnieniami roota do bazy danych powinno być bardzo ograniczone pod względem miejsca, z którego może się łączyć i nigdy nie powinno być używane inaczej niż interaktywnie. Rozważ także użycie procedur przechowywanych w bazie danych, aby dokładnie ograniczyć możliwości każdego konta.
Ograniczenia te należy wdrożyć po stronie serwera DB, aby nawet po narażeniu strony klienta ograniczenia nie mogły zostać z niej zmienione. (I oczywiście serwer DB musi być chroniony zaporami ogniowymi itp. Oprócz konfiguracji DB ...)
W przypadku konta DB, które ma ograniczony dostęp tylko do odczytu i tylko z określonego adresu IP, możesz nie potrzebować żadnych dalszych danych uwierzytelniających, w zależności od wrażliwości danych i bezpieczeństwa hosta skryptu ucieka. Jednym z przykładów może być formularz wyszukiwania w Twojej witrynie, który można uruchomić z użytkownikiem, który może korzystać tylko z procedury składowanej, która wyodrębnia tylko informacje, które zostaną przedstawione na stronie internetowej. W takim przypadku dodanie hasła tak naprawdę nie zapewnia żadnego dodatkowego bezpieczeństwa, ponieważ informacje te są już przeznaczone do publicznego, a użytkownik nie może uzyskać dostępu do żadnych innych danych, które byłyby bardziej wrażliwe.
Upewnij się również, że połączenie z bazą danych zostało nawiązane przy użyciu TLS, w przeciwnym razie każdy, kto nasłuchuje w sieci, może uzyskać twoje poświadczenia.
Po trzecie , zastanów się, jakiego rodzaju poświadczeń użyć. Hasła są tylko jedną formą i nie są najbezpieczniejsze. Zamiast tego możesz użyć jakiejś formy pary kluczy publiczny / prywatny, AD / PAM lub tym podobnych.
Po czwarte , rozważ warunki, w których skrypt zostanie uruchomiony:
Jeśli jest uruchamiany interaktywnie, należy wprowadzić hasło lub hasło do klucza prywatnego lub klucza prywatnego lub zalogować się przy użyciu ważnego biletu Kerberos po uruchomieniu - innymi słowy, skrypt powinien uzyskać poświadczenia bezpośrednio od ciebie w momencie uruchomienia, zamiast odczytywania ich z jakiegoś pliku.
Jeśli jest uruchamiany z serwera WWW, rozważ skonfigurowanie poświadczeń w momencie uruchamiania serwera. Dobrym przykładem są tutaj certyfikaty SSL - mają certyfikat publiczny i klucz prywatny, a klucz prywatny ma hasło. Możesz przechowywać klucz prywatny na serwerze WWW, ale nadal musisz wprowadzić hasło do niego po uruchomieniu Apache. Możesz również mieć poświadczenia na jakimś sprzęcie, takim jak karta fizyczna lub HSM, które można usunąć lub zablokować po uruchomieniu serwera. (Oczywiście wadą tej metody jest to, że serwer nie może się zrestartować samodzielnie, jeśli coś się wydarzy. Wolę to niż ryzyko narażenia mojego systemu na szwank, ale przebieg może się różnić ...)
Jeśli skrypt jest uruchamiany z crona, jest to trudna część. Nie chcesz, aby poświadczenia znajdowały się w dowolnym miejscu w systemie, w którym ktoś może uzyskać do nich dostęp - ale chcesz, aby poświadczenia leżały tak, aby twój skrypt mógł uzyskać do nich dostęp, prawda? Cóż, niezupełnie dobrze. Zastanów się dokładnie, co robi skrypt. Jakich uprawnień potrzebuje do bazy danych? Czy można to ograniczyć, aby nie miało znaczenia, czy niewłaściwa osoba połączy się z tymi uprawnieniami? Czy możesz zamiast tego uruchomić skrypt bezpośrednio na serwerze DB, do którego nikt inny nie ma dostępu, zamiast z serwera, który ma innych użytkowników? Jeśli z jakiegoś powodu, o którym nie mogę pomyśleć, absolutnie musisz mieć skrypt działający na niepewnym serwerze i musi być w stanie zrobić coś niebezpiecznego / destrukcyjnego ... teraz jest dobry czas, aby przemyśleć swoją architekturę.
Po piąte , jeśli cenisz bezpieczeństwo swojej bazy danych, nie powinieneś uruchamiać tych skryptów na serwerach, do których mają dostęp inne osoby. Jeśli ktoś jest zalogowany w twoim systemie, będzie mógł uzyskać twoje dane uwierzytelniające. Na przykład w przypadku serwera WWW z certyfikatem SSL istnieje co najmniej teoretyczna możliwość uzyskania dostępu do katalogu głównego i uzyskania dostępu do obszaru pamięci procesu httpd i wyodrębnienia poświadczeń. W ostatnim czasie istniał przynajmniej jeden exploit, w którym można to zrobić za pomocą protokołu SSL, nawet nie wymagając zalogowania się atakującego.
Zastanów się również nad użyciem SELinuksa, aplikacji lub innej dostępnej dla twojego systemu, aby ograniczyć użytkowników, którzy mogą to robić. Umożliwią one użytkownikom zabronienie nawet próby połączenia się z bazą danych, nawet jeśli uda im się uzyskać dostęp do poświadczeń.
Jeśli to wszystko wydaje ci się przesadne i nie możesz sobie na to pozwolić lub nie masz czasu - to, moim zdaniem (arogancki i elitarny), nie powinieneś przechowywać w bazie danych niczego ważnego lub wrażliwego. A jeśli nie przechowujesz niczego ważnego lub wrażliwego, to miejsce, w którym przechowujesz swoje dane uwierzytelniające, również nie jest ważne - w takim przypadku, po co w ogóle używać hasła?
Na koniec , jeśli absolutnie nie możesz uniknąć przechowywania pewnego rodzaju poświadczeń, możesz mieć poświadczenia tylko do odczytu, a własność root i root może nadawać własność na wyjątkowo tymczasowy czas, gdy zostanie o to poproszony przez skrypt (ponieważ twój skrypt nie powinien być uruchom jako root, chyba że jest to absolutnie konieczne, a połączenie z bazą danych nie jest konieczne). Ale wciąż nie jest to dobry pomysł.