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

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) 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 *.* 並不會替用戶自動完成這個情況。


    編號432,輸入編號直達本文

    ●輸入m獲取文章目錄

    推薦↓↓↓

    黑客技術與網絡安全

    更多推薦18個技術類微信公眾號

    涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

赞(0)

分享創造快樂