程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql max_allowed_packet自動重置為1024 終結解決,maxallowedpacket重置

mysql max_allowed_packet自動重置為1024 終結解決,maxallowedpacket重置

編輯:MySQL綜合教程

mysql max_allowed_packet自動重置為1024 終結解決,maxallowedpacket重置


 

  • 背景:

測試環境1台centOS機器,最近一段頻繁報“

Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1354 > 1024). You can change this value on the server by setting the max_allowed_packet' variable

”, 記錄解決問題的思路,最終找到問題根源:黑客入侵,總結經驗。

 

  • 思路:

查看max_allowed_packet :

show global VARIABLES like '%max_allowed_packet%'; (注意:mysql 系統參數分為session和global 之分, session只當前連接生效,global 全局連接生效)

1).通過mysql客戶端,set global max_allowed_packet = 2*1024*1024*10;  (修改後,重啟數據庫會恢復為默認)

2). 修改my.cnf  在[mysqld]段或者mysql的server配置段進行修改。(終極修改, 修改後重啟數據庫,永久生效)

  如下: max_allowed_packet = 20M 通過方法2修改完成後,通過客戶端生效。 但發現,過一段時間(有時幾個小時,有時1~2天),自動變為1024。 思考:google 發現有說被黑客攻擊,本來不相信,因為是內網環境。無奈出現情況,越來越頻繁,剛更改後,過一會就變為1024。以下帖子給了啟發: http://stackoverflow.com/questions/28979660/why-mysql-max-allowed-packet-reset-to-1m-automatically mysql 有general_log, 會記錄所有執行的sql命令,因為耗費性能,默認是關閉。
mysql> show variables like '%log%';
+-----------------------------------------+---------------------------------+
| Variable_name                           | Value                           |
+-----------------------------------------+---------------------------------+
| back_log                                | 50                              |
| binlog_cache_size                       | 32768                           |
| binlog_direct_non_transactional_updates | OFF                             |
| binlog_format                           | STATEMENT                       |
| expire_logs_days                        | 0                               |
| general_log                             | OFF                             |
| general_log_file                        | /var/run/mysqld/mysqld.log      |

打開general_log:

mysql> set global general_log = ON;

查看general_log:

tail -f /var/run/mysqld/mysqld.log |grep max_allowed_packet (查看log,但打印大量實時sql操作)

tail -f /var/run/mysqld/mysqld.log |grep max_allowed_packet >1.txt (過濾max_allowed_packet,並輸出到文件1.txt)

果然發現,有以下修改:

 

160804  8:59:41      172 Query    SET GLOBAL max_allowed_packet=1024
          172 Query    SET GLOBAL max_allowed_packet=1024
          173 Query    SET GLOBAL max_allowed_packet=1024
160804  8:59:49      173 Query    SET GLOBAL max_allowed_packet=1024

172 Query SET GLOBAL max_allowed_packet=1024 

了解到general_log 日志中,172 為用戶連接Id(mysql 會對每一個連接分配唯一id),在全量general log中過濾id為172的操作如下:

 (很遺憾,由於機器被攻擊,總監要求對機器進行系統還原,在寫日志時,log被刪除了),大概如下:

 connect root@someipaddress on
   Query select 0x4D5A900..........(verylong)
   Query select sys_exe('cmd /c  c:/windows/nbvqc4.vbs')
   .........
   set global max_allowed_packet 1024
   ........

 從登陸ip 查詢到時美國的一個IP, 操作主要有:從某一網站,下載腳本,並執行;打開mysql相關安全參數,設置相關變量。

至此,非常確定mysql 數據庫被黑客攻擊了。

  • 疑問:

1. mysql部署在內網,外網如何訪問?

  原來,之前便其它合作伙伴提供外網測試環境,讓網管把外網IP,影射到了此機器。導致通過公網IP直接訪問到了此台機器。

