Kim jest użytkownik MySQL debian-sys-maint (i nie tylko)?

71

Kilka razy zostałem ugryziony przez użytkownika „debian-sys-maint”, który jest domyślnie instalowany na pakietach mysql-server instalowanych z repozytoriów Ubuntu.

Ogólnie rzecz biorąc, zdarza się, że pobieram świeżą kopię naszej produkcyjnej bazy danych (która nie jest uruchomiona na Debianie / Ubuntu) w celu rozwiązywania problemów lub nowego rozwoju i zapominam wykluczyć tabelę mysql.user, tracąc w ten sposób użytkownika debian-sys-maint.

Jeśli dodamy nowych użytkowników mysql z jakiegokolwiek powodu, muszę „scalić” je z moim środowiskiem programistycznym, zamiast nakładać na siebie tabelę.

Bez użytkownika mój system nadal wydaje się funkcjonalny, ale nękają go takie błędy, jak:

sudo /etc/init.d/mysql restart
Stopping MySQL database server: mysqld...failed.
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
  • Do czego służy Debian-sys-maint?
    • Czy istnieje lepszy sposób dla opiekunów pakietów na robienie tego, co próbują zrobić?
  • Jaki jest najłatwiejszy sposób na przywrócenie go po tym, jak go zgubiłem?
  • Jaki jest prawidłowy / minimalny zestaw uprawnień dla tego użytkownika?
    • Wydaje się, że złym pomysłem jest „nadanie wszystkich uprawnień *. * ...”

Edytować

Dodatkowe pytanie - czy hasło w /etc/mysql/debian.cnf jest już zakodowane, czy jest to hasło w postaci zwykłego tekstu? Ma to znaczenie, gdy idziesz do odtworzenia użytkownika, a ja nigdy nie wydaje mi się, aby był poprawny za pierwszym razem.

Dzięki

Joe Holloway
źródło
8
Hasło jest jawnym tekstem w /etc/mysql/debian.cnf
Brent

Odpowiedzi:

57

Do czego służy Debian-sys-maint?

Jedną z głównych rzeczy, dla których jest używany, jest powiedzenie serwerowi, aby rzucił dzienniki. Wymaga przynajmniej uprawnienia do ponownego ładowania i wyłączania.

Zobacz plik /etc/logrotate.d/mysql-server

Jest on używany przez /etc/init.d/mysqlskrypt do uzyskania statusu serwera. Służy do płynnego zamykania / przeładowywania serwera.

Oto cytat z README.Debian

* MYSQL WON'T START OR STOP?:
=============================
You may never ever delete the special mysql user "debian-sys-maint". This user
together with the credentials in /etc/mysql/debian.cnf are used by the init
scripts to stop the server as they would require knowledge of the mysql root
users password else.

Jaki jest najłatwiejszy sposób na przywrócenie go po tym, jak go zgubiłem?

Najlepszym planem jest po prostu nie stracić go. Jeśli naprawdę zgubisz hasło, zresetuj je, używając innego konta. Jeśli utraciłeś wszystkie uprawnienia administratora na serwerze mysql, postępuj zgodnie z instrukcjami, aby zresetować hasło roota, a następnie napraw je debian-sys-maint.

Możesz użyć takiego polecenia, aby zbudować plik SQL, którego możesz użyć później do ponownego utworzenia konta.

mysqldump --complete-insert --extended-insert=0 -u root -p mysql | grep 'debian-sys-maint' > debian_user.sql

Czy hasło w /etc/mysql/debian.cnf jest już zakodowane?

