MySQL部署及加固参考

    技术2022-07-11  96

    Mysql部署及加固参考

    一、安装参考二、加固参考 *[注释] : 以下实验基于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
    Processed: 0.012, SQL: 9