🛢️SQL安全配置
一、关于SQL密码
修改SQL密码
1、使用mysqladmin
命令修改密码
mysqladmin -uroot password [SQL Password]
如果有旧密码这么修改
mysqladm –uroot -p [Old SQL Password] password [New SQL Password]
2、用set password
修改密码
set password for root@localhost=password('[SQL Password]');
3、直接修改user
表里面的密码
mysql> use mysql;
mysql> update user set password=password('[SQL Password]') where user='root';
mysql> flush privileges;
4、直接使用mysql_secure_installation
配置密码
mysql_secure_installation
忘记SQL密码后的恢复
1、关闭sql
systemctl stop XXsql.service
2、修改配置文件
# cd /usr/local/mysql/bin
# ./mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
3、配置SQL
# mysql –uroot
mysql> use mysql;
mysql> update user set password=PASSWORD('mysql') where user='root';
mysql> flush privileges;
mysql> exit;
4、修改SQL配置文件
# vim /etc/my.cnf
写入配置文件
[mysqld]
skip-grant-tables
5、重启SQL
systemctl restart XXsql.service
6、重新进入SQL
# mysql -uroot –p
二、更改SQL默认的root用户名
mysql> use mysql;
mysql> update user set user='[New SQL Administrator Name]' where user='root';
mysql> flush privileges;
PS:更改完成默认的root用户名以后,可以加入一个虚假的(没有任何权限的)root用户,当蜜罐,让黑客来攻击,即使黑客拿下了这个虚假的"root"用户,但是并没有任何权限对数据库进行任何操作。
mysql> create user 'root' identified by '[虚假的SQL Password]';
mysql> lush privileges;
mysql> exit
三、删除默认的数据库和用户
mysql> drop database test;
mysql> use mysql;
mysql> delete from db;
mysql> delete from user where not(host="localhost" and user="root");
mysql> flush privileges;
四、删除命令历史记录
# rm .bash_history .mysql_history
# ln -s /dev/null .bash_history
# ln -s /dev/null .mysql_history
PS:命令记录数量可修改
echo "HISTSIZE=666" >> /etc/profile
echo "HISTFILESIZE=666" >> /etc/profile
# 设置输出条数和储存条数,数值可自行更改
source /etc/profile
# 使更改生效
五、更改SQL配置文件my.cnf
# vim /etc/my.cnf
1、防止SQL对本地文件的存取
在[mysqld]
部分加上一个参数
set-variable=local-infile=0
2、关闭SQL远程连接
在[mysqld]
部分加上一个参数
skip-networking
3、限制连接用户的数量
在[mysqld]
部分加上一个参数
max_user_connections [连接数]
4、禁止服务器重写密码
在[mysqld]
部分加上一个参数
log-raw=OFF
5、阻止grant
语句自动创建用户
在[mysqld]
部分加上一个参数
sql_mode = NO_AUTO_CREATE_USER
6、设置用户密码生存周期
在[mysqld]
部分加上一个参数
default_password_lifetime=[密码有效天数]
7、防止通过共享对象文件加载存在威胁的UDFs函数
有下列值或参数直接删除
allow-suspicious-udfs=TRUE
8、防止开启权限表的限制
在[mysqld]
部分加上一个参数
skip-grant-tables=FALSE
9、禁止数据库用户删除或重名数据文件目录之外的文件
在[mysqld]
部分加上一个参数
skip-symbolic-links=yes
10、禁用memcached协议访问
运行如下命令删除插件
mysql> uninstall plugin daemon_memcached;
11、加入处理非法与丢失的数值
在[mysqld]
部分加上一个参数
sql_mode = STRICT_ALL_TABLES
12、使用独立的普通用户运行SQL
在[mysqld]
部分加上一个参数
user=mysql
PS:绝对不要作为使用root用户运行SQL服务器。除非使用–user=root选项明显指定。应该用普通非特权用户运行SQL服务器。
13、SQL的端口
在[mysqld]
部分加上一个参数
port = [端口号]
更多详细配置文件参考:优快云博客-mysql安全配置
六、控制数据库访问权限
对于使用php脚本来进行交互,最好建立一个用户只针对某个库有 update、select、delete、insert、drop table、create table等权限,这样就很好避免了数据库用户名和密码被黑客查看后最小损失。
创建一个数据库为db1,同时建立一个用户test1能够访问该数据库。
mysql> create database db1;
mysql> grant select,insert,update,delete,create,drop privileges on db1.* to test1@localhost identified by 'admindb';
以上SQL是创建一个数据库db1,同时增加了一个test1用户,口令是admindb,但是它只能从本地连接mysql,对db1库有select,insert,update,delete,create,drop操作权限。
七:示例my.cnf
配置文件
[client]
port = 3306
socket=/home/mysql/data/mysql.sock
[mysqld]
lower_case_table_names=1
user = mysql
#--- 表示MySQL的管理用户
port = 3306
#--- 端口
#basedir=/usr/local/mysql
socket=/home/mysql/data/mysql.sock
#-- 启动的sock文件
datadir=/home/mysql/data
log-bin=/home/mysql/mysql-bin
log-error=/home/mysql/log/mysqld.log
pid-file =/home/mysql/mysqld.pid
bind-address = 0.0.0.0
server-id = 1
#表示是本机的序号为1,一般来讲就是master的意思
skip-grant-tables
skip-name-resolve
# 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,
# 则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求
#skip-networking
back_log = 600
# MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,
# 然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。
# 如果期望在一个短时间内有很多连接,你需要增加它。也就是说,如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,
# 以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。
# 另外,这值(back_log)限于您的操作系统对到来的TCP/IP连接的侦听队列的大小。
# 你的操作系统在这个队列大小上有它自己的限制(可以检查你的OS文档找出这个变量的最大值),试图设定back_log高于你的操作系统的限制将是无效的。
max_connections = 500
# MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。可以过'conn%'通配符查看当前状态的连接数量,以定夺该值的大小。
max_connect_errors = 6000
# 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST。
open_files_limit = 65535
# MySQL打开的文件描述符限制,默认最小1024;当open_files_limit没有被配置的时候,比较max_connections*5和ulimit -n的值,哪个大用哪个,
# 当open_file_limit被配置的时候,比较open_files_limit和max_connections*5的值,哪个大用哪个.
table_open_cache = 128
# MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64
# 假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);
# 当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上
max_allowed_packet = 1000000000
# 接受的数据包大小;增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或MySQLd必须返回大的结果行时MySQLd才会分配更多内存。
# 该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。
binlog_cache_size = 1M
# 一个事务,在没有提交的时候,产生的日志,记录到Cache中;等到事务提交需要提交的时候,则把日志持久化到磁盘。默认binlog_cache_size大小32K
max_heap_table_size = 67108864
# 定义了用户可以创建的内存表(memory table)的大小
📣特别声明
原文地址:SQL安全配置 - 开摆工作室博客 (kbai.cc)
此文章全部都是依靠自己的学习理解来写的原创文章,难免可能会出现有错误的地方,
如果大家以后阅读的时候发现有问题,那就麻烦到下方评论区来进行错误指出,使错误尽快做出改正,
在此,感谢大家的阅读与支持!🤝💦🎉
🍻支持一下
觉得我写的好的话可以支持一下我哦~持续关注我,会更新其他好玩且实用的项目。
👋如果我能帮助到你,那就请我喝杯🧋呗~👇👇👇
我的博客链接:blog.kbai.cc