Hasło nie jest szyfrowane / szyfrowane po zainstalowaniu, ale nowe wersje mysql mają teraz sposób szyfrowania poświadczeń (patrz: https://serverfault.com/a/750363 ).

Zoredache
źródło
1
„Najlepszy plan to po prostu nie stracić go”. Poważnie? To zerowa pomoc dla osób, które już go zgubiły, tak jak najwyraźniej podczas aktualizacji. Dla tych, którzy muszą ponownie utworzyć użytkownika, skorzystaj z jednej z opcji „UDZIELANIE WSZYSTKICH” w innych odpowiedziach, ponieważ ten użytkownik NIE jest używany tylko do operacji logrotacji - jest to krytyczna część procesu aktualizacji.
FKEinternet
Jeśli utracisz poświadczenia, zawsze masz opcję - wystarczy uruchomić demona mysql / mariadb z opcją pominięcia systemu uprawnień lub zalogować się jako inny użytkownik z uprawnieniami root mysql i zresetować hasło. Resetowanie haseł i omijanie systemu uprawnień jest dobrze udokumentowane w innych lokalizacjach w Google i innych pytaniach na tej stronie.
Zoredache
22

Użytkownik debian-sys-maint jest domyślnie odpowiednikiem root . Jest on używany przez niektóre skrypty konserwacyjne w systemach Debian i jako efekt uboczny pozwala użytkownikom z dostępem do roota na skrzynce zobaczyć hasło w postaci jawnego tekstu w /etc/mysql/debian.cnf (dobry czy zły?)

Możesz ponownie utworzyć użytkownika poprzez:

GRANT ALL PRIVILEGES on *.* TO `debian-sys-maint`@`localhost` IDENTIFIED BY 'your password' WITH GRANT OPTION;

Upewnij się tylko , że hasło jest zgodne z tym w /etc/mysql/debian.cnf

Brent
źródło
9
Re (dobry lub zły) - jeśli komuś uda się rootować, może całkowicie ominąć system uprawnień, po prostu ponownie uruchamiając serwer z właściwymi opcjami. Jeśli atakujący zostanie rootem, prawdopodobnie masz większe problemy niż ten plik konfiguracyjny.
Zoredache
2
także re: dobre lub złe - musiałem polegać na dostępie do debian-sys-maint, aby zresetować hasło do konta root MySQL, gdy zostało zapomniane. Miło było mieć tę opcję zastępczą.
Brent
1
@Brent: Zobacz dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html, aby dowiedzieć się, jak zresetować hasło roota mysql. Wyłączyłem tego użytkownika w wielu instalacjach mysql na Debianie, ponieważ może to spowodować spustoszenie podczas uruchamiania, sprawdzając tabele, czy są to duże tabele.
Nathan
1
Nathan, dziękuję za ten link. To dla mnie nowa informacja. Jeśli masz procedurę całkowitego wyłączenia konta debian-sys-maint, dlaczego nie podasz go tutaj jako osobnej odpowiedzi. Byłoby świetnie!
Brent
3
lepszym rozwiązaniem byłoby po prostu nadanie uprawnień do zamykania / uruchamiania.
jmtd,
19

Możesz także:

sudo dpkg-reconfigure mysql-server-5.0

Co da ci możliwość odtworzenia użytkownika debian-sys-maint. Istniejący użytkownicy i bazy danych są bezpieczne.


źródło
Działa to również na mysql-server-5.5.
serverSentinel
Działa to tylko wtedy, gdy instalacja serwera mysql nie jest zepsuta - co może się zdarzyć, jeśli brakuje użytkownika debian-sys-maint.
FKEinternet
19

Chciałem tylko skomentować, ale myślę, że poprawna składnia zasługuje na swój własny wpis. Spowoduje to utworzenie użytkownika debian-sys-maint :

mysql> GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'plaintextpassword' WITH GRANT OPTION; FLUSH PRIVILEGES;

Jeśli nadal masz plik /etc/mysql/debian.cnf, po prostu użyj tam hasła.

Nie krępuj się wymyślić bardziej paranoiczne bezpieczne rozwiązanie.

d -_- b
źródło
1
Jest tak paranoiczny, jak powinien. W takim przypadku tylko użytkownik, który powinien móc odczytać plik /etc/mysql/debian.cnf, to rootużytkownik systemu Linux . A kiedy ktoś może odczytać ten plik, ma już rootdostęp do komputera i może zatrzymać serwer MySQL i dodać własnego administratora systemu. A skrypt uruchamiający MySQL i inne pakiety nie może przeprowadzać konserwacji zabezpieczeń ani innych czynności konserwacyjnych. Tak, jest tak bezpieczny, jak zawsze musi być. I przydatne, jeśli stracisz hasło administratora MySQL, aby je odzyskać, bez potrzeby restartowania go w niepewnym trybie. ;-)
Anders
Po to jest edycja.
RobinJ
6

Jeśli chcesz dodać debian-sys-maintużytkownika tylko do logrotate.dcelów, należy nie przyznawać ALL PRIVILEGESalbo GRANT OPTION- jest to niepotrzebna dziura gigant bezpieczeństwa. Zamiast tego możesz po prostu dodać użytkownika z takim RELOADuprawnieniem (zakładając, że uzyskujesz dostęp do bazy danych jako rooti zastępujesz hasło xxxxxx)

