MySQL安全问题(防范必知)
对于任何⼀种数据库来说,安全问题都是⾮常重要的。如果数据库出现安全漏洞,轻则数据被窃取,重则数据被破坏,这些后果对于⼀些重要的数据库都是⾮常严重的。下⾯来从操作系统和数据库两个层对MySQL的安全问题进⾏讨论。
操作系统相关的安全问题
常见的操作系统安全问题主要出现在MySQL的安装和启动过程中.
1.严格控制操作系统账号和权限
在数据库服务器上要严格控制操作系统的账号和权限,⽐如:
锁定mysql⽤户
其他任何⽤户都采取独⽴的账号登录,管理员通过mysql专有⽤户管理MySQL,或者通过root su到mysql⽤户下进⾏管理。
mysql⽤户⽬录下,除了数据⽂件⽬录,其他⽂件和⽬录属主都改为root
2.尽量避免以root权限运⾏MySQL
MySQL安装完毕后,⼀般会将数据⽬录属主设置为mysql⽤户,⽽将MySQL软件⽬录的属主设置为root,这样做的⽬的是当使⽤mysql启动数据库时,可以防⽌任何具有FILE权限的⽤户能够⽤root创建⽂件。⽽如果使⽤root⽤户启动数据库,则任何具有FILE权限的⽤户都可以读写root⽤户的⽂件,这样会给系统造成严重的安全隐患。
3.防⽌DNS欺骗
创建⽤户时,host可以指定域名或者IP地址。但是,如果指定域名,就可能带来如下安全隐患: 如果域名对应的IP地址被恶意修改,则数据库就会被恶意的IP地址进⾏访问,导致安全隐患。
数据库相关的安全问题
常见的数据库问题⼤多数是由于账号的管理不当造成的。应该加强对账号管理的安全意识。
1.删除匿名账号
在某些版本的中,安装完毕MySQL后,会⾃动安装⼀个空账号,此账号具有对test数据库的全部权限,普通⽤户只需要执⾏mysql命令即可登录MySQL数据库,这个时候默认使⽤了空⽤户,可以在test数据库⾥⾯做各种操作,⽐如可以创建⼀个⼤表,占⽤⼤量磁盘空间,这样给系统造成了安全隐患。
2.给root账号设置⼝令
MySQL安装完毕后,root默认⼝令为空,需要马上修改⼝令
set password=password('newpassword');
3.设置安全密码
密码的安全体现在以下两个⽅⾯:
设置安全的密码,建议使⽤6位以上字母、数字、下划线和⼀些特殊字符组合的⽽成的字符串;
使⽤上的安全,使⽤密码期间尽量保证使⽤过程安全,不会被别⼈窃取。
第⼀点就不⽤说了,越长越复杂越没有规律的密码越安全。对于第⼆点,可以总结⼀下,在⽇常⼯作中,使⽤密码⼀般是采⽤以下⼏种⽅式。
(1)直接将密码写在命令⾏中。
mysql -uroot -p123
(2)交互式⽅式输⼊密码。
mysql -uroot -p
(3)将⽤户名和密码写在配置⽂件⾥⾯,连接的时候⾃动读取,⽐如应⽤连接数据库或者执⾏⼀些批处理脚本。对于这种⽅式,MySQL 供了⼀种⽅法,在myf⾥⾯写⼊连接信息。
[client]
user=username
password=password
然后对配置⽂件进⾏严格的权限限制,例如:
chomod +600 myf
以上是3种常见的密码使⽤⽅式。很显然,第1种最不安全,因为它将密码写成为明⽂;第2种⽐较安全,但是只能使⽤在交互的界⾯下;第3种⽐较⽅便,但是需要将配置⽂件设置严格的存取权限,⽽且任何只要可以登录操作系统的⽤户都可能⾃动登录,存在⼀定的安全隐患。第3种⽅法通常使⽤不多,下⾯举⼀个例⼦
(1)输⼊mysql⽆法登录。
[root@iZ28dr6w0qvZ ~]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
(2)修改配置⽂件,加⼊连接信息
[root@iZ28dr6w0qvZ ~]# vim /etc/myf
[client]
#password      = your_password
user=cqh
password=123
(3)重启数据库后,输⼊mysql
[root@iZ28dr6w0qvZ ~]# service mysqld restart
Shutting SUCCESS!
Starting MySQL.. SUCCESS!
[root@iZ28dr6w0qvZ ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| cqh@localhost  |
+----------------+
1 row in set (0.0
2 sec)
4.只授予账号必须的权限
只需要赋予普通⽤户必须的权限,⽐如:
grant select,insert,update,delete on tablename to 'username'@'hostname';
在很多情况下,DBA由于图⽅便,⽽经常赋予⽤户all privileges权限,这个all privileges到底具体包含哪些权限呢?来看下⾯的例⼦:
mysql> select * from db where user='cqh'\G
*************************** 1. row ***************************
mysql下载starting the serverHost: localhost
Db: test
User: cqh
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Execute_priv: Y
Event_priv: Y
Trigger_priv: Y
1 row in set (0.00 sec)
all privileges⾥⾯的权限,远远超过了我们⼀般应⽤所需要的权限。⽽且,有些权限如果误操作,将会产⽣⾮常严重的后果,⽐如
drop_priv等。因此,⽤户权限的时候越具体,则对数据库越安全。
5.除root外,任何⽤户不应有mysql库user表的存取权限
由于MySQL中可以通过更改mysql数据库的user表进⾏权限的增加、删除、变更等操作,因此,除了root以外,任何⽤户都不应该拥有对user表的存取权限(S ELECT、UPDATE、INSERT、DELETE等),造成系统的安全隐患。下例对普通⽤户cqh授予user表的存取权限,看看会对系统产⽣了怎么样的安全隐患。(1)创建普通⽤户chenqionghe,拥有对mysql数据库中的user表的各种权限。
[root@iZ28dr6w0qvZ ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 103
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> grant select,update,insert,delete on mysql.user to chenqionghe@localhost;
Query OK, 0 rows affected (0.00 sec)
(2)⽤chenqionghe来更新root权限。
[root@iZ28dr6w0qvZ ~]# mysql -uchenqionghe
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 106
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use mysql;
Database changed
mysql>
mysql> update user set password=password('abcd') where user='root' and host='localhost';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
(3)当数据库重启或者root刷新权限表后,root登录时密码已经被更改。
[root@iZ28dr6w0qvZ ~]# mysql -uroot -pabcd
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
6.不要把FILE、PROCESS或SUPER权限授予管理员以外的账号
FILE权限主要以下作⽤:
将数据库的信息通过SELECT …INTO OUTFILE…写到服务器上有写权限的⽬录下,作为⽂本格式存放。具有权限的⽬录也就是启动MySQL时的⽤户权限⽬录。
可以将有读权限的⽂本⽂件通过LOAD DATA INFILE…命令写⼊数据表,如果这些表中存放了很重要的信息,将对系统造成很⼤的安全隐患。
在例中详细描述了FILE权限可能造成的隐患。
(1)连接数据库并创建测试表t。
[root@iZ28dr6w0qvZ ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test;
Database changed
mysql> create table t (name varchar(500));
Query OK, 0 rows affected (0.02 sec)
(2)将/etc/password⽂件加载到表t中
mysql> load data infile '/etc/passwd' into table t;
Query OK, 23 rows affected (0.01 sec)
Records: 23  Deleted: 0  Skipped: 0  Warnings: 0
(3)查看t的内容
mysql> select * from t;
+----------------------------------------------------------------------+
| name                                                                |
+----------------------------------------------------------------------+
| root:x:0:0:root:/root:/bin/bash                                      |
| bin:x:1:1:bin:/bin:/sbin/nologin                                    |
| daemon:x:2:2:daemon:/sbin:/sbin/nologin                              |
| adm:x:3:4:adm:/var/adm:/sbin/nologin                                |
| lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin                            |
| sync:x:5:0:sync:/sbin:/bin/sync                                      |
| shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown                        |
| halt:x:7:0:halt:/sbin:/sbin/halt                                    |
| mail:x:8:12:mail:/var/spool/mail:/sbin/nologin                      |
| uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin                      |
| operator:x:11:0:operator:/root:/sbin/nologin                        |
| games:x:12:100:games:/usr/games:/sbin/nologin                        |
| gopher:x:13:30:gopher:/var/gopher:/sbin/nologin                      |
| ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin                          |
| nobody:x:99:99:Nobody:/:/sbin/nologin                                |
| vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin        |
| ntp:x:38:38::/etc/ntp:/sbin/nologin                                  |
| saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin |
| postfix:x:89:89::/var/spool/postfix:/sbin/nologin                    |
| sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin  |
| nscd:x:28:28:NSCD Daemon:/:/sbin/nologin                            |
| www:x:500:500::/alidata/www:/sbin/nologin                            |
| mysql:x:501:501::/home/mysql:/sbin/nologin
这样,重要的⽤户信息/etc/passwd内容将被写⼊表t中,造成安全隐患。
PROCESS权限能被⽤来执⾏“show processlist”命令,查看当前所有⽤户执⾏的查询的明⽂⽂本,包括设定或改变密码的查询。在默认情况下,每个⽤户都可以执⾏“show processlist”命令,但是只能查询本⽤户的进程。因此,对PROCESS权限管理不当,有可能会使得普通⽤户能够看到管理员执⾏的命令。
下例中对普通⽤户赋予了PROCESS权限,来看看会造成什么安全隐患。
(1)将PROCESS权限授予给普通⽤户:
[root@iZ28dr6w0qvZ ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 5.5.37-log MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db  | Command | Time | State | Info            |
+----+------+-----------+------+---------+------+-------+------------------+
|  2 | root | localhost | NULL | Sleep  |  53 |      | NULL            |
| 26 | root | localhost | NULL | Query  |    0 | NULL  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)
mysql> grant process on *.* to 'cqh'@'localhost';
Query OK, 0 rows affected (0.00 sec)
(2)锁定表user,可以让进程阻塞,以⽅便⽤户看到进程内容:
mysql> lock table user read;
Query OK, 0 rows affected (0.00 sec)
(3)打开另外⼀个session,⽤root执⾏修改密码操作,此时因为user表被锁定,此进程被阻塞挂起

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。