1. 程式人生 > >MySQL安全問題(防範必知)

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供了一種方法,在my.cnf裡面寫入連線資訊。

[client]
user=username
password=password

然後對配置檔案進行嚴格的許可權限制,例如:

chomod +600 my.cnf
以上是3種常見的密碼使用方式。很顯然,第1種最不安全,因為它將密碼寫成為明文;第2種比較安全,但是隻能使用在互動的介面下;第3種比較方便,但是需要將配置檔案設定嚴格的存取許可權,而且任何只要可以登入作業系統的使用者都可能自動登入,存在一定的安全隱患。
第3種方法通常使用不多,下面舉一個例子
(1)輸入mysql無法登入。

[[email protected] ~]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

(2)修改配置檔案,加入連線資訊

[[email protected] ~]# vim /etc/my.cnf
[client]
#password       = your_password
user=cqh
password=123

(3)重啟資料庫後,輸入mysql

[[email protected] ~]# service mysqld restart
Shutting down MySQL... SUCCESS!
Starting MySQL.. SUCCESS!
[[email protected] ~]# 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() |
+----------------+
| [email protected]  |
+----------------+
1 row in set (0.02 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 ***************************
                 Host: 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表的存取許可權(SELECT、UPDATE、INSERT、DELETE等),造成系統的安全隱患。下例對普通使用者cqh授予user表的存取許可權,看看會對系統產生了怎麼樣的安全隱患。
(1)建立普通使用者chenqionghe,擁有對mysql資料庫中的user表的各種許可權。

[[email protected] ~]# 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 [email protected];
Query OK, 0 rows affected (0.00 sec)

(2)用chenqionghe來更新root許可權。

[[email protected] ~]# 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登入時密碼已經被更改。

[[email protected] ~]# 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。

[[email protected] ~]# 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許可權授予給普通使用者:

[[email protected] ~]# 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表被鎖定,此程序被阻塞掛起

[[email protected] ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27
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> set password=password('123');

(4)開啟第3個session,用cqh登入,執行show processlist語句:

[[email protected] ~]# mysql -ucqh
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 31
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                         |
+----+------+-----------+-------+---------+------+------------------------------+------------------------------+
| 26 | root | localhost | mysql | Sleep   |   20 |                              | NULL                         |
| 27 | root | localhost | NULL  | Query   |   15 | Waiting for table level lock | set password=password('123') |
| 31 | cqh  | localhost | NULL  | Query   |    0 | NULL                         | show processlist             |
+----+------+-----------+-------+---------+------+------------------------------+------------------------------+

3 rows in set (0.00 sec)
可以發現,cqh顯示的程序中清楚地看到了root的修改密碼操作,並看到了明文的密碼,這將對系統造成嚴重的安全隱患。
SUPER許可權能夠執行kill命令,終止其他使用者程序。下面例子中,普通使用者擁有了SUPER許可權後,便可以任意kill任何使用者的程序。
(1)cqh登入後想kill掉root修改密碼程序(程序號27)

mysql> show processlist;
+----+------+-----------+-------+---------+------+------------------------------+------------------------------+
| Id | User | Host      | db    | Command | Time | State                        | Info                         |
+----+------+-----------+-------+---------+------+------------------------------+------------------------------+
| 26 | root | localhost | mysql | Sleep   |   20 |                              | NULL                         |
| 27 | root | localhost | NULL  | Query   |   15 | Waiting for table level lock | set password=password('123') |
| 31 | cqh  | localhost | NULL  | Query   |    0 | NULL                         | show processlist             |
+----+------+-----------+-------+---------+------+------------------------------+------------------------------+
3 rows in set (0.00 sec)
mysql> kill 27;
ERROR 1095 (HY000): You are not owner of thread 27

(2)kill失敗後,root將super許可權賦予cqh;

mysql> grant super on *.* to [email protected]host;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for [email protected];
+--------------------------------------------------+
| Grants for [email protected]                         |
+--------------------------------------------------+
| GRANT PROCESS, SUPER ON *.* TO 'cqh'@'localhost' |
+--------------------------------------------------+
1 row in set (0.00 sec)

(3)重新kill root的程序成功:

[[email protected] ~]# mysql -ucqh
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 40
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                         |
+----+------+-----------+-------+---------+------+------------------------------+------------------------------+
| 26 | root | localhost | mysql | Sleep   |   20 |                              | NULL                         |
| 27 | root | localhost | NULL  | Query   |   15 | Waiting for table level lock | set password=password('123') |
| 31 | cqh  | localhost | NULL  | Query   |    0 | NULL                         | show processlist             |
+----+------+-----------+-------+---------+------+------------------------------+------------------------------+
3 rows in set (0.00 sec)
mysql> kill 27;
Query OK, 0 rows affected (0.00 sec)

從上面的例子中,可以看到FILE、PROCESS、SUPER三個管理許可權可能會帶來的安全隱患,因此除了管理員外,不要把這些許可權賦予給普通使用者。

7.LOAD DATA LOCAL帶來的安全問題
LOAD DATA預設讀的是伺服器上的檔案,但是加上LOCAL引數後,就可以將本地具有訪問許可權的檔案載入到資料庫中。這在在帶來方便的同時,可帶來了以下安全問題。
可以任意載入本地檔案到資料庫。
在Web環境中,客戶從Web伺服器連線,使用者可以使用LOAD DATA LOCAL語句來讀取Web伺服器程序在讀訪問許可權的任何檔案(假定使用者可以執行SQL伺服器的任何命令)。在這種環境中,MySQL伺服器的客戶實際上的是Web伺服器,而不是連線Web伺服器的使用者執行的程式。
解決的方法是,可以用–local-infile=0選項啟動mysqld從伺服器禁用所有LOAD DATA LOCAL命令。
對於mysql命令列客戶端,可以通過指定–local-infile[=1]選項啟用LOAD DATA LOCAL,或通過–local-infile=0選項禁用。類似地,對於mysqlimport,–local or -L選項啟用本地檔案裝載。在任何情況下,成功進行本地裝載需要伺服器啟用相關選項。

8.DROP TABLE命令並不收回以前的相關訪問許可權
DROP表的時候,其他使用者對此表的許可權並沒有被收回,這樣導致重新建立同名的表時,以前其他使用者對此表的許可權會自動自動賦予,進而產生許可權外流。因此,在刪除表時,要同時取消其他使用者在此表上的相應許可權。
下面的例子說明了不收回相關訪問授權的隱患。
(1)用root建立使用者cqh,授權test下所有表的select許可權:

mysql> grant select on test.* to [email protected];
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for [email protected];
+-----------------------------------------------+
| Grants for [email protected]                      |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh'@'localhost'       |
| GRANT SELECT ON `test`.* TO 'cqh'@'localhost' |
+-----------------------------------------------+
2 rows in set (0.00 sec)

(2)cqh登入,測試許可權:

[[email protected] ~]# mysql -ucqh
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 287
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> show tables;
+----------------+
| Tables_in_test |
+----------------+
| menu           |
| salary         |
| t              |
| t1             |
| t12            |
| t2             |
+----------------+
6 rows in set (0.00 sec)

(3)root登入,刪除表t12:

[[email protected] ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 288
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> drop table t12;
Query OK, 0 rows affected (0.00 sec)

(4)cqh登入,再次測試許可權:

[[email protected] ~]# mysql -ucqh
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 290
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> show tables;
+----------------+
| Tables_in_test |
+----------------+
| menu           |
| salary         |
| t              |
| t1             |
| t2             |
+----------------+
5 rows in set (0.00 sec)

(5)此時t12表已經看不到了。

mysql> show grants for [email protected];
+-----------------------------------------------+
| Grants for [email protected]                      |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh'@'localhost'       |
| GRANT SELECT ON `test`.* TO 'cqh'@'localhost' |
+-----------------------------------------------+
2 rows in set (0.00 sec)

許可權仍然顯示對test下所有表的有SELECT許可權(安全漏洞)
(6)root再次登入,建立表t12:

[[email protected] ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 292
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 t12(id int);
Query OK, 0 rows affected (0.03 sec)

(7)cqh登入,對t1許可權依舊存在:

[[email protected] ~]# mysql -ucqh
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 293
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> show tables;
+----------------+
| Tables_in_test |
+----------------+
| menu           |
| salary         |
| t              |
| t1             |
| t12            |
| t2             |
+----------------+
6 rows in set (0.00 sec)

因此,對錶做刪除後,其他使用者對此表的許可權不會自動收回,一定要記住手工收回。

9.使用SSL
SSL(Secure Socket Layer,安全套接字層)是一種安全傳輸的協議,最初Netscape公司所開發,用以保障在Internet上資料傳輸之安全,利用 資料加密(Encryption)技術,可確保資料在網路上傳輸過程中不會被擷取及竊聽。
SSL協議提供的服務主要有:
(1)認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;
(2)加密資料以防止資料中途被竊取;
(3)維護資料的完整性,確保資料在傳輸過程中不被改變。
在MySQL中,要想使用SSL進行安全傳輸,需要在命令列中或選項檔案中設定“–ssl”選項。
對於伺服器,“ssl”選項規定該伺服器允許SSL連線。對於客戶端端程式,它允許客戶使用SSL連線。對於客戶端程式,它允許客戶端用SSL連線伺服器。單單該選項不足以使用SSL連線。還必須指定–ssl-ca、–ssl-cert和–ssl-key選項。如果不想啟用SSL,可以將選項指定為–skip-ssl或–ssl=0。
請注意,如果編譯的伺服器或客戶端不支援SSL,則使用普通的示加密的連線。
確保使用SSL連線的安全方式是,使用含REQUIRE SSL子句的GRANT語句在伺服器上建立一賬戶,然後使用該賬戶來連線伺服器,伺服器和客戶端均應啟用SSL支援。下面例子建立了一個含REQUIRE SSL子句的賬號:

mysql> grant select on *.* to cqh identified by '123' REQUIRE ssl;
Query OK, 0 rows affected (0.00 sec)
--ssl-ca=file_name    含可信的SSL CA的清單的檔案的路徑
--ssl-cert=file_name    SSL證書檔名,用於建立安全連線
--ssl-key=file_name    SSL金鑰檔名,用於建立 安全連線

10.如果可能,給所有使用者加上訪問IP限制
對資料庫來說,我們希望客戶端過來的連線都是安全的,因此,就很有必要在建立使用者的時候指定可以進行連線的伺服器IP或者HOSTNAME,只有符合授權的IP或者HOSTNAME才可以進行資料庫的訪問。

11.REVOKE命令的漏洞
當用戶多次賦予許可權後,由於各種原因,需要將此使用者的許可權全部取消,此時,REVOKE命令可能並不會按照我們的意願執行,來看看下面的例子。
(1)連續賦予使用者兩次許可權,其中,第2次是對所有資料庫的所有許可權。

mysql> grant select,insert on test.* to [email protected];
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on *.* to [email protected];
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for [email protected];
+-------------------------------------------------------+
| Grants for [email protected]                              |
+-------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'cqh'@'localhost'      |
| GRANT SELECT, INSERT ON `test`.* TO 'cqh'@'localhost' |
+-------------------------------------------------------+
2 rows in set (0.00 sec)

(2)此時,需要取消使用者的所有許可權。

mysql> revoke all privileges on *.* from [email protected];
Query OK, 0 rows affected (0.00 sec)

(3)我們很可能以為,此時使用者已經沒有任何許可權了,而不會再去檢視他的許可權表。而實際上,此時的使用者依然擁有test上的SELECT和INSERT許可權。

mysql> show grants for [email protected];
+-------------------------------------------------------+
| Grants for [email protected]                              |
+-------------------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh'@'localhost'               |
| GRANT SELECT, INSERT ON `test`.* TO 'cqh'@'localhost' |
+-------------------------------------------------------+
2 rows in set (0.00 sec)

(4)此時,再次用cqh登入,測試一下是否能對test資料庫做操作。

[[email protected] ~]# mysql -ucqh
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 395
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> show tables;
+----------------+
| Tables_in_test |
+----------------+
| menu           |
| salary         |
| t              |
| t1             |
| t12            |
| t2             |
+----------------+
6 rows in set (0.00 sec)
mysql> insert into t1 values (1);
Query OK, 1 row affected (0.01 sec)

這個是MySQL許可權機制造成的隱患,在一個數據庫上多次賦予許可權,許可權會自動合併;但是在多個數據庫上多次賦予許可權,每個資料庫上都會認為是單獨的一組許可權,必須在此資料庫上用REVOKE命令來單進行許可權收回,而 REVOKE ALL PRIVILEGES ON . 並不會替使用者自動完成這個情況。

原文連結

http://www.cnblogs.com/chenqionghe/p/4873665.html

服務推薦