# add the user with the reload right
GRANT RELOAD on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxxxx'; 

# reload the rights
FLUSH PRIVILEGES;

# double check
select * from mysql.user;

Aktualizacja 2019

Ta odpowiedź może być nieaktualna - zapoznaj się z silnie wyrażonymi komentarzami poniżej.

Mark Chackerian
źródło
Jest to jedyna bezpieczna odpowiedź, na której udziela tylko wymaganych uprawnień debian-sys-maint. Mogę również potwierdzić, że działa jak urok. Twoje zdrowie!
Jealie
2
Czy to naprawdę dziura w zabezpieczeniach? Jeśli ktoś może już odczytać /etc/mysql/debian.cnf, to prawdopodobnie ma dostęp do konta root i może zrestartować mysql z --skip-grant-tables.
mc0e,
Dzięki. Ale nie ma potrzeby dwukrotnego opróżniania, MySQL już wie, co robi polecenie GRANT. Zobacz dev.mysql.com/doc/refman/5.6/en/privilege-changes.html
ygoe
1
I to nie zadziała, ponieważ debian-sys-maintużytkownik jest również używany do zamykania serwera. A także, aby sprawdzić użytkowników root podczas uruchamiania serwera mysql. Musisz przynajmniej nadać uprawnienia do wyboru w mysql. * I uprawnienia do wyłączania.
Anders
1
NIE NIE NIE, NIE postępuj zgodnie z radą zawartą w tej odpowiedzi - musisz udzielić wszystkich uprawnień debian-sys-maint z powodów przedstawionych w drugiej odpowiedzi zatytułowanej „wymagane uprawnienia debian-sys-maint”. Krótko mówiąc, możesz być w porządku z dnia na dzień, ale możesz napotkać poważne problemy po zastosowaniu aktualizacji zabezpieczeń, poprawki lub aktualizacji systemu.
Kurt Fitzner
3

Zamiast

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD('your password') WITH GRANT OPTION; FLUSH PRIVILEGES;

Myślę

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'your password' WITH GRANT OPTION; FLUSH PRIVILEGES;

ponieważ hasło nie jest mieszane ...?

Fortega
źródło
3

debian-sys-maint wymagane uprawnienia

Inne odpowiedzi w wystarczającym stopniu dotyczyły wszystkiego oprócz minimalnego zestawu uprawnień wymaganych dla użytkownika debian-sys-maint. Wiele odpowiedzi tutaj jest po prostu błędnych pod tym względem, a wręcz niebezpiecznych. Nie zmniejszaj uprawnień debian-sys-maint (w tym opcji grantu) bez przeczytania i zrozumienia poniżej:

Opiekun Debiana nie przyznał użytkownikowi wszystkich uprawnień kapryśnie. Oto, co jest wymagane, gdzie i dlaczego. Niektóre z tych przywilejów są nadzbiórami innych, ale wymienię je niezależnie, na wypadek gdybyś chciał dostosować rzeczy i usunąć wymaganie:

  • zamknięcie i ponowne załadowanie , co jest dość zaskakujące, do zamknięcia lub wykonania bazy danych, wykonane przez /etc/init.d/mysql
  • wybierz na mysql.user , wymagany do kontroli poprawności wykonywanej podczas uruchamiania bazy danych, upewniając się, że jest użytkownik root. Wykonaj każde uruchomienie przez / etc / mysql / debian-start (wywoływany przez /etc/init.d/mysql) z rzeczywistym kodem w funkcji check_root_accounts w pliku /usr/share/mysql/debian-start.inc.sh
  • wybierz w information_schema.tables , globalny wybór , wymagany do sprawdzania awarii tabel. Wykonano każde uruchomienie przez / etc / mysql / debian-start (wywoływany przez /etc/init.d/mysql) z rzeczywistym kodem w funkcji check_for_crashed_tables w pliku /usr/share/mysql/debian-start.inc.sh
  • globalne wszystkie uprawnienia , wymagane do aktualizacji tabel, jeśli / kiedy nowa wersja MySQL jest instalowana poprzez aktualizację lub aktualizację Debian. Wykonaj każde uruchomienie za pomocą / etc / mysql / debian-start (wywoływany przez /etc/init.d/mysql) z faktycznym kodem w funkcji upgrade_system_tables_if_equessary w pliku /usr/share/mysql/debian-start.inc.sh - faktycznie wywołuje binarną wersję MySQL mysql_upgrade - nie daj się zwieść nazwie funkcji (upgrade_system_tables_if_equ_ konieczny), to potencjalnie może dotknąć wszystkich tabel - patrz poniżej

