Jaka jest bezpieczna alternatywa dla używania hasła MySQL w wierszu poleceń?

35

Mamy skrypt wiersza polecenia PHP do wersji bazy danych. Ten skrypt uruchamiamy za każdym razem, gdy programista doda nową poprawkę do bazy danych.

Skrypt uruchamia łatkę za pomocą wiersza polecenia MySQL:

system('mysql --user=xxx --password=xxx < patch.sql');

Jednak MySQL 5.6 wydaje teraz następujące ostrzeżenie:

Ostrzeżenie: użycie hasła w interfejsie wiersza poleceń może być niepewne

Co jest oczywiście prawdą, ale może, ale nie musi stanowić problemu dla użytkownika.

  • Jaka jest zatem bezpieczna alternatywa?
  • Alternatywnie, czy można wyłączyć to ostrzeżenie?

Pamiętaj, że nie chcę polegać na zewnętrznym pliku hasła.

Benzoes
źródło
2
Posiadanie poświadczeń w pliku nie stanowi większego problemu. Jeśli dana osoba ma uprawnienia administratora na serwerze, może całkowicie ominąć system uwierzytelniania, po prostu ponownie uruchamiając serwer mysql z określoną opcją.
Zoredache,
To nie jest ten sam problem, co w sdedted duplicate . MySQL nie monituje o hasło, podaję je i działa dobrze. Szukam alternatywy dla podania hasła, z wyjątkiem pliku hasła.
Benjamin

Odpowiedzi:

17

W najnowszej wersji GA MySQL, tj. Wersji 5.6 , możesz to zrobić za pomocą komendy mysql_config_editor, jak opisano w http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html

Zasadniczo polega na: zaszyfrowaniu poświadczeń użytkownika / hasła przy użyciu aliasu hosta, a następnie skorzystania z aliasu hosta, umieszczenia tych informacji w pliku konfiguracyjnym w katalogu domowym, a następnie, gdy jest to potrzebne, zamiast robienia czegoś podobnego :

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

zamiast tego piszesz:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

tym samym unikając umieszczania hasła w skrypcie w postaci czystego tekstu.

Aby to zadziałało, musisz (tylko raz) zdefiniować myhostaliasjako:

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

Możesz używać różnych ścieżek logowania dla różnych kont i / lub hostów, jak chcesz. Całkiem dobry pomysł, jeśli mnie zapytasz.

Przypominam, że uważam, że ta funkcjonalność NIE istnieje w żadnej wersji poniżej 5.6.

Tuncay Göncüoğlu
źródło
Uwaga: Zdaję sobie sprawę, że mysql_config_editor faktycznie tworzy zewnętrzny plik haseł, jednak nie robisz tego, to jak działa system, więc nie musisz ręcznie en / de / crypting robić.
Tuncay Göncüoğlu
Dzięki, używam MySQL 5.6, więc to nie jest problem. To powiedziawszy, twoje podejście jest nadal problematyczne (przynajmniej z tym, jak obecnie pracujemy), ponieważ chcę pobrać hasło z pliku konfiguracyjnego PHP w czasie rzeczywistym i przekazać go dynamicznie do wiersza poleceń. Z tym, co sugerujesz, nadal musiałbym używać hasła w wierszu poleceń podczas dzwonienia mysql_config_editor, więc nie przynosi to niestety większej wartości. Staram się również unikać ręcznego programowania przez programistę, dlatego muszę utrzymywać zarówno plik konfiguracyjny PHP, jak i konfigurację mysql.
Benjamin
Moim najlepszym rozwiązaniem jest na razie zignorowanie ostrzeżeń. Zastanawiam się, czy w ogóle jest jakiś problem z bezpieczeństwem: ponieważ jest wywoływany z PHP, myślę, że wiersz poleceń nie jest zapisany w historii bash ani nigdzie indziej na komputerze?
Benjamin
o ile mi wiadomo, nie, historia bashów tego nie przechowuje. jednak hasło w postaci zwykłego tekstu w pliku konfiguracyjnym php niesie dokładnie takie samo ryzyko, tylko w innej formie. może wolisz przechowywać hasło za pomocą mysql_config_editor i przechowywać ścieżkę logowania w pliku konfiguracyjnym php? W ten sposób nie ujawnisz swojego hasła w dowolnym miejscu. (ale nadal będzie musiał zachować hasło zewnętrzne).
Tuncay Göncüoğlu
9

Użyj opcji --defaults-filelub --defaults-extra-file. Możesz w nim podać identyfikator użytkownika i hasło. Ma taki sam format jak /etc/my.cnf.

