一、用户管理
1、查看用户信息
mysql> select host,user from user;
user表中host列的值的意义
% 匹配所有主机
localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问;
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
2、创建用户
identified by会将纯文本密码加密作为散列值存储
mysql> create user ceshi identified by '123456';
Query OK, 0 rows affected (0.01 sec)
3、修改用户名称
mysql 5之后可以使用rename,之前需要使用update更新user表
mysql> rename user ceshi to ceshi2;
Query OK, 0 rows affected (0.01 sec)
4、修改用户密码
mysql> set password for ceshi2 = password('456789');
Query OK, 0 rows affected, 1 warning (0.01 sec)
5、删除用户
mysql>drop user ceshi2; //mysql5之前删除用户时必须先使用revoke 删除用户权限,然后删除用户,mysql5之后drop 命令可以删除用户的同时删除用户的相关权限
二、权限管理
mysql> show grants for ceshi;
+-----------------------------------+
| Grants for ceshi@% |
+-----------------------------------+
| GRANT USAGE ON *.* TO 'ceshi'@'%' |
+-----------------------------------+
1 row in set (0.00 sec)
注意:
在数据库定义了一个新的开发者时候
mysql> create user developer@'192.168.10.%' identified by '123456';
查看developer的权限时候的命令应该是
mysql> show grants for developer@'192.168.10.%';
2、赋予权限
使用多个权限同时赋予和回收,权限之间使用逗号分隔
mysql> grant select on homestead.* to ceshi;
Query OK, 0 rows affected (0.00 sec)
mysql> grant select,update on homestead.* to ceshi;
Query OK, 0 rows affected (0.00 sec)
3、收回权限
使用多个权限同时赋予和回收,权限之间使用逗号分隔
mysql> revoke select on homestead.* from ceshi;//如果权限不存在会报错
Query OK, 0 rows affected (0.00 sec)
设置权限时必须给出以下信息
1,要授予的权限
2,被授予访问权限的数据库或表
3,用户名
grant和revoke可以在几个层次上控制访问权限
1,整个服务器,使用 grant ALL和revoke ALL
2,整个数据库,使用on database.*
3,特点表,使用on database.table
4,特定的列
5,特定的存储过程
三、部分命令示例
grant普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
grant select, insert, update, delete on testdb.* to common_user@’%’
grant select,insert, update, delete on homestead.* to developer@'192.168.10.%';
grant数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。
grant创建、修改、删除 MySQL数据表结构权限。
grant create,alter,drop on homestead.* to developer@'192.168.10.%';
grant操作 MySQL外键权限。
grant references on homestead.* to developer@'192.168.10.%';
grant操作 MySQL视图、查看视图源代码 权限。
grant show view,create view on homestead.* to developer@'192.168.10.%';
grant操作 MySQL存储过程、函数 权限。
grant create routine,alter routine on homestead.* to developer@'192.168.10.%';
grant普通 DBA管理某个 MySQL数据库的权限。
grant all privileges on homestead to dba@'localhost'; //其中,关键字 “privileges” 可以省略。
grant高级 DBA管理 MySQL中所有数据库的权限。
grant all on *.* to dba@`localhost`;
注意:修改完权限以后 一定要刷新服务,或者重启服务,刷新服务用:flush privileges;
mysql> show privileges;//查看系统的权限
三、mysql安全配置方案
1、限制访问mysql端口的ip
windows可以通过windows防火墙或者ipsec来限制,linux下可以通过iptables来限制。
2、修改mysql的端口
windows下可以修改配置文件my.ini来实现,linux可以修改配置文件my.cnf来实现。
3、对所有用户设置强密码并严格指定对应账号的访问ip
mysql中可在user表中指定用户的访问可访问ip
4、 root特权账号的处理
建议给root账号设置强密码,并指定只容许本地登录
5、日志的处理
如需要可开启查询日志,查询日志会记录登录和查询语句。
6、 mysql进程运行账号
在windows下禁止使用local system来运行mysql账户,可以考虑使用network service或者自己新建一个账号,但是必须给与mysql程序所在目录的读取权限和data目录的读取和写入权限; 在linux下,新建一个mysql账号,并在安装的时候就指定mysql以mysql账户来运行,给与程序所在目录的读取权限,data所在目录的读取 和写入权限。
7、 mysql运行账号的磁盘权限
1)mysql运行账号需要给予程序所在目录的读取权限,以及data目录的读取和写入权限
2)不容许给予其他目录的写入和执行权限,特别是有网站的。
3)取消mysql运行账户对于cmd,sh等一些程序的执行权限。
8、网站使用的mysql账户的处理
新建一个账户,给予账户在所使用数据库的所有权限即可。这样既能保证网站对所对应的数据库的全部操作,也能保证账户不会因为权限过高而影响安全。给予单个 数据库的所有权限的账户不会拥有super, process, file等管理权限的。 当然,如果能很明确是的知道,我的网站需要哪些权限,还是不要多给权限,因为很多时候发布者并不知道网站需要哪些权限,我才建议上面的配置。而且我指的通 用的,具体到只有几台机器,不多的情况下,我个人建议还是给予只需要的权限,具体可参考上面的表格的建议。
9、删除无用数据库
test数据库对新建的账户默认有权限
四、mysql入侵提权分析及防止措施
一般来说,mysql的提权有这么几种方式:
1、 udf提权
此方式的关键导入一个dll文件,个人认为只要合理控制了进程账户对目录的写入权限即可防止被导入dll文件;然后如果万一被攻破,此时只要进程账户的权限够低,也没办执行高危操作,如添加账户等。
2、写入启动文件
这种方式同上,还是要合理控制进程账户对目录的写入权限。
3、当root账户被泄露
如果没有合理管理root账户导致root账户被入侵,此时数据库信息肯定是没办法保证了。但是如果对进程账户的权限控制住,以及其对磁盘的权限控制,服务器还是能够保证不被沦陷的。
4、普通账户泄露(上述所说的,只对某个库有所有权限的账户)
此处说的普通账户指网站使用的账户,我给的一个比较方便的建议是直接给予特定库的所有权限。账户泄露包括存在注入及web服务器被入侵后直接拿到数据库账户密码。
此时,对应的那个数据库数据不保,但是不会威胁到其他数据库。而且这里的普通账户无file权限,所有不能导出文件到磁盘,当然此时还是会对进程的账户的权限严格控制。
普通账户给予什么样的权限可以见上表,实在不会就直接给予一个库的所有权限。