Mysql安全配置配置教程
小编:动力软件园 时间:2014-06-20 09:31:51
1. mysql.USER表
2. mysql.DB表
3. mysql.TABLES_PRIV表
4. mysql.COLUMNS_PRIV表
http://www.cnblogs.com/hzhida/archive/2012/08/08/2628826.html
select * from USER;
desc USER;
mysql> desc USER;+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum(N,Y)                     | NO   |     | N       |       |
| Insert_priv            | enum(N,Y)                     | NO   |     | N       |       |
| Update_priv            | enum(N,Y)                     | NO   |     | N       |       |
| Delete_priv            | enum(N,Y)                     | NO   |     | N       |       |
| Create_priv            | enum(N,Y)                     | NO   |     | N       |       |
| Drop_priv              | enum(N,Y)                     | NO   |     | N       |       |
| Reload_priv            | enum(N,Y)                     | NO   |     | N       |       |
| Shutdown_priv          | enum(N,Y)                     | NO   |     | N       |       |
| Process_priv           | enum(N,Y)                     | NO   |     | N       |       |
| File_priv              | enum(N,Y)                     | NO   |     | N       |       |
| Grant_priv             | enum(N,Y)                     | NO   |     | N       |       |
| References_priv        | enum(N,Y)                     | NO   |     | N       |       |
| Index_priv             | enum(N,Y)                     | NO   |     | N       |       |
| Alter_priv             | enum(N,Y)                     | NO   |     | N       |       |
| Show_db_priv           | enum(N,Y)                     | NO   |     | N       |       |
| Super_priv             | enum(N,Y)                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum(N,Y)                     | NO   |     | N       |       |
| Lock_tables_priv       | enum(N,Y)                     | NO   |     | N       |       |
| Execute_priv           | enum(N,Y)                     | NO   |     | N       |       |
| Repl_slave_priv        | enum(N,Y)                     | NO   |     | N       |       |
| Repl_client_priv       | enum(N,Y)                     | NO   |     | N       |       |
| Create_view_priv       | enum(N,Y)                     | NO   |     | N       |       |
| Show_view_priv         | enum(N,Y)                     | NO   |     | N       |       |
| Create_routine_priv    | enum(N,Y)                     | NO   |     | N       |       |
| Alter_routine_priv     | enum(N,Y)                     | NO   |     | N       |       |
| Create_user_priv       | enum(N,Y)                     | NO   |     | N       |       |
| Event_priv             | enum(N,Y)                     | NO   |     | N       |       |
| Trigger_priv           | enum(N,Y)                     | NO   |     | N       |       |
| Create_tablespace_priv | enum(N,Y)                     | NO   |     | N       |       |
| ssl_type               | enum(,ANY,X509,SPECIFIED) | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
| password_expired       | enum(N,Y)                     | NO   |     | N       |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
select * from DB;
desc DB;
mysql> desc DB; +-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
| Select_priv           | enum(N,Y) | NO   |     | N       |       |
| Insert_priv           | enum(N,Y) | NO   |     | N       |       |
| Update_priv           | enum(N,Y) | NO   |     | N       |       |
| Delete_priv           | enum(N,Y) | NO   |     | N       |       |
| Create_priv           | enum(N,Y) | NO   |     | N       |       |
| Drop_priv             | enum(N,Y) | NO   |     | N       |       |
| Grant_priv            | enum(N,Y) | NO   |     | N       |       |
| References_priv       | enum(N,Y) | NO   |     | N       |       |
| Index_priv            | enum(N,Y) | NO   |     | N       |       |
| Alter_priv            | enum(N,Y) | NO   |     | N       |       |
| Create_tmp_table_priv | enum(N,Y) | NO   |     | N       |       |
| Lock_tables_priv      | enum(N,Y) | NO   |     | N       |       |
| Create_view_priv      | enum(N,Y) | NO   |     | N       |       |
| Show_view_priv        | enum(N,Y) | NO   |     | N       |       |
| Create_routine_priv   | enum(N,Y) | NO   |     | N       |       |
| Alter_routine_priv    | enum(N,Y) | NO   |     | N       |       |
| Execute_priv          | enum(N,Y) | NO   |     | N       |       |
| Event_priv            | enum(N,Y) | NO   |     | N       |       |
| Trigger_priv          | enum(N,Y) | NO   |     | N       |       |
+-----------------------+---------------+------+-----+---------+-------+
select * from TABLES_PRIV;
desc TABLES_PRIV;
mysql> desc TABLES_PRIV;  
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Field       | Type                                                                                                                              | Null | Key | Default           | Extra                       |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Host        | char(60)                                                                                                                          | NO   | PRI |                   |                             |
| Db          | char(64)                                                                                                                          | NO   | PRI |                   |                             |
| User        | char(16)                                                                                                                          | NO   | PRI |                   |                             |
| Table_name  | char(64)                                                                                                                          | NO   | PRI |                   |                             |
| Grantor     | char(77)                                                                                                                          | NO   | MUL |                   |                             |
| Timestamp   | timestamp                                                                                                                         | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Table_priv  | set(Select,Insert,Update,Delete,Create,Drop,Grant,References,Index,Alter,Create View,Show view,Trigger) | NO   |     |                   |                             |
| Column_priv | set(Select,Insert,Update,References)                                                                                      | NO   |     |                   |                             |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
select * from COLUMNS_PRIV;
desc COLUMNS_PRIV;
mysql> desc COLUMNS_PRIV;  +-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Field       | Type                                         | Null | Key | Default           | Extra                       |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Host        | char(60)                                     | NO   | PRI |                   |                             |
| Db          | char(64)                                     | NO   | PRI |                   |                             |
| User        | char(16)                                     | NO   | PRI |                   |                             |
| Table_name  | char(64)                                     | NO   | PRI |                   |                             |
| Column_name | char(64)                                     | NO   | PRI |                   |                             |
| Timestamp   | timestamp                                    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Column_priv | set(Select,Insert,Update,References) | NO   |     |                   |                             |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
1. 先从user表中的:    
    1) Host    
    2) User    
    3) Password
