歡迎光臨
每天分享高質量文章

MySQL 安全問題

(點選上方公號,快速關註我們)


來源:雪山飛豬

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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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) 20002014, 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/


    ③ 最後請附上您的個人簡介哈~

    看完本文有收穫?請轉發分享給更多人

    關註「資料分析與開發」,提升資料技能

贊(0)

分享創造快樂