日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

mysql 安全扫描_MySQL 安全和监控 - Can't Wait Any Longer - OSCHINA - 中文开源技术交流社区...

發(fā)布時間:2025/4/5 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 安全扫描_MySQL 安全和监控 - Can't Wait Any Longer - OSCHINA - 中文开源技术交流社区... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)于MySQL安全相關(guān)的監(jiān)控和優(yōu)化,以及數(shù)據(jù)運營。

5.5以后的版本添加了審計功能(類似于general_log,但是記錄更詳細(xì)),時時的審計會消耗一定的性能,因此離線分析也必不可少。

登錄日志

創(chuàng)建登錄日志表:

CREATE TABLE test.t_access_log (

id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,

connection_id INT(11) NOT NULL,

localname VARCHAR(30),

matchname VARCHAR(30)

login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

) ENGINE=MEMORY DEFAULT CHARSET=UTF8;

編輯my.cnf,加入以下行后重啟mysqld:

init-connect='INSERT INTO test.t_access_log(connection_id,localname,matchname) VALUES(CONNECTION_ID(),USER(),CURRENT_USER());

注意 USER() 和 CURRENT_USER() 的區(qū)別

USER():當(dāng)前連接的用戶名和客戶端地址

CURRENT_USER():當(dāng)前認(rèn)證的服務(wù)端用戶名和host,對應(yīng)mysql.user表中的記錄

根據(jù)登錄日志可查詢頻繁登錄的用戶或IP

SELECT SUBSTR(localname,1,LOCATE('@',localname)-1) user,SUBSTR(localname,LOCATE('@',localname)+1) host,COUNT(1) c FROM t_access_log WHERE login_time>NOW()-INTERVAL 1 DAY GROUP BY 1,2 ORDER BY 3 DESC LIMIT 10;

可通過在連接側(cè)使用連接池,或者設(shè)置系統(tǒng) TIME_WAIT狀態(tài)的保持時間來優(yōu)化:

sysctl -w net.ipv4.tcp_fin_timeout=100

grep net.ipv4.tcp_fin_timeout /etc/sysctl.conf

binlog 解析

隨機(jī)選取一個時段的binlog文件,或者選取所有binlog做解析:

ls mysql-bin.0* | sort -R | head -1

然后通過mysqlbinlog工具解析:

mysqlbinlog --set-charset=UTF8 --base64-output=decode-rows -vv mysql-bin.XX

最后統(tǒng)計出執(zhí)行量最大的一些SQL:

# 過濾單行SQL,對于大事務(wù)或跨多行的SQL暫未解析

egrep -i '^(update|delete|replace|insert)'\

# 過濾空格,替換實際數(shù)據(jù)為“?”

| sed -re "s/\\\['\"]//g" -e "s/'[^']*'/?/g" -e 's/"[^"]*"/?/g' -e 's/\t/ /g' -e 's/ +/ /g' -e 's/ ?([!=+,<>*(]) ?/\1/g' -e 's/([=,])?-?[0-9]+(,)?/\1?\2/g' -e 's/[A-Z]/\l&/g' -e 's/`//g'\

# 替換NULL、NOW()等值,保留IFNULL()函數(shù)

-e 's/ifnull/IFNULL/g' -e 's/null|now\(\)/?/g' -e 's/\?[,.]\?/?/g' -e 's/\?[,.]\?/?/g' -e 's/\?[,.]\?/?/g' -e 's/,\(\?\)//g'\

# 由于sed的正則引擎不支持反復(fù)替換,所以臨時用perl

| perl -pe "s/'[^']*'/?/g"\

# 排序取最大前十個SQL

| sort | uniq -c | sort -rnk1 | head -10

統(tǒng)計結(jié)果如下:

統(tǒng)計庫表使用空間

SELECT table_schema '庫名',table_name '表名',engine '引擎',IF(data_length>1024*1024*1024,CONCAT(CAST(data_length/1024/1024/1024 AS DECIMAL(8,2)),' G'),CONCAT(CAST(data_length/1024/1024 AS DECIMAL(8,2)),' M')) '數(shù)據(jù)大小',IF(index_length>1024*1024*1024,CONCAT(CAST(index_length/1024/1024/1024 AS DECIMAL(8,2)),' G'),CONCAT(CAST(index_length/1024/1024 AS DECIMAL(8,2)),' M')) '索引大小' FROM tables WHERE table_schema NOT IN ('information_schema','performance_schema','mysql') ORDER BY data_length DESC,index_length DESC LIMIT 10

結(jié)果集包含如下字段:

庫名

表名

引擎

數(shù)據(jù)大小

索引大小

可以直接用mysql命令導(dǎo)出郵件或csv格式輸出:

mysql --default-character-set=UTF8 information_schema -He "$SQL"

slow-query統(tǒng)計

需要借助percona的工具箱來完成

/usr/local/percona-toolkit/bin/pt-query-digest --history localhost -D test --order-by Query_time:sum --limit 10 --no-report slow_query.log

--history:保存結(jié)果到表中,默認(rèn)是 query_review_history,“-D”指定寫入數(shù)據(jù)庫