这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。
2. 通过身份认证后,进行权限分配,按照:    
    1) user    
    2) db    
    3) tables_priv    
    4) columns_priv
的顺序进行验证。
即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv
如果全局权限表user对应的权限为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限
如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。逐级下降
user->db->tables_priv->columns_pri
mysql> select host,db,user from db;
+------+---------+------+
| host | db      | user |
+------+---------+------+
| %    | test    |      |
| %    | test_% |      |
+------+---------+------+
1. 针对每个网站建立一个单独的账户
2. 为每个网站单独建立一个专属数据库(虽然DEDE、DZ普通采用表前缀的方法来实现"一库多站",但好的做法还是"一库一站") 
3. 按照user->db->tables_priv->columns_pri的顺序进行细粒度的权限控制
4. 为每个用户单独配置一个专属数据库,保证当前用户的所有操作只能发生在它自己的数据库中,防止SQL注入发生后,黑客通过注入点访问到系统表
1. 新建一个用户并给予相应数据库的权限 grant select,insert,update,delete,create,drop privileges on database.* to user@localhost identified by passwd; grant all privileges on database.* to user@localhost identified by passwd;2. 刷新权限 flush privileges;3. 显示授权 show grants;4. 移除授权 revoke delete on *.* from user@localhost;5. 删除用户 drop user user@localhost;6. 给用户改名 rename user jack@% to jim@%;7. 给用户改密码 SET PASSWORD FOR root@localhost = PASSWORD(123456);
1. 主机层:    
    1) windows可以通过windows防火墙    
    2) Linux下可以通过iptables
来限制允许访问mysql端口的IP地址
//只允许指定的IP进行访问
iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT
..
iptables -P INPUT DROP
mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host      | user | password                                  |
+-----------+------+-------------------------------------------+
| localhost | root | *832EB84CB764129D05D498ED9CA7E5CE9B8F83EB |
| .         | root | *832EB84CB764129D05D498ED9CA7E5CE9B8F83EB |
| ::        | root | *832EB84CB764129D05D498ED9CA7E5CE9B8F83EB |
| localhost |      |                                           |
+-----------+------+-------------------------------------------+
port     = 3306
#vi /etc/my.cnf
[mysqld]
max_user_connections 2
1. 从日志中获得典型SQL注入语句
2. 利用正则模型从日志中捕获注入攻击的发生
3. 在脱库、数据泄漏之后获得关于受攻击数据库的情况、泄漏范围等数据
1. 错误日志:-log-err
log-error=E:/wamp/logs/mysql_error.log
2. 查询日志(记录所有SQL语句):-log 
log=E:/wamp/logs/mysql.log
3. 慢查询日志:-log-slow-queries 
    1) 查看慢查询时间
    show variables like "long_query_time";默认10s   
    2) 查看慢查询配置情况
    show status like "%slow_queries%";    
    3) 查看慢查询日志路径
    show variables like "%slow%";
//存储位置、长SQL的阈值
E:wampbinmysqlmysql5.6.12dataLittleHann-PC-slow.log
long_query_time=5
4. 更新日志:-log-update 
5. 二进制日志:-log-bin//记录除select语句之外的所有sql语句到日志中,可以用来恢复数据文件log-bin=E:/wamp/logs/bin
show variables like log_%; 
+----------------------------------------+----------------------------------------------------+
| Variable_name                          | Value                                              |
+----------------------------------------+----------------------------------------------------+
| log_bin                                | ON                                                 |
| log_bin_basename                       | E:wampbinmysqlmysql5.6.12datamysql-bin       |
| log_bin_index                          | E:wampbinmysqlmysql5.6.12datamysql-bin.index |
| log_bin_trust_function_creators        | OFF                                                |
| log_bin_use_v1_row_events              | OFF                                                |
| log_error                              | E:wamplogsmysql.log                             |
| log_output                             | FILE                                               |
| log_queries_not_using_indexes          | OFF                                                |
| log_slave_updates                      | OFF                                                |
| log_slow_admin_statements              | OFF                                                |
| log_slow_slave_statements              | OFF                                                |
| log_throttle_queries_not_using_indexes | 0                                                  |
| log_warnings                           | 1                                                  |
+----------------------------------------+----------------------------------------------------+
1. 在windows下禁止使用local system(nt authoritysystem)来运行mysql账户,可以考虑使用network service或者自己新建一个windows账号,但是必须给与mysql程序所在目录的读取权限和data目录的读取和写入权限
2. 在linux下,新建一个mysql账号,并在安装的时候就指定mysql以mysql账户来运行,给与程序所在目录的读取权限,data所在目录的读取和写入权限。
1. mysql运行账号需要给予程序所在目录的读取权限,以及data目录的读取和写入权限,保证mysql的正常运行
2. 不容许给予其他目录的写入和执行权限,特别是有网站的,这可以有效防御针对mysql的提权、或者webshell提权    
    1) udf提权    
    2) 系统关键目录、注册表写入启动文件 
