Jeśli zaloguję się przy użyciu hasła roota na swoim polu, mogę po prostu wpisać
mysqldump - wszystkie bazy danych, a ja otrzymam oczekiwany „zrzut”.
Konfiguruję zadanie w cron.daily, aby uruchomić i zrzucić je na dysk zapasowy. Problemem jest to, że chociaż użytkownik działa jako root, pojawia się następujący komunikat
mysqldump: Wystąpił błąd: 1045: Odmowa dostępu dla użytkownika „root” @ „localhost” (przy użyciu hasła: NIE)
podczas próby połączenia. I nie chcą ciężko kodem hasło użytkownika root bazy mysql w skrypcie (kto).
Biorąc pod uwagę, że mogę po prostu wpisać „mysqldump” w wierszu poleceń w mojej powłoce bash, musi być jakoś obejść za pomocą parametru -u. Mam już #! / Bin / bash na górze skryptu.
Czego tu brakuje, żeby nie pytać o hasło roota do bazy danych?
Bezpieczeństwo nie powinno odbywać się przez zaciemnienie. Jeśli obawiasz się, że ktoś ma dostęp do twojego konta root, nie ma znaczenia, czy hasło roota mysql jest przechowywane w skrypcie, ponieważ wszystkie twoje dane są dostępne w zrzutach mysql lub plikach bazy danych. Tak więc prawdziwe pytanie brzmi: co próbujesz chronić?
Jeśli nie chcesz, aby inni uzyskiwali hasło, które pozwoli im zmieniać dane w bazie danych, musisz utworzyć użytkownika z odpowiednimi uprawnieniami .
Jeśli nie chcesz, aby hasło mysql było widoczne dla dowolnego konta lokalnego, z wyjątkiem uprawnień pliku root ustawionych w tym skrypcie na 0700 i właściciela root.
źródło
Twoje użycie powłoki może to zrobić, ponieważ masz powłokę, z której można ją uruchomić, tj. Po zalogowaniu się uruchamiane są wszystkie skrypty powłoki w profilu.
Cron nie ma takich luksusów. Kiedy się zaloguje (jako root), zaloguje się przy użyciu domyślnej powłoki. Zapobiega to zdalnemu logowaniu się, ale oznacza również, że nie są uruchamiane skrypty automatycznego logowania.
Możesz ustawić powłokę, pod którą będzie działał cron, edytować crontab i dodać zmienne SHELL i HOME, np.
jeśli nie są ustawione, cron będzie działał z powłoką i katalogiem domowym określonym w / etc / passwd (które prawdopodobnie są niczym, prawdopodobnie / bin / sh).
Jeśli chcesz zobaczyć, jak środowisko cron działa, dodaj zadanie cron, które eksportuje env do pliku, np .:
źródło
Jeśli skrypt jest uruchamiany przez root, możesz utworzyć plik /root/.my.cnf z uprawnieniami 600 i następującą zawartością:
(gdzie oczywiście podajesz nazwę użytkownika MySQL i hasło).
Plik ten zostanie automatycznie odczytany przez dowolne narzędzie wiersza polecenia mysql, jeśli zostanie uruchomione jako root. Nie musisz już podawać go w wierszu poleceń. 600 uprawnień chroni go przed wścibskimi oczami.
źródło
Debiut może być bardzo frustrujący. Kiedy zadania crona są wykonywane, nie mają ustawionego środowiska takiego, jak w przypadku powłoki.
Wskazówki dla crona:
Jeśli użytkownik root może to zrobić z poziomu powłoki, cron powinien mieć taką możliwość. Upewnij się, że jawnie określono plik konfiguracyjny do użycia w wierszu polecenia.
źródło
Chociaż kilka z tych odpowiedzi jest pomocnych, kilka jest mylących, ponieważ użytkownik root w systemie Unix i użytkownik root w mysql nie są tacy sami i w zasadzie nie mają żadnych relacji innych niż obaj używają nazwy logowania „root”. Może to oczywiste, ale wydaje się, że niektóre odpowiedzi łączą te dwie kwestie.
Co może być przydatną opcją (może istnieje?) Dla mysqld, byłoby zezwolenie programom klienckim takim jak mysql lub mysqldump itp. Działającym jako root systemu UNIX na dostęp do root @ localhost mysqld bez hasła bez konieczności przechowywania hasła root @ localhost (mysql) w pliku my.cnf lub podobnym.
Wiem, że to trochę denerwuje, ale powodem jest to, że każdy, kto działa jako lokalny (na serwerze mysqld) root root w unixie, może i tak ominąć zabezpieczenia mysqld. A posiadanie my.cnf z hasłem root mysqld 7x24 lub nawet tworzenie / usuwanie my.cnf z hasłem root mysql (skąd to hasło pochodzi?) W locie (np. Aby zrobić mysqldump) denerwuje mnie .
Wymagałoby to pewnej infrastruktury i myślenia, ponieważ trzeba by było zaufać mysql / mysqldump / etc, aby przekazać mysqld, że naprawdę wierzy, że jest on zarządzany przez lokalne konto root Unix.
Ale na przykład ograniczenie tylko do gniazda unix mysqld, bez TCP, może pomóc, przynajmniej jako zdecydowanie zalecana opcja tej opcji. To może ustalić, że klient działa lokalnie, co prawdopodobnie nie wystarcza. Ale to może być początek pomysłu. Być może przesłanie deskryptora pliku przez gniazdo unix może być kolejnym kawałkiem (google, jeśli to brzmi jak szalona rozmowa).
PS Nie. Nie zamierzam tutaj próbować burzy mózgów, jak to wszystko może działać w systemie operacyjnym innym niż Unix, co prawdopodobnie przekłada się na inne systemy operacyjne.
źródło
/root/.my.cnf
z odpowiednimi uprawnieniami starannie rozwiązuje problem.