Grant privileges on database names matching a pattern - mysql

I want to create a mysql user who can only access databases which have names starting with netdata_. I use the following statement to create such user:
GRANT ALL PRIVILEGES ON `netdata_*`.* TO netdata#"%" IDENTIFIED BY "My_Top_Secret";
However, with this user netdata, I can see nothing other than the information_schema. So is there anything wrong in my grant statement? Thanks.

Related

New user has all privileges in MySQL 5.6

I have a problem when I create a new user in mySQL 5.6
What I want:
When I create the new user, it doesn't have any privileges, and I just want to grant some select and update in a few specific columns. So he should be able to update just anything at all the DB. Sounds fair.
So, first, I create a new user:
CREATE USER 'newuser'#'%' IDENTIFIED BY 'password';
After this, I log in with my new user and when I do a show grants; command I have this:
GRANT USAGE ON *.* TO 'newuser'#'%' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'
So in my theory he cant do anything in my database bacause he doesn't have any GRANT SELECT privilege.
But when I do a select in my test table he can view all columns and all results. He can update ... and do everything he wants to. It's like he have a GRANT SELECT,UPDATE,DELETE ... ON *.* TO 'newuser'#'%' but I can't revoke that because he doesn't have that.
Of course, I've tried to revoke all privileges, but I can't because he doesn't have any privileges.
I hope i'm clear. So I'm confused, any ideas?
Thanks!
Clément
In many default installations, all users have all privileges on tables within any database called test or beginning with test_.
From http://dev.mysql.com/doc/refman/5.6/en/default-privileges.html#idp5999952 :
By default, the mysql.db table contains rows that permit access by any user to the test database and other databases with names that start with test_. ...If you want to remove any-user access to test databases, do so as follows:
mysql> DELETE FROM mysql.db WHERE Db LIKE 'test%';
mysql> FLUSH PRIVILEGES;
Alternatively, make sure that your test table isn't in a database with such a name, and then you'll see the true behaviour.

Revoke privileges from user in mySQL

For every new user we create in mySQL using the statement
CREATE USER newuser#localhost IDENTIFIED BY 'password';
"SHOW GRANTS" is showing only "USAGE ON *.* " privilege.
But the user is able to select,insert,.. on "test" and "information_schema" databases and I'm unable to revoke these privileges on "test" using the revoke statement given below.
REVOKE ALL ON test.* FROM newuser#localhost;
ERROR 1141 (42000) : There is no such grant defined for user 'guest' on host 'localhost'
I just don't want the newuser to access the test and information_schema databases.
http://dev.mysql.com/doc/refman/5.6/en/default-privileges.html
By default, the mysql.db table contains rows that permit access by
any user to the test database and other databases with names that
start with test_. (...) This means that
such databases can be used even by accounts that otherwise possess no
privileges. If you want to remove any-user access to test databases,
do so as follows:
mysql> DELETE FROM mysql.db WHERE Db LIKE 'test%';
mysql> FLUSH PRIVILEGES;
(...)
With the preceding change, only users who have global database
privileges or privileges granted explicitly for the test database can
use it.
The information_schema database is a read-only pseudo database built on-the-fly on request. Users will always be able to consult this database, but it only presents entries to which they already have access to otherwise.

Mysql super user can't create databases and only sees information_schema table

This is a recurring problem for some reason...
Using mysql 5.5, I am simply trying to create a user that can connect to the database remotely, have access to all databases, and create databases.
I have created a user using:
create user 'dev'#'%' identified by 'abcdefg';
then granted all permissions using:
GRANT ALL ON *.* to 'dev'#'192.168.%' IDENTIFIED BY 'abcdefg' WITH GRANT OPTION;
and the result is that the user cannot create databases, and can only see information_schema database for some reason.
Databases
Create database: Documentation
No Privileges
Database Ascending
information_schema
Total: 1
Does anyone know why this might be happening?
after you create user and grant it permissions, you need to flush privileges(when you are logged in with root user)
FLUSH PRIVILEGES;

MySql grant user permission

