mysql的用户访问权限规划

时间:2022-09-11 08:54:07

看了mysql的关于用户权限和安全的管理,感觉看起来还是不太好理解,首先mysql的连接方式是需要核对三个要素:user、passwd、 host。而且这个user和passwd并不是o上面的user和passwd,这个仅仅只是连接到mysql server的一个用户名和密码,而后根据这个user、passwd、 host权限来访问相应的database。这个让接触了快两年o的同学还是很不习惯的。

Mysql登录方式,注意如果不写-h 主机则默认就是-h localhost的主机验证。
C:\Users\Administrator>mysql -h localhost -u xiaoyu -p
Enter password: ******

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| xiaoyu             |

Mysql的权限可以规划为global level,database level,table level,column level,routine level五种,每个level级别有相应的权限分类,不过生产环境中还是很少进行太细的权限划分,一般是针对database level级别的,单个应用例如tomcat weblogic有相应的用户连接到mysql的database,而root等管理员用户则拥有global level的all privileges。

例如可以用如下的方式授权用户
mysql> grant all on xiaoyu.* to xiaoyu_mysql@localhost identified by 'xiaoyu_mys
ql';
Query OK, 0 rows affected (0.00 sec)

此时就可以用如下的方式登录mysql server
C:\Users\Administrator>mysql -h localhost -u xiaoyu_mysql -p
Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 20

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
| xiaoyu             |
+--------------------+
看出此时用-h localhost -u xiaoyu_asm -p xiaoyu_asm可以连接到mysql server去操作xiaoyu database,而别的database则无法操作了。

那么如果新制定的用户不制定密码会如何了。
mysql> grant all on xiaoyu.* to xiaoyu@172.16.0.216;
ERROR 1133 (42000): Can't find any matching row in the user table
mysql> grant all on xiaoyu.* to xiaoyu@localhost;
ERROR 1133 (42000): Can't find any matching row in the user table
mysql> grant all on xiaoyu.* to xiaoyu;
ERROR 1133 (42000): Can't find any matching row in the user table
看出如果新创建的用户如果不指定密码无论是localhost主机,IP地址,还是%的通配符主机都无法创建成功,这个是因为如果不指定密码而mysql.user表中又没有此username和host的记录row,就会报出上面的1133错误。

而加上密码则可以正常授权了,这点需要注意了。
mysql> grant all on xiaoyu.* to xiaoyu@172.16.0.216 identified by 'xiaoyu';
Query OK, 0 rows affected (0.00 sec)

删除用户也要联合host一起删除。
mysql> drop user xiaoyu@172.16.0.216
-> ;
Query OK, 0 rows affected (0.00 sec)

如果不指定主机drop user默认用的是通配符的形式
mysql> grant all on xiaoyu.* to xiaoyu identified by 'xiaoyu';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for xiaoyu;
+-------------------------------------------------------------------------------
------------------------+
| Grants for xiaoyu@%
                        |
+-------------------------------------------------------------------------------
------------------------+
| GRANT USAGE ON *.* TO 'xiaoyu'@'%' IDENTIFIED BY PASSWORD '*2E8F2ECC253867BAF7
FB6E8A7B17CFE2EB3DA337' |
| GRANT ALL PRIVILEGES ON `xiaoyu`.* TO 'xiaoyu'@'%'

不指定主机删除user后,原来xiaoyu@%记录已经删除了,不指定IP或者主机删除用户删除的其实是user@%的用户,一般建议不要这个删除用户,最好带着主机名或者IP地址
mysql> drop user xiaoyu;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for xiaoyu;
ERROR 1141 (42000): There is no such grant defined for user 'xiaoyu' on host '%'

修改密码:
那么如何修改密码了,其实mysql的用户 密码 主机登录三要素都存储在mysql.user和mysql.db等五个表中,而上面的授权grant和revoke也只是操作mysql下的这五张表而已。

例如如果我们要修改xiaoyu@172.16.0.216 的密码为mysql
直接修改mysql.user的表中的记录:
mysql> update mysql.user set password=PASSWORD('mysql') where user='xiaoyu' and
host='172.16.0.216';
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
刷新权限表到内存中,而后就可以用新的密码登录了,当然xiaoyu@172.16.0.216 以前的密码也就作废了。
C:\Users\Administrator>mysql -h 172.16.0.216 -u xiaoyu -pmysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 5.5.25 MySQL Community Server (GPL)

用grant/revoke语句去修改密码:
mysql> grant all on xiaoyu.* to xiaoyu@172.16.0.216 identified by 'xiaoyu';
Query OK, 0 rows affected (0.00 sec)

C:\Users\Administrator>mysql -h 172.16.0.216 -u xiaoyu -pxiaoyu
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 5.5.25 MySQL Community Server (GPL)

数据库系统安全:
作为一个数据库是供应用访问和数据存储的,那么相应的数据库的安全措施则是非常重要的,相应的mysql数据库可以用如下三个方面去构造安全的mysql数据库系统。

1 网络: 封闭外界网络连接,这个也就基本杜绝外来连接造成的安全威胁,不过数据库大多是作为应用访问和数据存储的,通信一般是必须的,可以部署应用在mysql server本机直连mysql 数据库,当然这个要看系统的归档,需要提供网络访问的可以让mysql server在一个规定的局域网来提供访问,即使提供外网访问的也要控制相应的主机来源,这个在数据库级别也可以控制。

2 主机:减少主机不必要的服务,关闭不必要的端口,还要限制登录主机的用户的权限,对mysqld的数据文件和日志文件权限规划要尽量严格,避免外来用户侵入通过数据文件日志文件恢复。

3 数据库:严格控制来源主机和用户权限,主要是来源主机需要严格控制,尽量不要出现通配符的来访主机访问mysql server。

 

http://www.dbaxiaoyu.com/archives/577