数据库的安全的重要性就不需要我来赘述了。除了做好安全备份外,我们首先要做的是做好我们数据库的权限控制,尽量保护我们的数据库不被******。
本文主要讲的是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 |
+---------------------------+
mysql数据库中几个重要的表
columns_priv表 记录授权用户对表中字段的访问权限
db 表记录用户服务器上库的访问权限
tables_priv 表 记录授权用户对库中表的访问权限
user 记录有哪些授权用户
user 表中的字段
user 是用户名 root是mysql的管理员用户
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服务
下面提供一些示例
1、修改数据库管理员从本机登录的密码为123456
数据库管理员使用新密码从本机连接数据库服务器
mysqladmin -uroot -p654321 password123456;
2、查看当前登陆数据库服务器的用户是谁?
mysql> select user();
3、查看当前登陆数据库服务器用户的权限?
mysql> show grants for root@localhost;
4、查看当前数据库服务器有哪些授权用户?
mysql> select user,host from mysql.user;
5、授权管理员用户可以在网络中的192.168.4.254主机登录,对所有库和表有完全权限且有授权的权限;登陆密码abc123
mysql> grant all on *.* to root@'192.168.4.254' identified by 'abc123' with grant option;
6、不允许数据库管理员在数据库服务器本机登录。(在做此操作之前一定要添加一个可以远程管理的用户,否则你就进不了mysql服务器了)
drop user root@"localhost";
7、授权userweb用户可以从网络中的任意主机访问数据库服务器,对db3库下的user表有查看、更新name字段和age字段的权限 , 登录密码userweb888。
grant select,update(name,age) on db3.user to userweb@'%' identified by 'userweb888'
8、验证以上授权是否成功
#mysql -h192.168.4.51 -uuserweb -puserweb888
mysql> 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: 0
mysql> delete from db3.user where name="xx";
ERROR 1142 (42000): DELETE command denied to user 'userweb'@'192.168.4.254' for table 'user'
9、userweb修改自己的登陆密码为123456,并验证能否使用新密码登陆
mysql> set password=password("123456");
Query OK, 0 rows affected, 1 warning (0.00 sec)
#mysql -h192.168.4.51 -uuserweb -p123456
10、 数据库管理员修改授权用户userweb的登录密码为654321,让授权用户userweb 使用新密码登陆数据库服务器。
set password for userweb@"%"=password("654321");
11、撤销授权用户userweb 的所有授权并 使其不再能使用此用户连接数据库服务器。
mysql> drop user user@"%";
12、授权webadmin用户可以从网络中的所有主机登录,对bbsdb库拥有完全权限,且有授权权限,登录密码为 123456
mysql> 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)
13、在客户端使用授权用户webadmin登录,把自己的权限授权给userone用户 , 登录密码是 123456
# mysql -h192.168.4.51 -uwebadmin -p123456
mysql> grant all on bbsdb.* to userone@"%" identified by "123456" with grant option;
15、撤销webadmin用户的授权权限。mysql> revoke grant option on bbsdb.* from webadmin@"%";
Query OK, 0 rows affected (0.00 sec)