十年网站开发经验+多家企业客户+靠谱的建站团队
量身定制+运营维护+专业推广+无忧售后,网站问题一站解决
摘至网页链接
常见Mysql配置文件:linux系统下是my.conf,windows环境下是my.ini;
数据库整体安全需求:机密性、完整性、可用性;
1、操作系统级别安全配置
1.1不要将数据库放在系统分区
Windows系统:直接检查是否将数据库放置在C盘。
Linux系统:
在终端连接上mysql数据库,执行如下命令:
showvariableswherevariable_name='datadir';
然后返回shell命令行:
df-hdatadir
其中datadir是上一条命令的返回值。
上述命令的返回值不应是/、/var、/usr
1.2使用专用的最小权限账号运行mysql数据库进程
Windows系统:直接打开任务管理器,查看运行mysql进程的操作系统账号,不能为administrator账号。
Shell命令行运行如下命令:
ps-ef|grepmysql
查看mysql服务的运行账号是否为root或其他高权限账号,如果是的,则需要创建一个非管理员专用账号来运行mysql服务。
1.3禁止使用mysql命令行历史记录
执行如下命令:
find/-name".mysql_history"
查看是否存在mysql的历史命令记录文件,如果存在,则需要进行如下加固:
(1)删除.mysql_history文件;
(2)设置环境变量MYSQL_HISTFILE为/dev/null,并添加到shell的初始化脚本中,创建mysql_history到/dev/null的链接:
ln-s/dev/null$HOME/.mysql_history
1.4确保MYSQL_PWD环境变量未设置敏感信息
Windows系统下进入cmd命令行,使用如下命令:
Set
查看是否设置了环境变量MYSQL_PWD。
Linux系统下使用如下命令:
grepMYSQL_PWD/proc/*/environ
查看MYSQL_PWD环境变量是否设置了敏感信息。
确认那个配置文件或脚本设置了MYSQL_PWD环境变量。
2、安装
2.1使用数据库专用服务器
使用专用的服务器安装mysql服务可以减少mysql服务的攻击面,尽量卸载或删除操作系统上的不必要的应用或服务,减少其他应用的安装可能给mysql的运行带来的安全风险。
2.2不要复用数据库账号
运行mysql服务的操作系统账号不要用来运行其他应用或服务,这样可以避免其他应用或服务器被攻击给mysql服务带来影响。
2.3历史命令行密码设置为不可见
使用如下命令:
mysql-uadmin-ppassword
连接mysql数据库服务,退出后查看历史命令,确认password是否为明文。
(1)先输入mysql-uadmin-p
(2)根据命令行提示输入密码;
而不要在一整条命令中输入密码。
另外要控制mysql配置文件访问权限。
3、文件权限控制
3.1控制数据目录的访问权限
数据目录是mysql数据库存放的位置,在mysql命令行界面下执行如下命令:
在终端命令行下执行如下命令:
ls-ldatadir/..|egrep"^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"
其中datadir是第一条命令的执行结果
如果存在问题,linux环境下在终端执行如下命令进行加固:
chmod700datadir
chownmysql:mysqldatadir
3.2控制二进制日志文件的权限
mysql的运行会产生很多日志,例如二进制日志、错误日志、慢查询日志等等,Mysql命令行下执行如下命令:
showvariableslike'log_bin_basename';
在终端命令行执行如下命令:
lslog_bin_basename.*
对于发现的每一个文件,执行如下命令:
ls-llog_bin_basename.nnnnn|egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod660logfile
chownmysql:mysqllogfile
3.3控制错误日志文件的权限
Mysql命令行下执行如下命令:
showvariableslike'log_error';
lslog_error.*
ls-llog_error|egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"
3.4控制慢查询日志文件的权限
showvariableslike'slow_query_log_file';
lsslow_query_log_file.*
ls-lslow_query_log_file|egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"
3.5控制通用日志文件的权限
showvariableslike'general_log_file';
lsgeneral_log_file.*
ls-lgeneral_log_file|egrep"^-[r|w]{2}-[r|w]{2}----\s*.*$"
3.6控制审计日志文件的权限
showglobalvariableswherevariable_name='audit_log_file';
在终端执行如下命令:
ls-laudit_log_file|egrep"^-rw[-x]rw[-x][-r][-w][-x][\t]*[0-9][\t]*mysql[
\t]*mysql.*$"
chmod660audit_log_file
chownmysql:mysqlaudit_log_file
4、通用安全
4.1安装最新的补丁
在mysql命令行下查询MySQL的版本:
SHOWVARIABLESWHEREVariable_nameLIKE"version";
确认是否由需要安装的补丁包,如果有请安装。
4.2删除test数据库
Mysql数据库默认安装好后,存在一个名为test的数据库,如果存在,请执行如下命令删除:
Dropdatabase“test”
4.3确保读取本地文件的参数设置为失效
Mysql命令行下,使用如下命令:
SHOWVARIABLESWHEREVariable_name='local_infile';
查看结果是否为OFF。
如果该命令为ON,则数据库用户可以通过LOADDATAINFILE或者SELECTlocal_file读取到数据库所在操作系统本地的文件,在这种情况下,需要在mysql配置文件中新增一行:
Local-infile=0;
然后重启数据库服务。
5、权限配置
5.1控制可以访问所有数据库的账号
Mysql数据库下的user表和db表中存放着可以授予数据库用户的权限,确保只有管理员账号才能访问所有数据库。可以访问mysql数据库的用户或许可以查看密码哈希值、修改用户权限等等。
使用如下sql语句:
SELECTuser,hostFROMmysql.user
WHERE(Select_priv='Y')OR(Insert_priv='Y')OR(Update_priv='Y')
OR(Delete_priv='Y')OR(Create_priv='Y')OR(Drop_priv='Y');
SELECTuser,hostFROMmysql.dbWHEREdb='mysql'
AND((Select_priv='Y')OR(Insert_priv='Y')OR(Update_priv='Y')
OR(Delete_priv='Y')OR(Create_priv='Y')OR(Drop_priv='Y'));
确保返回结果只能是数据库管理员账号。
5.2限制非管理员用户的权限
Mysql.user表中的权限列有:
file_priv:表示是否允许用户读取数据库所在主机的本地文件;
Process:表示是否允许用户查询所有用户的命令执行信息;
Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;
Shutdown_priv:表示用户是否可以关闭数据库;
Create_user_priv:表示用户是否可以创建或删除其他用户;
Grant_priv:表示用户是否可以修改其他用户的权限;
应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:
selectuser,hostfrommysql.userwhereFile_priv='Y';
selectuser,hostfrommysql.userwhereProcess_priv='Y';
SELECTuser,hostFROMmysql.userWHEREShutdown_priv='Y';
SELECTuser,hostFROMmysql.userWHERECreate_user_priv='Y';
SELECTuser,hostFROMmysql.userWHEREGrant_priv='Y';
SELECTuser,hostFROMmysql.dbWHEREGrant_priv='Y';
确保查询结果中不存在非管理员用户。
如果存在非管理员用户,使用如下命令进行权限回收:
REVOKEFILEON*.*FROM'user';
REVOKEPROCESSON*.*FROM'user';
REVOKESUPERON*.*FROM'user';
REVOKESHUTDOWNON*.*FROM'user';
REVOKECREATEUSERON*.*FROM'user';
REVOKEGRANTOPTIONON*.*FROMuser;
其中user为上述查询到的非管理员用户。
SELECTUser,Host,DbFROMmysql.dbWHERESelect_priv='Y'
ORInsert_priv='Y'ORUpdate_priv='Y'ORDelete_priv='Y'ORCreate_priv='Y'
ORDrop_priv='Y'ORAlter_priv='Y';
REVOKESELECTONhost.databaseFROMuser;
REVOKEINSERTONhost.databaseFROMuser;
REVOKEUPDATEONhost.databaseFROMuser;
REVOKEDELETEONhost.databaseFROMuser;
REVOKECREATEONhost.databaseFROMuser;
REVOKEDROPONhost.databaseFROMuser;
REVOKEALTERONhost.databaseFROMuser;
6、审计和日志
6.1开启错误日志审计功能
错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:
SHOWvariablesLIKE'log_error';
6.2确保日志存放在非系统区域
日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:
SELECT@@global.log_bin_basename;
确保返回结果不是如下路径:/、/var、/usr
6.3关闭原始日志功能
原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:
Log-raw=OFF
7、认证
7.1Old_passwords环境变量设置
Old_passwords决定了使用PASSWORD()函数和IDENTIFIEDBY、CREATEUSER、GRANT等语句是时的hash算法:
0-authenticatewiththemysql_native_passwordplugin
1-authenticatewiththemysql_old_passwordplugin
2-authenticatewiththesha256_passwordplugin
SHOWVARIABLESWHEREVariable_name='old_passwords';
确保返回值不为1。
7.2secure_auth选项设置
如果客户端采用Old_passwords发起连接请求,如果服务器端设置了secure_auth,则客户端会拒绝连接请求,可以根据安全需求在配置文件中做相应配置。
7.3密码保存
确保密码没有明文保存在全局配置文件中。
SELECTUser,host
FROMmysql.user
WHERE(pluginIN('mysql_native_password','mysql_old_password')
AND(LENGTH(Password)=0
ORPasswordISNULL))
OR(plugin='sha256_password'ANDLENGTH(authentication_string)=0);
7.5不存在空账号
使用如下命令查询是否存在空账号:
SELECTuser,hostFROMmysql.userWHEREuser='';
8、网络设置
如果mysql数据库服务器与应用是跨信任域部署的,则需要考虑在数据库服务器与应用服务器之间建立ssl通道进行数据传输,不过这种场景一般很少见,在此不详细描述。
9、数据库备份
Mysql会自动开启3306端口用于远程连接mysql服务.3306端口就是MySQL的默认端口,但是黑客可以通过它来攻击你的主机系统.服务器默认MySQL端口是3306,最近经常被扫描,甚至扫描到网站很慢或者打不开.如果不需要远程数据库连接就可以让Mysql关闭3306端口,既提高了访问速度,又提高了安全性.避免远程连接mysql数据库.本地程序可以通过mysql.sock来连接,不影响使用.
SSH到主机上输入下面的命令:
vi/etc/my.cnf
在[mysqld]下添加:
skip-networking
最后重启Mysql
servicemysqldrestart
检查Mysql是否正常运行
servicemysqldstatus
应该是有人想暴力破解你的密码,做好安全防护,及时修改账户密码,设置的复杂些。查看下是什么IP在操作,禁止它访问
--配置文件增加以下配置(按需求)
[mysqld]
plugin-load-add=connection_control.so
connection-control=FORCE
connection-control-failed-login-attempts=FORCE
connection_control_min_connection_delay=1000
connection_control_max_connection_delay=86400
connection_control_failed_connections_threshold=5
--插件动态安装启用
--验证是否正常安装
+-------------------------------------------------+------------+
|Variable_name|Value|
|connection_control_failed_connections_threshold|3|
|connection_control_max_connection_delay|2147483647|
|connection_control_min_connection_delay|1000|
--定制化配置(动态)
--查看修改后的配置
+-------------------------------------------------+-------+
|connection_control_max_connection_delay|86400|
connection_control_failed_connections_threshold
失败尝试的次数,默认为3,表示当连接失败3次后启用连接控制,0表示不开启
connection_control_max_connection_delay
connection_control_min_connection_delay
--重新配置connection_control_failed_connections_threshold变量,该表记录会被删除(重置)