(點選上方公號,快速關註我們)
來源:雪山飛豬
www.cnblogs.com/chenqionghe/p/4873665.html
對於任何一種資料庫來說,安全問題都是非常重要的。如果資料庫出現安全漏洞,輕則資料被竊取,重則資料被破壞,這些後果對於一些重要的資料庫都是非常嚴重的。下麵來從作業系統和資料庫兩個層對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無法登入
[root@iZ28dr6w0qvZ ~]# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
(2)修改配置檔案,加入連線資訊
[root@iZ28dr6w0qvZ ~]# vim /etc/my.cnf
...
[client]
#password = your_password
user=cqh
password=123
(3)重啟資料庫後,輸入mysql
[root@iZ28dr6w0qvZ ~]# service mysqld restart
Shutting down MySQL... 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.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表的各種許可權
[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表被鎖定,此行程被阻塞掛起
[root@iZ28dr6w0qvZ ~]# 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陳述句
[root@iZ28dr6w0qvZ ~]# 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 cqh@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for cqh@localhost;
+--------------------------------------------------+
| Grants for cqh@localhost |
+--------------------------------------------------+
| GRANT PROCESS, SUPER ON *.* TO 'cqh'@'localhost' |
+--------------------------------------------------+
1 row in set (0.00 sec)
(3)重新kill root的行程成功
[root@iZ28dr6w0qvZ ~]# 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 cqh@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for cqh@localhost;
+-----------------------------------------------+
| Grants for cqh@localhost |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh'@'localhost' |
| GRANT SELECT ON `test`.* TO 'cqh'@'localhost' |
+-----------------------------------------------+
2 rows in set (0.00 sec)
(2)cqh登入,測試許可權
[root@iZ28dr6w0qvZ ~]# 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
[root@iZ28dr6w0qvZ ~]# 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登入,再次測試許可權
[root@iZ28dr6w0qvZ ~]# 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 cqh@localhost;
+-----------------------------------------------+
| Grants for cqh@localhost |
+-----------------------------------------------+
| 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
[root@iZ28dr6w0qvZ ~]# 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許可權依舊存在
[root@iZ28dr6w0qvZ ~]# 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 cqh@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on *.* to cqh@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for cqh@localhost;
+-------------------------------------------------------+
| Grants for cqh@localhost |
+-------------------------------------------------------+
| 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 cqh@localhost;
Query OK, 0 rows affected (0.00 sec)
(3)我們很可能以為,此時使用者已經沒有任何許可權了,而不會再去檢視他的許可權表。而實際上,此時的使用者依然擁有test上的SELECT和INSERT許可權
mysql> show grants for cqh@localhost;
+-------------------------------------------------------+
| Grants for cqh@localhost |
+-------------------------------------------------------+
| GRANT USAGE ON *.* TO 'cqh'@'localhost' |
| GRANT SELECT, INSERT ON `test`.* TO 'cqh'@'localhost' |
+-------------------------------------------------------+
2 rows in set (0.00 sec)
(4)此時,再次用cqh登入,測試一下是否能對test資料庫做操作
[root@iZ28dr6w0qvZ ~]# 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 *.* 並不會替使用者自動完成這個情況。
【關於投稿】
如果大家有原創好文投稿,請直接給公號傳送留言。
① 留言格式:
【投稿】+《 文章標題》+ 文章連結
② 示例:
【投稿】《不要自稱是程式員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/
③ 最後請附上您的個人簡介哈~
看完本文有收穫?請轉發分享給更多人
關註「資料分析與開發」,提升資料技能