3. 取消mysql运行账户对于cmd,sh等一些程序的执行权限,这可以防御当mysql核心帐号被黑客获取后进一步提权    
    1) root账户被泄露
    由于对cmd、sh等关键程序进行了权限控制,黑客无法继续深入操作系统提权
1. ~/.bash_history
2. ~/.mysql_history 
.. 
cat /dev/null > ~/.bash_history
cat /dev/null > ~/.mysql_history
<?php ini_set("mysql.default_socket = /var/lib/mysql/mysql.sock"); $sql = "select user();"; $res = mysql_query($sql); $final = mysql_fetch_array($res); die(var_dump($final)); ?>
array(2) { [0]=> string(16) "apache@localhost" ["user()"]=> string(16) "apache@localhost" }
1. 安华金和数据库防火墙系统(Xsecure-DBFirewall)
2. Snort入侵检测系统
能针对指定端口进行正则特征匹配方式的SQL注入检测
3. Java/J2EE 过滤器
对于J2ee的WEB应用来说,可以在HTTP请求上部署过滤器,并将SQL注入检测规律写在过滤器中
4. druid-sql-wall开源SQL检测、阻断系统
1. --local-infile[={0|1}]
如果用–local-infile=0启动服务器,则客户端不能使用LOCAL in LOAD DATA语句,防止基于注入的直接文件读取数据泄漏
2. --old-passwords
强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。
3. (OBSOLETE) –safe-show-database    
    1) 在MySQL 5.1以前版本的MySQL中,该选项使SHOW DATABASES语句只显示用户具有部分权限的数据库名    
    2) 在MySQL 5.1中,该选项不再作为现在的 默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。
4. --safe-user-create
如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:
mysql> GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name’;这样确保用户不能直接更改权限列,必须使用GRANT语句给其它用户授予该权限。
5. --secure-auth
不允许鉴定有旧(pre-4.1)密码的账户。
6. --skip-grant-tables
这个选项导致服务器根本不使用权限系统。这给每个人以完全访问所有的数据库的权力,这个选项常常在发生了忘记了msyql密码的情况使用这个方式在本机"无密码登录mysql"通过执行mysqladmin flush-privileges或mysqladmin eload命令,或执行FLUSH PRIVILEGES语句,你能告诉一个正在运行的服务器再次开始使用授权表。
7. --skip-name-resolve
主机名不被解析。所有在授权表的Host的列值必须是IP号或localhost
8. --skip-networking
在网络上不允许TCP/IP连接。所有到mysqld的连接必须经由Unix套接字进行
9. --skip-show-database
使用该选项,只允许有SHOW DATABASES权限的用户执行SHOW DATABASES语句,该语句显示所有数据库名。不使用该选项,允许所有用户执行SHOW DATABASES,但只显示用户有SHOW DATABASES权限或部分数据库权限的数据库名。请注意全局权限指数据库的权限。
1. 本地备份
使用mysqldump进行备份非常简单,在备份数据库的时候,我们还可以同时使用管道gzip命令对备份文件进行压缩,可以采用Rsync的异地备份方式方式,将备份服务器的目录挂载到数据库服务器,将数据库文件备份打包后,通过crontab定时备份数据:
备份数据使用命令:
#!/bin/sh
time=`date +"("%F")"%R`
$/usr/local/mysql/bin/mysqldump -u root -p111 database_backup | gzip > /home/zhenghan/mysql/mysql_backup.$time.gz
# crontab -l
# m h  dom mon dow   command00 00 * * * /home/zhenghan/mysql/backup.sh
恢复数据使用命令:
gzip -d mysql_backup.(2014-06-17)00:00.gz
mysql_backup.(2014-06-17)00:00#mysql –u root -p111 < /home/zhenghan/mysql/mysql_backup.(2014-06-17)00:00
2. 网络备份
3. MySQL本身自带的mysqldump备份
使用mysqldump可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建您的数据库所需要的SQL命令。这个命令取得所有的模式(schema)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将您的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。
4. 直接复制数据库文件的备份形式
直接拷贝数据文件最为直接、快速、方便,但缺点是基本上不能实现增量备份。为了保证数据的一致性,需要在备份文件前,执行以下SQL语句:FLUSH TABLES WITH READ LOCK;也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。				
					相关阅读
				
				
			
					排行榜
				
												
				
			