--order-by:結(jié)果排序。語法是:字段名:統(tǒng)計方式(包含sum、min、max、cnt)

--no-report:不在終端顯示結(jié)果

--limit:結(jié)果數(shù)量

再通過SQL查詢導(dǎo)出結(jié)果集

SELECT sample 'SQL',ts_min '首次執(zhí)行時間',ts_max '最后執(zhí)行時間',ts_cnt '總次數(shù)',Query_time_sum '總耗時',Query_time_min '最小耗時',Query_time_max '最大耗時',Query_time_pct_95 '95% 耗時',Query_time_median '平均耗時',Lock_time_sum '總鎖時間',Lock_time_min '最小鎖時間',Lock_time_max '最大鎖時間',Lock_time_pct_95 '95% 鎖時間',Lock_time_median '平均鎖時間',Rows_sent_sum '總查詢行數(shù)',Rows_sent_min '最小查詢行數(shù)',Rows_sent_max '最大查詢行數(shù)',Rows_sent_pct_95 '95% 查詢行數(shù)',Rows_sent_median '平均查詢行數(shù)',Rows_examined_sum '總檢索行數(shù)',Rows_examined_min '最小檢索行數(shù)',Rows_examined_max '最大檢索行數(shù)',Rows_examined_pct_95 '95% 檢索行數(shù)',Rows_examined_median '平均檢索行數(shù)' FROM test.query_history ORDER BY ts_cnt DESC,Query_time_sum DESC LIMIT 10

結(jié)果集包含如下字段:

SQL

首次執(zhí)行時間

最后執(zhí)行時間

總次數(shù)

總耗時

最小耗時

最大耗時

95% 耗時

平均耗時

總鎖時間

最小鎖時間

最大鎖時間

95% 鎖時間

平均鎖時間

總查詢行數(shù)

最小查詢行數(shù)

最大查詢行數(shù)

95% 查詢行數(shù)

平均查詢行數(shù)

總檢索行數(shù)

最小檢索行數(shù)

最大檢索行數(shù)

95% 檢索行數(shù)

平均檢索行數(shù)

mysql也可直接將慢查詢?nèi)罩緦懭氡?mysql.slow_log,但是結(jié)果不夠齊全

啟用命令如下:

SET GLOBAL log_output='TABLE';

字符集檢測

使用不符合規(guī)范的字符集的庫表:

SELECT TABLE_COLLATION,GROUP_CONCAT(DISTINCT TABLE_SCHEMA) dbs,GROUP_CONCAT(DISTINCT TABLE_NAME) tbs FROM TABLES WHERE TABLE_TYPE='BASE TABLE' GROUP BY TABLE_COLLATION\G

結(jié)果如下:

索引預(yù)警

查詢未添加索引(包含主鍵)的表,所有表最好都定義顯示主鍵或索引:

SELECT a.TABLE_SCHEMA,a.TABLE_NAME FROM information_schema.TABLES a LEFT JOIN information_schema.STATISTICS b ON a.TABLE_SCHEMA=b.TABLE_SCHEMA AND a.TABLE_NAME=b.TABLE_NAME WHERE TABLE_TYPE='BASE TABLE' AND (INDEX_NAME IS NULL OR INDEX_NAME='');

引擎分布

檢測各類引擎的表數(shù)量,根據(jù)用途來判斷引擎是否合理:

SELECT ENGINE,GROUP_CONCAT(DISTINCT TABLE_SCHEMA) dbs,GROUP_CONCAT(DISTINCT TABLE_NAME) tbs,COUNT(1) c FROM TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','test') GROUP BY ENGINE\G

弱密碼檢測

密碼為空或者是簡單密碼,通常會有一個弱密碼表,用于比對:

SELECT IFNULL(GROUP_CONCAT(CONCAT(user,'@',host) SEPARATOR ', '),'') FROM mysql.user WHERE PASSWORD(user) IN (password,PASSWORD(CONCAT(user,' ')),PASSWORD('123')) AND user!='';

注意5.6之后的版本password字段改成了authentication_string。

連接數(shù)監(jiān)控

連接數(shù)使用率較高時,需要預(yù)警和優(yōu)化:

SELECT COUNT(IF(COMMAND NOT IN ('Sleep','Binlog Dump','Connect','Binlog Dump GTID') AND TIME>1,1,NULL)) '執(zhí)行超過1秒的SQL數(shù)',COUNT(1) '當(dāng)前連接數(shù)' FROM information_schema.PROCESSLIST;

SELECT SUM(c) '連接最多的IP數(shù)',m '最大連接數(shù)',ip '連接最多的IP',c '當(dāng)前連接數(shù)' FROM (SELECT COUNT(1) c,@@max_connections m,SUBSTR(HOST,1,LOCATE(':',HOST)-1) ip FROM information_schema.PROCESSLIST GROUP BY 3 ORDER BY 1 DESC) X;

EOF.

總結(jié)

以上是生活随笔為你收集整理的mysql 安全扫描_MySQL 安全和监控 - Can't Wait Any Longer - OSCHINA - 中文开源技术交流社区...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。