Ten ostatni jest oczywiście głównym wymogiem dla przywilejów. Strona podręcznika mysql_upgrade stwierdza, że:

mysql_upgrade sprawdza wszystkie tabele we wszystkich bazach danych pod kątem niezgodności z bieżącą wersją serwera MySQL. mysql_upgrade aktualizuje również tabele systemowe, abyś mógł skorzystać z nowych uprawnień lub możliwości, które mogły zostać dodane.

Jeśli mysql_upgrade wykryje, że tabela może być niekompatybilna, wykonuje sprawdzenie tabeli i, jeśli zostaną znalezione problemy, próbuje naprawić tabelę.

OSTRZEŻENIE Jeśli zdecydujesz się ograniczyć uprawnienia, które ma debian-sys-maint, upewnij się, że jesteś przygotowany do ręcznej obsługi wszelkich przyszłych aktualizacji zabezpieczeń i / lub aktualizacji Debiana, które dotykają MySQL. Jeśli wykonasz aktualizację pakietów MySQL z ograniczonymi uprawnieniami debian-sys-maint, a jeśli mysql_upgrade nie będzie mógł zostać ukończony, może to spowodować pozostawienie bazy danych w nieokreślonym stanie (odczyt uszkodzony). Zmniejszenie uprawnień może nie powodować żadnych widocznych problemów z dnia na dzień, dopóki nie nadejdzie aktualizacja, więc nie przejmuj się faktem, że już zmniejszyłeś uprawnienia bez szkodliwych skutków jako podstawę do myślenia, że ​​jest to bezpieczne.

Kurt Fitzner
źródło
Dziękuję za wyszukaną odpowiedź. Trudno uwierzyć, że to pytanie ma prawie 10 lat!
Joe Holloway,
To powinna być jedna z pierwszych rzeczy, które ludzie czytają.
FKEinternet
2

Na marginesie tego, spójrz na ten post mysqlperformanceblog z powodów, dla których możesz chcieć wyłączyć rzeczy specyficzne dla Debiana.

Jon Topper
źródło
1
„Zauważ, że nie powinno to stanowić problemu dla MySQL z Debian Lenny, ponieważ jest on dostarczany ze skryptami init, które nie będą uruchamiały CHECK TABLE na tabelach innych niż MYISAM.” - z połączonej strony
d -_- b
2

Korzystając z MySQL 5.6+, zaleciłbym użycie mysql_config_editorpolecenia do utworzenia wpisu dla użytkownika 'debian-sys-maint'@'localhost'przy użyciu odpowiedniego hasła, co oznacza, że ​​hasło nie musi być przechowywane na serwerze w postaci zwykłego tekstu.

mysql_config_editor set --login-path=debian-sys-maint --host=localhost --user=debian-sys-maint --password

Następnie specyficzny dla Debiana plik konfiguracyjny /etc/mysql/debian.cnfmożna zmienić, aby nazwa użytkownika i hasło nie były zapisywane w pliku.

Na koniec zmień plik logrotate dla MySQL, aby używał danych logowania zapisanych w ~/.mylogin.cnfpliku zamiast pliku specyficznego dla Debiana, zastępując

/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf

z

/usr/bin/mysqladmin --login-path=debian-sys-maint

Mam nadzieję że to pomoże :)

Dave

Dave Rix
źródło
Ale czy cel debian-sys-maint użytkownika zostanie przez to osiągnięty? Że pakiety powinny mieć możliwość używania tego użytkownika / hasła do wykonywania niektórych czynności konserwacyjnych systemu jako rootużytkownik w domenie Linuksa (nie rootużytkownik w MySQL bez administratora, który musiałby wprowadzić roothasło do MySQL?
Anders
Działa to w moich testach, jeśli wykonasz wszystkie zmiany, takie jak zmiana w /etc/mysql/debian.cnfcelu usunięcia haseł i zmiany pliku logrotate w celu odniesienia do korzystania z zabezpieczonych danych. Nie jestem pewien, czy użytkownik debian-sys-maint jest używany do czegokolwiek innego, ale jeśli tak, to pomoże ci wskazać, gdzie Debian używa tego konta użytkownika w twoim imieniu.
Dave Rix,