驗證:

  1). 通過外網IP, 使用mysql客戶端,可以直接連接到mysql服務。

   2). 通過外網IP, 使用xshell 登陸成功。

2.  黑客怎麼知道了用戶名/密碼?

由於是測試機器,mysql使用了簡單了密碼(root/123456) ,  被猜到,破解太容易了。

3. 防火牆呢?

  由於開啟防火牆,在系統測試時,出現各種麻煩。就關閉了。service iptables status;

[root@bo bryant]# service iptables status;
iptables: Firewall is not running.
[root@bo bryant]# 

4. 黑客是怎麼發現漏洞的,為什麼入侵目的?

猜測大概流程: 通過掃描軟件掃描公網ip, 測試到機器端口未關閉,如22,3306(應對1: 開啟防火牆,只開放服務端口,禁用其它端口外網訪問),嘗試暴力密碼登陸(應對策略2: 復雜密碼策略,可建立白名單,對於多次連接失敗,進行日志記錄和預警)。通過日志發現了,黑客主要操作為:在mysql中調用了系統命令(下載遠程文件,增加執行權限,並執行),打開相關安全參數。

查看機器登陸歷史及登陸失敗歷史,發現近段時間,有大量外網登陸失敗情況,如下圖中oracle, svn ,apache 用戶,黑客通過常用應用的用戶名/密碼在不停的嘗試登陸系統:

producti ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
producti ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
swsoft   ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
swsoft   ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
iraf     ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
iraf     ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
svn      ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
svn      ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
oracle   ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
oracle   ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
root     ssh:notty    217.76.78.35     Mon Aug  1 10:49 - 10:49  (00:00)    
lab      ssh:notty    217.76.78.35     Mon Aug  1 10:48 - 10:48  (00:00)    
lab      ssh:notty    217.76.78.35     Mon Aug  1 10:48 - 10:48  (00:00)    
root     ssh:notty    217.76.78.35     Mon Aug  1 10:48 - 10:48  (00:00)    
root     ssh:notty    217.76.78.35     Mon Aug  1 10:48 - 10:48  (00:00)    
apache   ssh:notty    217.76.78.35     Mon Aug  1 10:48 - 10:48  (00:00)    
apache   ssh:notty    217.76.78.35     Mon Aug  1 10:48 - 10:48  (00:00)    
root     ssh:notty    217.76.78.35     Mon Aug  1 10:48 - 10:48  (00:00)    
root     ssh:notty    217.76.78.35     Mon Aug  1 10:48 - 10:48  (00:00)    
root     ssh:notty    217.76.78.35     Mon Aug  1 10:48 - 10:48  (00:00)    

 

5. 黑客為什麼要修改 max_allowed_packet 1024 ?

修改了max_allowed_packet =1024,將導致所有數據操作,如果返回結果>1024,將報錯。 修改此參數,很容易讓用戶發現數據問題,推測是駭客是故意暴露自己,也許只為了炫耀一下。

  • 總結:

1. 再次證明在遇到復雜技術問題google 比百度要靠譜多

2. 日志分析是解決問題的必須途徑

3. 增加信息安全意識,原來黑客離我們並不遠,如果不是故意暴露自己,我們也不會發現此機器被黑,黑客控制此機器後,可以輕易使用此機器,進行相關非法活動。

 

具體:

1. 外網機器,一定要開啟防火牆,只開放提供服務端口,禁用其它端口。 制定相關安全策略,如記錄登陸用戶ip,定期查看登陸用戶歷史及登陸失敗記錄,對於反復登陸能拒絕登陸。

2. 系統用戶名,應該根據需要確定是否使用root用戶,具體業務最好使用普通用戶權限。因為root用戶,擁有系統系統的全部權限。

3.密碼:用戶密碼一定不要使用簡單密碼,最好使用密碼生成器生成負責密碼(大小寫,特殊字符,長度)

4. 數據安全:

mysql應該給不同業務創建不同用戶,並賦予有限功能權限,禁止root 用戶做業務操作。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved