MySql: przyznać opcje tylko do odczytu?

102

Mam użytkownika, któremu chcę udzielić wszystkich uprawnień do odczytu w schemacie bazy danych.

Oto jeden sposób:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

Czy istnieje sposób na pogrupowanie wszystkich operacji odczytu w grant?

Ajeet Ganga
źródło
To uprawnienie SHOW VIEWnie jest SHOW_VIEW, ale nie musisz nadawać tego użytkownikowi, chyba że chcesz, aby mógł SHOW CREATE VIEWon mieć dostęp do widoków ... może wybierać spośród widoków z jedynym SELECTuprawnieniem. Co rozumiesz przez „zgrupuj wszystkie operacje odczytu w przyznaniu”?
Michael - sqlbot
Jeśli istnieje jedno uprawnienie, które oznacza wszystkie operacje odczytu w bazie danych. Rozumiem, że zapewniają precyzyjny dostęp, ale wygodna abstrakcja na wysokim poziomie pomogłaby nam.
Ajeet Ganga

Odpowiedzi:

165

Jeśli istnieje jedno uprawnienie, które oznacza wszystkie operacje odczytu w bazie danych.

To zależy od tego, jak zdefiniujesz „wszystko przeczytane”.

„Czytanie” z tabel i widoków to SELECTprzywilej. Jeśli to właśnie masz na myśli, mówiąc „wszystko przeczytane”, to tak:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

Jednak brzmi to tak, jakbyś miał na myśli zdolność „widzenia” wszystkiego, „patrzenia, ale nie dotykania”. Oto inne rodzaje czytania, które przychodzą mi do głowy:

„Czytanie” definicji poglądów jest SHOW VIEWprzywilejem.

PROCESSPrzywilejem jest „czytanie” listy aktualnie wykonywanych zapytań przez innych użytkowników .

REPLICATION CLIENTPrzywilejem jest „Odczytywanie” bieżącego stanu replikacji .

Zwróć uwagę, że niektóre lub wszystkie z nich mogą ujawnić więcej informacji niż zamierzasz ujawnić, w zależności od charakteru danego użytkownika.

Jeśli chcesz tego dokonać, możesz połączyć dowolne z tych (lub inne dostępne uprawnienia ) w jednej GRANTinstrukcji.

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

Jednak nie ma jednego przywileju, który przyznaje podzbiór innych uprawnień, a to brzmi tak, jakbyś o to prosił.

Jeśli robisz rzeczy ręcznie i szukasz łatwiejszego sposobu, aby to zrobić, bez konieczności pamiętania dokładnego dotacji, którą zwykle udzielasz dla określonej klasy użytkowników, możesz sprawdzić instrukcję, aby ponownie wygenerować dotacje dla porównywalnego użytkownika i zmienić ją aby utworzyć nowego użytkownika z podobnymi uprawnieniami:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Zmiana „not_leet” i „localhost” w celu dopasowania do nowego użytkownika, którego chcesz dodać, wraz z hasłem, spowoduje utworzenie GRANTinstrukcji wielokrotnego użytku w celu utworzenia nowego użytkownika.

Jeśli chcesz, aby pojedyncza operacja skonfigurowała i przyznała ograniczony zestaw uprawnień użytkownikom, a może usunąć wszelkie niezasłużone uprawnienia, możesz to zrobić, tworząc procedurę składowaną, która zawiera wszystko, co chcesz zrobić. W treści procedury budowałbyś GRANTinstrukcję z dynamicznym SQL i / lub bezpośrednio manipulowałbyś tabelami grantów.

W ostatnim pytaniu dotyczącym administratorów baz danych , plakat chciał mieć możliwość modyfikowania innych użytkowników przez nieuprzywilejowanego użytkownika, co oczywiście nie jest czymś, co normalnie można zrobić - użytkownik, który może modyfikować innych użytkowników, jest, prawie z definicji, nie nieuprzywilejowany użytkownik - jednak - procedury składowane stanowiły dobre rozwiązanie w tym przypadku, ponieważ działają w kontekście bezpieczeństwa ich DEFINERużytkownika, umożliwiając każdemu, kto ma EXECUTEuprawnienia do procedury, tymczasowe przyjęcie eskalowanych uprawnień, aby umożliwić im wykonywanie określonych czynności procedura zakończona.

