*[註釋] : 以下實驗基於MySQL5.7.18,centos6.8
一、安裝參考
1、標準用戶
groupadd mysql
useradd mysql -g mysql -s /sbin/nologin
2、解壓並授權
tar xf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /asop/
mv mysql-5.7.18-linux-glibc2.5-x86_64 mysql5.7.18
chown -R mysql.mysql /home/mysql
3、創建相關目錄
mkdir -p /asop/mysql5.7.18/logs/{sock,tmpdir,log,innodb_ts,innodb_log,undo,slowlog,binlog,relaylog}
mkdir -p /asop/mysql5.7.18/data
4、創建鏈接文件
ln –s /asop/mysql5.7.18 /usr/local/mysql
5、創建環境變量
echo 'export PATH=$PATH:/usr/local/mysql/bin/' >> /etc/profile
source /etc/profile
6、創建配置文件
#參考配置文件
vi /etc/my.cnf
[client]
socket=/asop/mysql5.7.18/logs/sock/mysql.sock
default-character-set = utf8
local-infile=0
[mysqld]
user=mysql
port=3307
basedir = /usr/local/mysql
character-set-server=utf8
default-storage-engine = INNODB
server-id=1
collation_server = utf8_bin
log_timestamps=SYSTEM
socket=/asop/mysql5.7.18/logs/sock/mysql.sock
pid-file=/asop/mysql5.7.18/logs/sock/mysql.pid
datadir=/asop/mysql5.7.18/data
tmpdir=/asop/mysql5.7.18/logs/tmpdir
log-error=/asop/mysql5.7.18/logs/log/error.log
slow_query_log = on
long_query_time = 5
slow_query_log_file=/asop/mysql5.7.18/logs/slowlog/slow-query.log
log-bin=/asop/mysql5.7.18/logs/binlog/mysql-bin
relay-log=/asop/mysql5.7.18/logs/relaylog/mysql-relay-bin
innodb_data_home_dir = /asop/mysql5.7.18/logs/innodb_ts
innodb_log_group_home_dir = /asop/mysql5.7.18/logs/innodb_log
innodb_undo_directory = /asop/mysql5.7.18/logs/undo/
local-infile=0
skip_symbolic_links=yes
max_user_connections=200
max_connections =2000
#validate_password_policy=STRONG
#validate_password_length = 9
#validate_password_mixed_case_count= 5
#validate_password_number_count= 2
#validate_password_special_char_count= 1
#connection_control_failed_connections_threshold= 3
#connection_control_max_connection_delay =1800000
#connection_control_min_connection_delay= 600000
wait_timeout=1800
interactive_timeout=1800
[mysqldump]
quick
max_allowed_packet = 2G
default-character-set = utf8
7、初始化數據庫
cd /asop/mysql5.7.18/bin
./mysqld ----initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
8、添加系統服務
cp -ar /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig mysqld on
二、加固參考
修改默認端口
vi /etc/my.cnf
port=3307
清除用戶
#只需要查驗即可,新庫(5.7+)一般不會存在特殊用戶
select user,host from mysql.user;
delete from mysql.user where uer not in ('mysql.sys','mysql.session','mysqlxsys','root','mysql.infoschema') or host not in ('localhost');
設置本機管理員密碼
set password for 'root'@'localhost' = password('P@ssw0rd');
flush privileges;
清除默認庫
#只需要查驗即可,新庫(5.7)不存在測試庫
show databases;
drop database test;
創建遠程管理員賬戶
#避免直接使用root作爲遠程管理賬戶
grant all on *.* to 'asop'@'%' identified by 'P@ssw0rd' with grant option;
確保讀取本地文件的參數設置爲失效
Mysql命令行下,使用如下命令:
show variables where variable_name = 'local_infile';
查看結果是否爲OFF。
如果該命令爲ON,則數據庫用戶可以通過LOAD DATA INFILE 或者 SELECT local_file 讀取到數據庫所在操作系統本地的文件,在這種情況下,需要在mysql配置文件中新增如下內容:
[mysqld]
local-infile=0
[client]
local-infile=0
或者臨時生效使用 set global local_infile=off;
然後重啓數據庫服務。
開啓錯誤日誌
show variables like 'log_error';
#確保結果不爲空,建議將日誌保存至非系統分區
vi /etc/my.cnf
[mysqld_safe]
log-error=/asop/mysql57/log/errorlog/mysql_error.log
檢查是否存在匿名賬戶
select * from mysql.user where user='';
#存在則刪除
delete from user where user='';
禁用符號鏈接
vi /etc/my.cnf
[mysqld]
skip_symbolic_links=yes
限制單個用戶的連接數量
#0爲不限制,可以無限建立連接,直到數據庫無法提供響應
#查看現有配置
show variables like 'max_user_connections';
vi /etc/my.cnf
[mysqld]
max_user_connections=200
設置MySQL的最大連接數
#默認設置爲151,增大此值可以使數據庫響應更多的連接
#查看現有配置
show variables like 'max_connections';
vi /etc/my.cnf
[mysqld]
max_connections = 3000
開啓慢查詢日誌
#查詢慢查詢的定義時間
show variables like 'long_query_time';
#查詢慢查詢配置及路徑
show status like '%slow_queries%';
show variables like '%slow%';
vi /etc/my.cnf
slow_query_log = on
long_query_time = 5
slow_query_log_file=/asop/mysql5.7.18/logs/slowlog/slow-query.log
設置密碼複雜度策略
#MySQL密碼複雜度依賴於validate_password插件,需要確認所用的版本中是否支持此插件
#查看MySQL安裝目錄下面的 $mysql_basedir/lib/plugin 中是否存在validate_password.so文件
#檢查mysql是否已經安裝validate_password插件
show plugins;
#安裝插件
install plugin validate_password soname 'validate_password.so'
#查看默認策略
show variables like 'validate_password%';
vi /etc/my.cnf
#設置策略爲最高級,需要同時滿足長度和複雜度的要求,且要求密碼不能存放到字典中
validate_password_policy STRONG
#密碼要求的最小長度
validate_password_length= 13
#需要滿足的大小寫字母數
validate_password_mixed_case_count= 5
#需要滿足的數字的個數
validate_password_number_count= 2
#需要滿足的特殊字符數
validate_password_special_char_count= 1
開啓登陸失敗處理功能
#MySQL密碼複雜度依賴於connection_control插件,需要確認所用的版本中是否支持此插件
#查看MySQL安裝目錄下面的 $mysql_basedir/lib/plugin 中是否存在connection_control.so文件
#插件安裝
install plugin connection_control soname 'connection_control.so'
show variables like 'connection%';
vi /etc/my.cnf
#允許密碼失敗的次數
connection_control_failed_connections_threshold= 3
#鎖定的最長時間
connection_control_max_connection_delay =1800000
#鎖定的最短時間(毫秒)
connection_control_min_connection_delay= 600000
設置超時時間
#查看當前超時時間設置,根據使用場景來進行設置,若使用連接池進行連接,需要調整連接池的空閒丟棄連接的時間(maxidletime)小於以下設置的兩個值,若需要維持連接,則使用連接池進行檢查是否存在空閒連接,併發送一條查詢命令,維持連接,避免出現
連接池將已經被MySQL丟棄的超時連接繼續分配給連接池使用,導致程序報錯。
show global variables like '%timeout%';
vi /etc/my.cnf
wait_timeout=1800
interactive_timeout=1800
設置資源使用及審計功能
#根據場景進行設置
參考:https://blog.csdn.net/woshiji594167/article/details/103313980