Czytając dalej, mówisz, że nie chcesz polegać na zewnętrznym pliku hasła, ale jest to jedyny naprawdę bezpieczny sposób. Wszystko inne pozostawi ślady w tabeli procesów lub coś takiego. Możesz nawet umieścić plik z hasłem w kontroli wersji, jeśli naprawdę chcesz. Uczyń go 600 (lub 400) i czytelnym tylko dla mysql lub użytkownika, na którym działa.

LSD
źródło
1
Nie jestem przeciwny plikowi hasła ze względów bezpieczeństwa, po prostu poświadczenia MySQL są częścią globalnej konfiguracji w aplikacji PHP (używanej również do połączenia PDO), a zrobienie tego oznaczałoby utworzenie (tymczasowego) pliku hasła tylko w celu uruchomienia wiersza polecenia mysql przez cały okres istnienia skryptu (kilka sekund).
Benjamin
Jak to zrobić w systemie Windows Server 2012? Gdzie jest plik konfiguracyjny zawierający opcję --defaults-file?
Jake
Po prostu określ plik jako opcję --defaults-file jak w:mysql --defaults-file c:\some\dirs\my.cnf
lsd
@Benjamin, więc jeśli to nie o bezpieczeństwo, to wystarczy wpisać hasło w wierszu poleceń. Co jest złego w robieniu tego (oprócz bezpieczeństwa)?
Pacerier
@Benjamin, jeśli już używasz MySQL z PHP, dlaczego więc rozwidlasz mysqlklienta konsoli?
Josip Rodin
5

Masz 4 opcje na http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html

  • Użyj opcji -pyour_passlub --password=your_passw wierszu polecenia
  • Użyj opcji -plub --passwordw wierszu polecenia bez określonej wartości hasła. W takim przypadku program kliencki żąda hasła interaktywnie:
  • Przechowuj hasło w pliku opcji.
  • Przechowuj hasło w MYSQL_PWDzmiennej środowiskowej

Dla twoich potrzeb MYSQL_PWDmoże być opcją, ale nie jest już bezpieczniejsza. Naprawdę powinieneś odrodzić się interaktywnie --passwordi przesłać hasło interaktywnie, ale to dość skomplikowane rozwiązanie tego problemu.

RS
źródło
1
W jaki sposób MYSQL_PWD byłby mniej bezpieczny niż wiersz poleceń? PW nigdy nie pojawia się na liście procesów, co wydaje się być głównym problemem
TheLQ
1
Jasne, że tak. man pshas -E Display the environment as well. Z adresu URL, do którego podłączyłem: Tę metodę określania hasła do MySQL należy uznać za wyjątkowo niepewną i nie należy jej używać. Niektóre wersje ps zawierają opcję wyświetlania środowiska uruchomionych procesów. W niektórych systemach, jeśli ustawisz MYSQL_PWD, twoje hasło będzie widoczne dla każdego innego użytkownika, który uruchamia ps. Nawet w systemach bez takiej wersji ps nierozsądne jest zakładanie, że nie ma innych metod, za pomocą których użytkownicy mogliby badać środowiska procesów.
RS
Pobieranie z tej opcji MYSQL_PWD: Myślę, że jeśli ustawisz zmienną środowiskową na początku jakiegoś skryptu, to wywołasz linię poleceń MySQL, a następnie wyczyścisz, że później na końcu skryptu, możesz skrócić co najmniej czas ekspozycji . Czy to brzmi rozsądnie?
superjos
@kormoc, Proszę rozwinąć ostatni akapit. Co to za dość skomplikowane rozwiązanie, o którym mówiłeś?
Pacerier
1
Wydaje się, że użycie zmiennej środowiskowej jest bezpieczniejsze niż wiersz poleceń. W domyślnym systemie debian możesz zrobić psi zobaczyć argument wiersza poleceń dla każdego procesu każdego użytkownika. Ale ps ewyświetla tylko środowisko dla własnych procesów (chyba że jesteś rootem). Jest tylko nieznacznie bezpieczniejszy, ale nadal jest bardziej bezpieczny.
jlh
4

Jeśli twój skrypt PHP ma już otwarte połączenie z bazą danych, dlaczego po prostu nie mysqli_multi_query()zaimportujesz pliku .sql? Jeśli składnia pliku .sql jest poprawna, oczywiście ...

Michael Hampton
źródło
Nie jestem pewien, jak dobrze by to działało z dość dużymi plikami .sql?
Benjamin,
1
@Benjamin Nie wyobrażam sobie gorszego niż klient MySQL - jeśli naprawdę martwisz się bezpieczeństwem, choć byłby to najmniej hackerski sposób, a rozmiar jest problemem, który możesz rozwiązać na wiele sposobów.
voretaq7
Czy wiesz, czy jest to możliwe w przypadku PDO?
Benjamin,
PDO nie wydaje się mieć równoważnej funkcji do rzucania wielu zapytań do bazy danych jednocześnie. Przepraszam. To był pomysł ...
Michael Hampton