Nie można usunąć anonimowego użytkownika z mysql.user

15

Próbuję usunąć anonimowych użytkowników z mojej bazy danych mysql.users. Jednak mam dziwne zachowanie. Kiedy wprowadzę polecenie:

DROP User ''@'WOPR';

Otrzymywałem ogólny komunikat o błędzie. Ponownie uruchomiłem komputer i spróbowałem ponownie. Tym razem dostałem odpowiedź

Query OK, 0 rows affected.

Ale kiedy włożyłem

SELECT User, Host, Password FROM mysql.user WHERE User='';

Zwrot wynosi:

+------+------+----------+
| User | Host | Password |
+------+------+----------+
|      | WOPR |          |
+------+------+----------+

(WOPR to moja nazwa hosta)

Wykonuję polecenie

DROP User ''@'WOPR';

i uzyskaj ten sam wynik.

Korzystam z nowej instalacji MySQL 5.5 na Arch Linux, jądro wersja 2.6.33.

Czy ktoś wie, co może powodować takie zachowanie?

SirTasty
źródło
Proszę o słowo, aby wysłać pytania tego rodzaju do DBA StackExchange !!!
RolandoMySQLDBA,

Odpowiedzi:

15
DELETE FROM mysql.user WHERE user='' AND host='WOPR';
FLUSH PRIVILEGES;

To powinno zrobić dla ciebie.

Spróbuj !!!

CAVEAT

MySQL ma pewnych użytkowników wstępnie zainstalowanych w mysql.user. Ponadto mysql.db ma dwóch użytkowników, którzy mają anonimowy dostęp i pełne uprawnienia do testowania baz danych.

Po prostu to zrób

SELECT * FROM mysql.db \G

a zobaczysz, że każdy, kto łączy się z testem lub dowolną bazą danych zaczynającą się od test_, może właściwie zrobić wszystko w testowej bazie danych. Jest to złe, ponieważ osoba z pełnym dostępem do dowolnej testowej bazy danych może zjeść dysk w ciągu kilku minut.

Przykład:

use test
CREATE TABLE junk (INT a) ENGINE=MyISAM;
INSERT INTO junk VALUES (1);

OK, wielka sprawa. To tworzy tabelę z 4 bajtami.

Teraz próbuję uruchomić tę instrukcję SQL 30 razy:

INSERT INTO junk SELECT * FROM junk;

Hej, natychmiastowy stół z 1,073,741,824 wierszami (4 GB + plik) !!! Obrazowanie z pełnymi prawami do testowej bazy danych, w której możesz siać spustoszenie na dysku.

Radzę, aby uruchomić to w celu wyczyszczenia dostępu użytkownika testowego:

DELETE FROM mysql.db WHERE db LIKE 'tes%' AND user='';
FLUSH PRIVILEGES;

Aby uzyskać dodatkowe wyjaśnienia, zobacz mój post MySQL: Dlaczego w mysql.db są wpisy „testowe”?

Twoje zdrowie !!!

RolandoMySQLDBA
źródło
Cześć Rolando, To załatwiło sprawę, dzięki! Naprawdę teraz naprawiam dostęp do mojej testowej bazy danych.
SirTasty,
Czy nie ma sposobu na użycie drop userskładni zamiast bezpośredniej modyfikacji podstawowej mysql.usertabeli?
Pacerier
1
@Pacerier Proszę spojrzeć na oryginalne pytanie. Prawdziwy problem polega na tym, że DROP USERskładnia nie działa, gdy pole użytkownika jest puste (pusty ciąg). Musisz to zrobić w sposób określony w odpowiedzi.
RolandoMySQLDBA
@RolandoMySQLDBA, czy istnieją inne rozwiązania oprócz hakowania przy mysql.userstole?
Pacerier
@Pacerier Jeśli przeczytasz mój ostatni link, zdasz sobie sprawę, że MySQL (obecnie Oracle) umieszcza dwa wiersze bezpośrednio mysql.dbpodczas instalacji, co pozwoli anonimowym użytkownikom na dostęp do testowej bazy danych. Co ciekawe, powiedziano mi, że instalacja serwera Percona usuwa te wiersze przed zakończeniem instalacji ( dba.stackexchange.com/questions/66584/... ). Ponieważ używasz MySQL, uruchom albo mysql_secure_installation lub usuń te dwa wiersze samodzielnie.
RolandoMySQLDBA