数据库的安全的重要性就不须要我来赘述了。除了作好安全备份外,咱们首先要作的是作好咱们数据库的权限控制,尽可能保护咱们的数据库不被******。
本文主要讲的是mysql数据库的权限管理 ,在当前网络环境中互联网公司中的关系型数据库大多采用的是mysql。
首先说一下mysql数据库管理权限的数据库是mysql库 咱们看一下mysql库中都有哪些表
mysql
mysql> show tables from mysql; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | engine_cost | | event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
web
mysql数据库中几个重要的表sql
columns_priv表 记录受权用户对表中字段的访问权限数据库
db 表记录用户服务器上库的访问权限缓存
tables_priv 表 记录受权用户对库中表的访问权限安全
user 记录有哪些受权用户服务器
user 表中的字段网络
user 是用户名 root是mysql的管理员用户ide
host 是容许该用户从哪一个客户端访问mysql服务器 能够是ip地址 主机名 网段(主机位用%代替) 除本机外的全部网络地址使用%函数
Select_priv。肯定用户是否能够经过SELECT命令选择数据。
Insert_priv。肯定用户是否能够经过INSERT命令插入数据。
Update_priv。肯定用户是否能够经过UPDATE命令修改现有数据。
Delete_priv。肯定用户是否能够经过DELETE命令删除现有数据。
Create_priv。肯定用户是否能够建立新的数据库和表。
Drop_priv。肯定用户是否能够删除现有数据库和表。
Reload_priv。肯定用户是否能够执行刷新和从新加载MySQL所用各类内部缓存的特定命令,包括日志、权限、主机、查询和表。
Shutdown_priv。肯定用户是否能够关闭MySQL服务器。在将此权限提供给root帐户以外的任何用户时,都应当很是谨慎。
Process_priv。肯定用户是否能够经过SHOW PROCESSLIST命令查看其余用户的进程。
File_priv。肯定用户是否能够执行SELECT INTO OUTFILE和LOAD DATA INFILE命令。
Grant_priv。肯定用户是否能够将已经授予给该用户本身的权限再授予其余用户。例如,若是用户能够插入、选择和删除foo数据库中的信息,而且授予了GRANT权限,则该用户就能够将其任何或所有权限授予系统中的任何其余用户。
References_priv。目前只是某些将来功能的占位符;如今没有做用。
Index_priv。肯定用户是否能够建立和删除表索引。
Alter_priv。肯定用户是否能够重命名和修改表结构。
Show_db_priv。肯定用户是否能够查看服务器上全部数据库的名字,包括用户拥有足够访问权限的数据库。能够考虑对全部用户禁用这个权限,除非有特别不可抗拒的缘由。
Super_priv。肯定用户是否能够执行某些强大的管理功能,例如经过KILL命令删除用户进程,使用SET
GLOBAL修改全局MySQL变量,执行关于复制和日志的各类命令。
Create_tmp_table_priv。肯定用户是否能够建立临时表。
Lock_tables_priv。肯定用户是否可使用LOCK TABLES命令阻止对表的访问/修改。
Execute_priv。肯定用户是否能够执行存储过程。此权限只在MySQL 5.0及更高版本中有意义。
Repl_slave_priv。肯定用户是否能够读取用于维护复制数据库环境的二进制日志文件。此用户位于主系统中,有利于主机和客户机之间的通讯。
Repl_client_priv。肯定用户是否能够肯定复制从服务器和主服务器的位置。
Create_view_priv。肯定用户是否能够建立视图。此权限只在MySQL 5.0及更高版本中有意义。关于视图的更多信息,参见第34章。
Show_view_priv。肯定用户是否能够查看视图或了解视图如何执行。此权限只在MySQL 5.0及更高版本中有意义。关于视图的更多信息,参见第34章。
Create_routine_priv。肯定用户是否能够更改或放弃存储过程和函数。此权限是在MySQL 5.0中引入的。
Alter_routine_priv。肯定用户是否能够修改或删除存储函数及函数。此权限是在MySQL 5.0中引入的。
Create_user_priv。肯定用户是否能够执行CREATE USER命令,这个命令用于建立新的MySQL帐户。
Event_priv。肯定用户可否建立、修改和删除事件。这个权限是MySQL 5.1.6新增的。
Trigger_priv。肯定用户可否建立和删除触发器,这个权限是MySQL 5.1.6新增的。
通常咱们在程序中使用的权限都是设置的刚刚够用就行,不要设置太高的权限从而给数据库带来一些安全隐患;
mysql数据库默认root管理员用户只能在本机登录为了方便管理咱们将咱们添加一个root用户在管理机的地址,有全部权限,才能远程管理mysql数据库
在本机用root用户登录mysql
mysql -hlocalhost -uroot -p管理员密码
若是是新安装的mysql数据库服务器(以5.7版本为例) 默认的root密码是安装时随即生成的能够在日志文件中找到 root@localhost:后面是随机密码大部分随机密码有特殊符号因此登录的时候密码要用单引号引发来
[root@A5 ~]# grep 'password' /var/log/mysqld.log
2018-02-23T00:42:30.776575Z 1 [Note] A temporary password is generated for root@localhost: aRaOssg_*774
登录进入mysql后
mysql> grant all on *.* to root@'远程管理的客户端ip' identified by '远程管理的密码' with grant option; #with grant option 是给新加的root用户受权权限
这样就能够在你指定的管理机上登录mysql服务器了
grant 权限列表 on 库名.表名 to "用户名"@"客户端地址" identified by “密码” with grant option; 新受权的权限在指定的客户端上也能够受权 with grant option
客户端地址能够是指定ip
指定网段主机位用%表示 192.168.4.%
因此ip用%
权限 all 全部权限
库和表能够用*来表示全部的意思
查看数据库服务器上已经有的受权的用户及权限
select user,host from mysql.user;
show garts for "用户名"@“客户端地址”;
显示当前登录的用户
select user();
显示当前主机名
select @@hostname;
查看登录用户的访问权限
show grants;
权限撤销
revoke 权限列表 on 库名.表名 from "用户名"@"客户端地址"
删除受权用户
drop user "用户名"@"客户端地址"; 删除受权用户后该用户的权限也会所有被删除
修改受权用户的登录密码
set password for "用户名"@"客户端地址"=password("新密码")
受权用户重置本身的用户密码
set password=password("新密码");
若是说你要给某一个库据具备全部权限包含能够受权的权限
你须要添加该用户在mysql数据库中的全部表具备插入权限 (若是没有mysql的插入权限,授予该用户的with grant option 也没法给其余用户受权) 而且该用户能给其余用户受权的权限不能大于自己具备的权限
恢复数据库管理员本机管理密码(忘记的root用户的管理密码的请况下在mysql服务器操做系统上)
1.修改配置文件 /etc/my.cnf 文件
在[mysqld] 下面
添加跳过受权表的参数(若是有验证策略的参数设置须要先注释已经添加过的验证策略参数)skip-grant-tables
2.重启mysql 服务
3.无密码进入mysql
4.修改mysql root用户密码
update mysql.user set authentication_string=password("新密码") where user=“root” host=“localhost”;
5.退出,修改回原来的mysql配置
6.重启mysqld服务
下面提供一些示例
一、修改数据库管理员从本机登陆的密码为123456 数据库管理员使用新密码从本机链接数据库服务器mysqladmin -uroot -p654321 password123456; 二、查看当前登录数据库服务器的用户是谁?mysql> select user();三、查看当前登录数据库服务器用户的权限?mysql> show grants for root@localhost;四、查看当前数据库服务器有哪些受权用户?mysql> select user,host from mysql.user;五、受权管理员用户能够在网络中的192.168.4.254主机登陆,对全部库和表有彻底权限且有受权的权限;登录密码abc123mysql> grant all on *.* to root@'192.168.4.254' identified by 'abc123' with grant option;六、不容许数据库管理员在数据库服务器本机登陆。(在作此操做以前必定要添加一个能够远程管理的用户,不然你就进不了mysql服务器了)drop user root@"localhost"; 七、受权userweb用户能够从网络中的任意主机访问数据库服务器,对db3库下的user表有查看、更新name字段和age字段的权限 , 登陆密码userweb888。grant select,update(name,age) on db3.user to userweb@'%' identified by 'userweb888'八、验证以上受权是否成功#mysql -h192.168.4.51 -uuserweb -puserweb888mysql> select * from db3.user;mysql> update db3.user set name="xx",age=20 where name="ss";Query OK, 2 rows affected (0.00 sec)Rows matched: 2 Changed: 2 Warnings: 0mysql> delete from db3.user where name="xx";ERROR 1142 (42000): DELETE command denied to user 'userweb'@'192.168.4.254' for table 'user'九、userweb修改本身的登录密码为123456,并验证可否使用新密码登录mysql> set password=password("123456");Query OK, 0 rows affected, 1 warning (0.00 sec)#mysql -h192.168.4.51 -uuserweb -p123456 十、 数据库管理员修改受权用户userweb的登陆密码为654321,让受权用户userweb 使用新密码登录数据库服务器。set password for userweb@"%"=password("654321");十一、撤销受权用户userweb 的全部受权并 使其再也不能使用此用户链接数据库服务器。mysql> drop user user@"%";十二、受权webadmin用户能够从网络中的全部主机登陆,对bbsdb库拥有彻底权限,且有受权权限,登陆密码为 123456mysql> grant all on bbsdb.* to webadmin@'%' identified by '123456' with grant option;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> grant insert on mysql.* to webadmin@"%" ;Query OK, 0 rows affected (0.00 sec)1三、在客户端使用受权用户webadmin登陆,把本身的权限受权给userone用户 , 登陆密码是 123456# mysql -h192.168.4.51 -uwebadmin -p123456mysql> grant all on bbsdb.* to userone@"%" identified by "123456" with grant option;1五、撤销webadmin用户的受权权限。mysql> revoke grant option on bbsdb.* from webadmin@"%";Query OK, 0 rows affected (0.00 sec)