I want to create a new user in MySql. I do not want that new user to do much with my existing databases [I just want to grant Select privilege to him], but he can do anything and everything with a new database which he creates.
Firstly, is there a way to grant permission as per the database owner? If it is possible, then that is the ideal thing I am looking for. And if not, then how do I restrict a particular user from accessing [only Select privilege] some specific database only, allowing him to do anything he wants with the remaining ones?
From the MySQL grant documentation:
CREATE USER 'jeffrey'#'localhost' IDENTIFIED BY 'mypass';
GRANT SELECT ON *.* TO 'jeffrey'#'localhost';
GRANT ALL ON db1.* TO 'jeffrey'#'localhost';
The first command creates the user. The second grants select on all databases and tables. The third command grants all access to all tables in db1.
Is there anything else specific you are looking to do?
To provide a specific user with a permission, you can use this framework:
GRANT [type of permission] ON [database name].[table name] TO ‘[username]’#'localhost’;
GRANT ALL PRIVILEGES ON * . * TO 'newuser'#'localhost';
The asterisks in this command refer to the database and table (respectively) that they can access—this specific command allows to the user to read, edit, execute and perform all tasks across all the databases and tables.
Once you have finalized the permissions that you want to set up for your new users, always be sure to reload all the privileges.
FLUSH PRIVILEGES;
For more about permission you can read this article
https://www.digitalocean.com/community/articles/how-to-create-a-new-user-and-grant-permissions-in-mysql
For the list of permissions, see the MySQL Manual page Privileges Provided by MySQL.
Open mysql command prompt.
To create a new user when host is localhost then use this command
CREATE user 'test_user'#'localhost' identified by 'some_password';
for any host use %, like this
CREATE user 'test_user'#'%' identified by 'some_password';
Once the user is created, you need to Grant some access. Use following command for this.
GRANT SELECT,INSERT,UPDATE
ON database_name.table_name
TO 'test_user'#'localhost';
After successful execution of above query, test_user can select, insert and update in table_name (name of table) of database_name (name of database).
grant privilege is given in data base like this
grant privilege on object to user
object is any data base table or relation and user might be the whom the privilege is provided to him.
Example
grant select,insert,update,on object name to user name
grant select on employee to john with grant option;
revoke delete on employee from john.

Let MySQL users create databases, but allow access to only their own databases

I want to have multiple a MySQL users to be able to issue commands like
CREATE DATABASE dbTest;
But I also want each of these users to be able to see and access only their own databases.
All I could find was how to either create the databases by a DBA and grant the privileges on this database to the specific user:
GRANT ALL PRIVILEGES ON dbTest.* TO 'user';
or grant privileges on all databases to a user:
GRANT ALL PRIVILEGES ON *.* TO 'user';
But neither is what I want, because it needs to scale and be secure.
You can use
GRANT ALL PRIVILEGES ON `testuser\_%` . * TO 'testuser'#'%';
to grant the user testuser privileges on all databases with names beginning with testuser_.
This allows the testuser to create databases limited to names starting with testuser_
You can use
GRANT ALL PRIVILEGES ON `testuser_%` . * TO 'testuser'#'%';
to grant the user testuser privileges on all databases with names beginning with testuser_.
EDIT: I'm not sure if this user is now also allowed to create databases.
Yes, this allows the testuser to create databases limited to names starting with testuser_
Create a stored procedure that is defined by the admin user and invokes with the admin user privileges by using SQL SECURITY DEFINER. In the stored procedure,
Create the database.
Set the privileges on the database so only the current user has access.
Execute FLUSH PRIVILEGES to reload the privileges from the grant tables.
Use USER() to get the current user login details.
Find out more about SQL SECURITY DEFINER.
It is impossible to do this using permissions only .
The workaround as suggested in another answer:
GRANT ALL PRIVILEGES ONtestuser_%. * TO 'testuser'#'%';
has the problem that the users must then be very careful in naming their databases.
For example if user aaa creates database bbb_xyz, it can then be accessed exclusively by user bbb but not by user aaa.