大家知道如何正确配置MySQL么?mysql配置包含了很多方面,例如MySQL的安全配置,今天给大家介绍下mysql的安全配置。
MySQL安全配置
1安全策略
1.1管理意义上的数据安全
访问MySQL数据库必须首先访问数据库的某个权限、即以某个权限模式用户的身份登录,大部分的安全管理主要通过模式用户的权限来实现。
MySQL的相关权限信息主要存放在granttables的系统表中,即mysql.User(全局级别权限)、mysql.db(数据库级别权限)、mysql.Host(数据库级别权限)、mysql.table_priv(表级别权限)和、mysql.column_pr(列级别权限)表中,MySQL启动时装入内存。应尽量使用GRANT、REVOKE、CREATEUSER及DROPUSER来进行用户和权限的变更操作。如:GRANTSELECT.UPDATE,DELETE,INSERT,EXECUTEONtest_shop.*TO‘test_guest‘@’localhost’;
查看某用户权限,如SHOWGRANTSFOR‘test_guest’@’localhost‘
1.2防范故障角度的数据安全
数据文件是操作系统级的对象,因此一般来讲具有相当的脆弱性、而且依赖于操作系统的性能特点。由于磁盘介质的因素、一个大的数据文件上个别数据块的损坏可能导致整个数据文件的不可用,这对一个系统来说是灾难性的,而且大的表空间或数据文件的恢复是困难和耗时的。
巨大对象的分区在性能角度之外也有安全的因素,当磁盘错误使一个巨大表中一个单独的数据块不能读写时可能导致整个表不可用,必须恢复包含该表的整个表空间。
考虑到数据仓库问题。可以进行以下操作:
对数据量大且不进行写操作的表,使用myisampack工具,生成压缩、只读MyISAM表。可以压缩40%-50%的表文件空间。具体操作如下:
A压缩文件:>myisampack../data/music_shop/表名.MYI
B重建索引:>myisamchk-rq–sort-index–analyze../data/test_shop/表名.MYI
C强制mysqld使用新表:>mysqladminflush-tables
如果要进行写操作,可以解压缩一个压缩的表,恢复原有状态,使用myisamchk。如:myisamchk–unpack../data/music_shop/表名.MYI
最后,系统上线后,随着数据量的增加,会发现数据目录下的磁盘空间越来越下,造成安全隐患。可以采取两种措施。一种针对MyISAM存储引擎的表,在建表时分别指定数据目录和索引目录到不同的磁盘空间,而默认会同时放在数据目录下。另外一种针对InnoDB存储引擎的表,因为数据文件和索引文件在一起的,所以无法将它们分离。当磁盘空间不足时,可以增加一个新的数据文件,这个文件放在有充足空间的磁盘上。具体请查阅参数innodb_data_file_path设置。
1.3容灾与备份机制
建立主从数据库集群,采用MySQL复制
MySQL复制的优点:
1如果主服务器出现问题,可以快速切换到从服务器;
2可以在从服务器上执行查询操作,降低主服务器的访问压力;
3可以在从服务器上执行备份,以避免备份期间影响主服务器的;
应注意的问题:
由于实现的是异步的复制,所以主从服务器之间存在一定的差距。在从服务器上进行的查询操作要考虑到这些数据的差异,一般只有对实时性要求不高的数据可以通过从服务器查询。
定期备份文件与数据,通过各种方式保存文件与数据。
以下是几点防范的措施:
制定一份数据库备份/恢复计划,并对计划进行仔细测试。
启动数据库服务器的二进制变更日志,该功能的系统开销很小(约为1%),二进制日志包含备份后进行的所有更新,我们没有理由不这样做。(log-bin=file,file可以不指定)
定期检查数据表,防范于未燃。
定期对备份文件进行备份,以防备份文件失效。
把MySQL的数据目录和备份文件分别放到两个不同的驱动器中,以平衡磁盘I/O和增加数据的安全。
2安全隐患
2.1正确设置目录权限
设置目录权限的原则是软件和数据分开,具体如下:
1.将mysql安装在单独的用户下
2.安装时,以root用户进行安装,mysql的软件默认都为root权限
3.安装完毕后,将数据目录权限设置为实际运行mysql的用户权限,比如:
Chown–Rmysql:mysql/home/mysql/data
2.2尽量避免以root权限运行mysql
将4.1的目录权限设置完毕后,启动、停止mysql以及日常的维护工作都可以在
mysql用户下进行,没有必要su到root后再用—user=mysql来启动和关闭mysql,
这样就没有必要授权维护人员root权限,而且最重要的一定是因为任何具有FILE权限的用户能够用root创建文件。
2.3删除匿名账号
#p#分页标题#e#
有些版本的MySQL安装完之后会安装一个空账号(User=‘‘),此账号对test数据库有完全权限,为避免此账号登陆后,建立大表,占用磁盘空间,影响系统安全,建议删除
dropuser''@'localhost';
dropuser''@'localhost.localdomain’;
2.4给root账号设置口令
建议以一句话的拼音为口令。如SETPASSWORD=PASSWORD(‘woshiyitiaoyu’)
并且限定只能通过localhost访问。
2.5只授予账号必须的权限
如:Grantselect,insert,update,deleteontablenameto‘username’@’hostname’
2.6除root外,任何用户不应有mysql库user表的存取权限
如果拥有mysql库中user表的存取权限(select、update、insert、delete),就
可以轻易的增加、修改、删除其他的用户权限,造成系统的安全隐患。
如:usemysql;deletefromdbwhereuser<>‘root’anddb=‘mysql’
2.7不要把file、process、或super权限授予管理员以外的账号
会产生保密信息外泄,查看管理员执行的动作,普通用户执行kill命令等严重的安全隐患。
FILE权限可以被滥用于将服务器主机上MySQL能读取的任何文件读入到数据库表中。包括任何人可读的文件和服务器数据目录中的文件。可以使用SELECT访问数据库表,然后将其内容传输到客户端上。不要向非管理用户授予FILE权限。
有这权限的任何用户能在拥有mysqld守护进程权限的文件系统那里写一个文件!为了更加安全,由SELECT…INTOOUTFILE生成的所有文件对每个人是可写的,并且你不能覆盖已经存在的文件。
file权限也可以被用来读取任何作为运行服务器的Unix用户可读取或访问的文件。使用该权限,你可以将任何文件读入数据库表。这可能被滥用,例如,通过使用LOADDATA装载“/etc/passwd”进一个数据库表,然后能用SELECT显示它。PROCESS权限能被用来察看当前执行的查询的明文文本,包括设定或改变密码的查询。
SUPER权限能用来终止其它用户或更改服务器的操作方式。比如kill进程不要将PROCESS或SUPER权限授给非管理用户。mysqladminprocesslist的输出显示出当前执行的查询正文,如果另外的用户发出一个UPDATEuserSETpassword=PASSWORD('not_secure')查询,被允许执行那个命令的任何用户可能看得到
2.8LOADDATALOCAL带来的安全问题
由MySQL服务器启动文件从客户端向服务器主机的传输。理论上,打过补丁的服务器可以告诉客户端程序传输服务器选择的文件,而不是客户用LOADDATA语句
指定的文件。这样服务器可以访问客户端上客户有读访问权限的任何文件。
在Web环境中,客户从Web服务器连接,用户可以使用LOADDATALOCAL来读取Web服务器进程有读访问权限的任何文件(假定用户可以运行SQL服务器的任何命令)。在这种环境中,MySQL服务器的客户实际上是Web服务器,而不是连接Web服务器的用户运行的程序。
解决方法:
可以用–local-infile=0选项启动mysqld从服务器端禁用所有LOADDATA
LOCAL命令。
对于mysql命令行客户端,可以通过指定–local-infile[=1]选项启用LOAD
DATALOCAL,或通过–local-infile=0选项禁用。类似地,对于mysqlimport,–localor-L选项启用本地数据文件装载。在任何情况下,成功进行本地装载需要服务器启用相关选项。
2.9使用MERGE存储引擎潜藏的安全漏洞
Merge表在某些版本中可能存在以下安全漏洞:
用户A赋予表T的权限给用户B
用户B创建一个包含T的merge表,做各种操作
用户A收回对T的权限
安全隐患:用户B通过merge表仍然可以访问表A中的数据
2.10尽量避免通过symlinks访问表
不要允许使用表的符号链接。(可以用–skip-symbolic-links选项禁用)。如果你
用root运行mysqld则特别重要,因为任何对服务器的数据目录有写访问权限的人
则能够删除系统中的任何文件!
2.11防止DNS欺骗
如果你不信任你的DNS,你应该在授权表中使用IP数字而不是主机名。在任何情况下,你应该非常小心地使用包含通配符的主机名来创建授权表条目!
2.12DROPTABLE命令并不收回以前的相关访问授权
drop表的时候,其他用户对此表的权限并没有被收回,这样导致重新创建同名的表时,以前其他用户对此表的权限会自动赋予,导致权限外流。
因此,要在删除表时,同时取消其他用户在此表上的相应权限。
2.13REVOKE命令漏洞
grantallprivilegeson*.*toguest@localhost;后
revokeallprivilegeson*.*fromguest@localhost;不起作用,必须针对每个数据单独使用revoke
2.14如果可能,给所有用户加上访问IP限制
给所有用户加上ip限制将拒绝所有未知的主机进行的连接,保证只有受信任的主
机才可以进行连接。例如:
Grantselectondbname.*to‘username’@’ip’identifiedby’passwd’;
2.15严格控制操作系统帐号和权限
在数据库服务器上要严格控制操作系统的帐号和权限,比如:
锁定mysql用户
其他任何用户都采取独立的帐号登陆,管理员通过普通用户管理mysql;或者通过rootsu到mysql用户下进行管理。
禁止修改mysql用户下的任何资源
2.16增加防火墙
购买防火墙。这样可以保护你防范各种软件中至少50%的各种类型的攻击。把MySQL放到防火墙后或隔离区(DMZ)
2.17严格模式
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
2.18限制MYSQL的访问目录
–chroot
2.19防止在连接MYSQL是使用TCP/IP套接字
–skip-networking
2.20防止连接到MYSQL数据库时使用主机名
–skip-name-resolve
2.21防止没有SHOWDATABASES权限的用户使用此命令
–skip-show-database
2.22如果对user表没有INSERT权限,可以防止这些用户通过GRANT命令创建用户
–safe-user-create
3其他安全配置
MySQL本身带有一些选项,适当的使用这些选项将会使数据库更加安全。
3.1使用skip-network
#p#分页标题#e#
在网络上不允许TCP/IP连接,所有到数据库的连接必须由命名管道(NamedPipes)或共享内存(SharedMemory)或UNIX套接字SOCKET文件进行。这个选项适合应用和数据库共用一台服务器的情况,其他客户端将无法通过网络远程访问数据库,大大增强了数据库的安全性,但同时也带来了管理维护上的不方便。MySQL仅能通过命名管道或共享内存(在widows中)或Unix套接字文件(在Unix系统中)来和客户端连接交互。以下为配置实例:
skip-networking
-S是–socket的简写形式,如:-s/tmp/mysql.sock,而其值必须和服务端设置的相同
–protocol是严格指定连接类型,如果一些设置使用默认值时,如Windows下服务器端设置–socket=mysql(mysql是默认值),在连接时指定–protocol=pipe后–socket=mysql可省略指定。
1.命名管道
只适合在Windows系统下用来连接本机的MySQL,性能可比一般的TCP/IP方式提升30%~50%。
服务端设置要求
enable-named-pipe#或named_pipe=ON
socket=MySQL
客户端连接
mysql–protocol=pipe–socket=mysql
2.共享内存
4.1版本后,mysql对windows系统还提供了共享内存方式的连接
服务端设置要求
shared-memory=ON
shared_memory_base_name=MYSQL
客户端连接
mysql–protocol=memory–shared-memory-base-name=mysql
3.UNIX套接字
Linux和unix环境下,可以使用unix域套接字,来连接同在一台机器上的mysql;
服务端设置要求
socket=/tmp/mysql.sock
客户端连接
mysql–protocol=socket–socket=/tmp/mysql.sock
3.2allow-suspicious-udfs
该选项控制是否可以载入主函数只有xxx符的用户定义函数。默认情况下,该选项被关闭,并且只能载入至少有辅助符的UDF。这样可以防止从未包含合法UDF的共享对象文件载入函数。
3.3old-passwords
强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。
3.4safe-user-create
如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT
权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:
mysql>GRANTINSERT(user)ONmysql.userTO'user_name'@'host_name';
这样确保用户不能直接更改权限列,必须使用GRANT语句给其它用户授予该权限。
3.5secure-auth
不允许鉴定有旧(pre-4.1)密码的账户
3.6skip-grant-tables
这个选项导致服务器根本不使用权限系统。这给每个人以完全访问所有的数据库的权力!(通过执行mysqladminflush-privileges或mysqladminreload命令,或执行FLUSHPRIVILEGES语句,你能告诉一个正在运行的服务器再次开始使用授权表。)
3.7skip-show-database
使用该选项,只允许有SHOWDATABASES权限的用户执行SHOWDATABASES语句,该
语句显示所有数据库名。不使用该选项,允许所有用户执行SHOWDATABASES,但
只显示用户有SHOWDATABASES权限或部分数据库权限的数据库名。请注意全局权
限指数据库的权限。
3.8使用SSL
#p#分页标题#e#
SSL(SecureSocketLayer安全套接字)是一种安全协议,最初由Netscape公司所开发,用以保障在Internet上数据传输的安全,利用数据加密技术,可确保数据在网络上的传输过程中不会被截取。
应用场景,在主从数据库复制中使用,提供以下服务保障。
a)认证用户和服务器,确保数据发送到正确的客户和服务器。
b)加密数据以防止数据中途被窃取。
c)维护数据的完整性,确保数据在传输过程中不被破坏。
在MySql中使用SSL进行安全传输,需要在命令行或选项文件中设置‘SSL’选项。下面以命令行为例,进行安装介绍。
A.安装证书管理工具
a)所需部件Win32OpenSSL-0_9_8g.exe,可从网上下载
b)安装双击Win32OpenSSL-0_9_8g.exe按提示进行安装。安装在C:\\OpenSSL目录下
c)在C:\\OpenSSL\\bin目录下创建root,server,client三个子路径
d)在创建证书时输入的用户名,密码请妥善保存
B.创建根证书,并采用自签名签署它
a)创建私钥进入DOS窗口,进入C:\\OpenSSL\\bin路径,然后输入opensslgenrsa-outroot/root-key.pem1024命令,按Enter键。
b)创建证书请求继续输入opensslreq-new-outroot/root-req.csr-keyroot/root-key.pem,然后按Enter键,要求输入一系列信息,可根据实际情况输入,但是CommonName:一定要输入root
c)自签署根证书继续输入opensslx509-req-inroot/root-req.csr-outroot/root-cert.pem-signkeyroot/root-key.pem-days3650,然后按Enter键
d)查看根证书内容要先进入证书所在路径例:C:\\OpenSSL\\bin\\root,然后输入keytool-printcert-fileroot-cert.pem,然后按Enter键。
C.创建服务器证书,并采用根证书签署它
a)创建私钥进入DOS窗口,进入C:\\OpenSSL\\bin路径,然后输入opensslgenrsa-outserver/server-key.pem1024命令,按Enter键。
b)创建证书请求继续输入opensslreq-new-outserver/server-req.csr-keyserver/server-key.pem,然后按Enter键,要求输入一系列信息,可根据实际情况输入,但是CommonName:一定要输入localhost或服务器的域名(存在域名情况下)。
c)签署服务器证书继续输入opensslx509-req-inserver/server-req.csr-outserver/server-cert.pem-signkeyserver/server-key.pem-CAroot/root-cert.pem-CAkeyroot/root-key.pem-CAcreateserial-days3650,然后按Enter键。
d)查看服务器证书内容要先进入证书所在路径例:C:\\OpenSSL\\bin\\server,然后输入keytool-printcert-fileserver-cert.pem,然后按Enter键。
D.创建客户证书,并采用根证书签署它
a)创建私钥进入DOS窗口,进入C:\\OpenSSL\\bin路径,然后输入opensslgenrsa-outclient/client-key.pem1024命令,按Enter键。
b)创建证书请求继续输入opensslreq-new-outclient/client-req.csr-keyclient/client-key.pem,然后按Enter键,要求输入一系列信息,可根据实际情况输入,CommonName:输入用户ID。
c)签署客户证书继续输入opensslx509-req-inclient/client-req.csr-outclient/client-cert.pem-signkeyclient/client-key.pem-CAroot/root-cert.pem-CAkeyroot/root-key.pem-CAcreateserial-days3650,然后按Enter键。
d)查看客户证书内容要先进入证书所在路径例:C:\\OpenSSL\\bin\\client,然后输入keytool-printcert-fileclient-cert.pem,然后按Enter键。
完成以上步骤后,将所生成的证书root、server和client文件夹,拷到C:\\mysll目录下。至此,已部署完在启动服务器时所用的有关选项指明证书文件和密钥文件。在建立加密连接前,要准备三个文件,一个CA证书,是由可信赖第三方出具的证书,用来验证客户端和服务器端提供的证书。CA证书可向商业机构购买,也可自行生成。第二个文件是证书文件,用于在连接时向对方证明自已身份的文件。第三个文件是密钥文件,用来对在加密连接上传输数据的加密和解密。MySQL服务器端的证书文件和密钥文件必须首先安装,在myssl目录里的几个文件:root-cert.pem(CA证书),server-cert.pem(服务器证书),server-key.pem(服务器公共密钥)。
在主数据库创建从数据库操作所用的用户,并指定必须用SLL认证。
CREATEUSER‘test_guest’@’localhost’IDENTIFIEDBY‘1234’;
GRANTALLPRIVILEGESONmusic_shop.*TO‘test_guest‘@’10.12.1.42’REQUIREssl;
关闭主数据库
>mysqladmin-urootshutdown
重启服务器,使配置生效。
>mysqld–ssl-ca=C:\\myssl\\server\\root-cert.pem–ssl-cert=C:\\myssl\\server\\server-cert.pem–ssl-key=C:\\myssl\\server\\server-key.pem
用从数据库客户程序建立加密连接。
>mysql-utest_guest–ssl-ca=C:\\myssl\\client\\root-cert.pem–ssl-cert=C:\\myssl\\client\\client-cert.pem–ssl-key=C:\\myssl\\client\\client-key.pem
#p#分页标题#e#
配置完成后,调用mysql程序运行\\s或SHOWSTATUSLIKE‘SSL%’命令,如果看到SSL:的信息行就说明是加密连接了。如果把SSL相关的配置写进选项文件,则默认是加密连接的。也可用mysql程序的–skip-ssl选项取消加密连接。