1.賬號
以普通帳戶安全運行mysqld,禁止mysql以root帳號權限運行,攻擊者可能通過mysql獲得系統root超級用戶權限,完全控制系統。
配置/etc/my.cnf
[mysql.server]
user=mysql
補充操作說明
直接通過本地網絡之外的計算機改變生產環境中的數據庫是異常危險的。有時,管理員會打開主機對數據庫的訪問:
> GRANT ALL ON *.* TO 'root'@'%';
這其實是完全放開了對root的訪問。所以,把重要的操作限制給特定主機非常重要:
> GRANT ALL ON *.* TO 'root'@'localhost';
> GRANT ALL ON *.* TO 'root'@'myip.athome' ;
> FLUSH PRIVILEGES;
判定條件
禁止以root賬號運行mysqld;
檢測操作
檢查進程屬主和運行參數是否包含--user=mysql類似語句:
# ps –ef | grep mysqld
#grep -i user /etc/my.cnf
用戶權限
應按照用戶分配賬號,避免不同用戶間共享賬號
創建用戶 設定指定ip地址登陸數據庫
create user vvera@'指定ip地址' identified by 'vv@122';
這樣就創建了一個名為:vvera 密碼為:vv@122 的用戶。
然后登錄一下。
檢測方法
判定條件
不用名稱的用戶可以連接數據庫;使用不同用戶連接數據庫
應刪除或鎖定與數據庫運行、維護等工作無關的賬號
移除匿名賬戶和廢棄的賬戶
DROP USER語句用於刪除一個或多個MySQL賬戶。要使用DROP USER,必須擁有mysql數據庫的全局CREATE USER權限或DELETE權限。賬戶名稱的用戶和主機部分與用戶表記錄的User和Host列值相對應。
使用DROP USER,您可以取消一個賬戶和其權限,操作如下:
DROP USER user;
該語句可以刪除來自所有授權表的帳戶權限記錄。紅色標識的無用賬戶都可以刪除。
使用操作命令之后的結果
drop user ''@'mysql',''@'localhost','root'@'::1','root'@'mysql';
補充操作說明
要點:
DROP USER不能自動關閉任何打開的用戶對話。而且,如果用戶有打開的對話,此時取消用戶,則命令不會生效,直到用戶對話被關閉后才生效。一旦對話被關閉,用戶也被取消,此用戶再次試圖登錄時將會失敗。
檢側操作:
mysql 查看所有用戶的語句
輸入指令
select user();
select user ,host ,password from mysql.user;
依次檢查所列出的賬戶是否為必要賬戶,刪除無用戶或過期賬戶。
2.口令
檢查帳戶默認密碼和弱密碼
修改帳戶弱密碼
如要修改密碼,執行如下命令:
檢查本地密碼:(注意,管理帳號root默認是空密碼)
mysql> update user set password=password('vv@122') where user='root';
mysql> flush privileges;
檢測方法
mysql> use mysql;
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
3.權限設置
在數據庫權限配置能力內,根據用戶的業務需要,配置其所需的最小權限。
合理設置用戶權限
補充操作說明
有些應用程序是通過一個特定數據庫表的用戶名和口令連接到MySQL的,安全人員不應當給予這個用戶完全的訪問權。
如果攻擊者獲得了這個擁有完全訪問權的用戶,他也就擁有了所有的數據庫。查看一個用戶許可的方法是在MySQL控制台中使用命令SHOW GRANT
>SHOW GRANTS FOR ; 'vvera'@'localhost'
為定義用戶的訪問權,使用GRANT命令。在下面的例子中,vvera僅能從tanggula數據庫的mserver表中選擇:
> GRANT SELECT ON tanggula. mserver TO 'vvera'@'localhost';
> FLUSH PRIVILEGES;
vvera用戶就無法改變數據庫中這個表和其它表的任何數據。
如果你要從一個用戶移除訪問權,就應使用一個與GRANT命令類似的REVOKE命令:
> REVOKE SELECT ON tanggula. mserver FROM 'vvera'@'localhost';
> FLUSH PRIVILEGES;
權限 | 權限范圍 | 給誰授權 | 權限范圍 |
---|---|---|---|
grant all | ON . | to vvera | 授權vvera全庫權限 |
grant select | ON tanggula.* | to vvera | 授權vvera唐古拉數據庫查看權限 |
grant create | ON tanggula.* | to vvera | 授權vvera唐古拉數據庫添加權限 |
授權並創建用戶,並指定密碼
grant 權限 on 權限范圍 to 用戶 identified by '密碼'
回收權限
revoke 權限 on 范圍 from 用戶
4.日志審計
數據庫應配置日志功能,
show variables like 'log_%';查看所有的log命令
show variables like 'log_bin';查看具體的log命令
5.禁用或限制遠程訪問
禁止網絡連接,防止猜解密碼攻擊,溢出攻擊和嗅探攻擊。(僅限於應用和數據庫在同一台主機)
參考配置操作
如果數據庫不需遠程訪問,可以禁止遠程tcp/ip連接, 通過在mysqld服務器中參數中添加 --skip-networking 啟動參數來使mysql不監聽任何TCP/IP連接,增加安全性。強迫MySQL僅監聽本機,方法是在my.cnf的[mysqld]部分增加下面一行:bind-address=127.0.0.1
6.移除測試(test)數據庫和禁用LOCAL INFILE
刪除可以匿名訪問的test數據庫和防止非授權用戶訪問本地文件
移除測試(test)數據庫
在默認安裝的MySQL中,匿名用戶可以訪問test數據庫。我們可以移除任何無用的數據庫,以避免在不可預料的情況下訪問了數據庫。因而,在MySQL控制台中,執行:
> DROP DATABASE test;
禁用LOCAL INFILE
另一項改變是禁用”LOAD DATA LOCAL INFILE”命令,這有助於防止非授權用戶訪問本地文件。在PHP應用程序中發現有新的SQL注入漏洞時,這樣做尤其重要。此外,在某些情況下,LOCAL INFILE命令可被用於訪問操作系統上的其它文件(如/etc/passwd),應使用下現的命令:
mysql> SELECT load_file("/etc/passwd")
為禁用LOCAL INFILE命令,應當在MySQL配置文件的[mysqld]部分增加下面的參數:
set-variable=local-infile=0
檢查操作
Mysql>show databases;