Michael - sqlbot
źródło
2
Dzięki. Oprócz świetnej odpowiedzi spodobało mi się również Twoje hasło. :)
Ajeet Ganga
2
Warto zauważyć: KLIENT PROCESOWY i KLIENT REPLIKACJI są „globalnymi” typami uprawnień, więc składnia nie powiedzie się, gdy zostanie zdefiniowana z wykluczeniem „na bazę danych”. GRANT PROCESS ON mydb. * Byłoby nieprawidłowe, ale GRANT PROCESS ON *. * Byłoby OK.
Bee Kay
GRANT SELECT ON db_name. * TO 'demo' @ '%' Z opcją GRANT;
Musa
17
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Spowoduje to utworzenie użytkownika z SELECTuprawnieniami do całej bazy danych, w tym widoków.

Mahesh Patil
źródło
12

Różne uprawnienia, które możesz przyznać użytkownikowi to

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

Aby nadać konkretnemu użytkownikowi uprawnienia, możesz użyć tej struktury:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

Uważam, że ten artykuł jest bardzo pomocny

ath j
źródło
3

Przewodnik krok po kroku, który znalazłem tutaj .

Aby utworzyć konto użytkownika bazy danych tylko do odczytu dla MySQL

W wierszu poleceń systemu UNIX uruchom program wiersza poleceń MySQL i zaloguj się jako administrator, wpisując następujące polecenie:

mysql -u root -p

Wpisz hasło do konta root. W wierszu polecenia mysql wykonaj jedną z następujących czynności:

Aby dać użytkownikowi dostęp do bazy danych z dowolnego hosta, wpisz następujące polecenie:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

Jeśli kolektor zostanie zainstalowany na tym samym hoście co baza danych, wpisz następujące polecenie:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

To polecenie zapewnia użytkownikowi dostęp tylko do odczytu do bazy danych z lokalnego hosta. Jeśli znasz nazwę hosta lub adres IP hosta, na którym zostanie zainstalowany moduł zbierający, wpisz następujące polecenie:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

Nazwa hosta musi być rozpoznawalna przez DNS lub przez lokalny plik hostów. W wierszu polecenia mysql wpisz następujące polecenie:

flush privileges;

Wpisz quit.

Poniżej znajduje się lista przykładowych poleceń i komunikatów potwierdzających:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
biniam
źródło
3

Nawet użytkownik dostał odpowiedź, a @Michael - sqlbot bardzo dobrze opisał większość punktów w swoim poście, ale brakuje jednego punktu, więc po prostu próbuję go opisać.

Jeśli chcesz przyznać uprawnienia do odczytu prostemu użytkownikowi (nie w rodzaju administratora) -

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

Uwaga: tutaj wymagane jest wykonanie EXECUTE, aby użytkownik mógł odczytać dane, jeśli istnieje procedura składowana, która generuje raport (ma kilka instrukcji wyboru).

Zastąp localhost konkretnym adresem IP, z którego użytkownik będzie łączył się z DB.

Dodatkowe uprawnienia do odczytu to:

  • POKAŻ WIDOK: Jeśli chcesz pokazać schemat widoku.
  • KLIENT REPLIKACJI: Jeśli użytkownik musi sprawdzić status replikacji / slave. Ale trzeba dać pozwolenie na wszystkie DB.
  • PROCES: Jeśli użytkownik chce sprawdzić działający proces. Działa tylko ze wszystkimi DB.
Zafar Malik
źródło
1

Uwaga dotycząca MySQL 8 jest inna

Musisz to zrobić w dwóch krokach:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
Daniel Patrick
źródło
To jedyne rozwiązanie, które u mnie zadziałało. Wygląda na to, że inne rozwiązania są przestarzałe, jak powiedziałeś. Dziękujemy za udostępnienie tego zaktualizowanego rozwiązania.
Kyle Bridenstine
0

Jeśli chcesz, aby widok był tylko do odczytu po udzieleniu uprawnień do odczytu, możesz użyć ALGORITHM = TEMPTABLE w definicji DDL widoku.

Daniel Fisher
źródło