1
1.1
访问 MySQL
MySQL 的相关权限信息主要存放在 grant tables 的系统表中,即 mysql.User 、 mysql.db 、 mysql.Host 、 mysql.table_priv 和、 mysql.column_priv 表中, MySQL 启动时装入内存。应尽量使用 GRANT 、 REVOKE 、 CREATE USER 及 DROP USER
如 :GRANT SELECT.UPDATE,DELETE,INSERT , EXECUTE ON test_shop.* TO ‘ test_guest ’@’localhost’;
查看某用户权限,如 SHOW GRANTS FOR '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 使用新表: > mysqladmin flush-tables
如果要进行写操作,可以解压缩一个压缩的表,恢复原有状态,使用 myisamchk 。 如: myisamchk --unpack ../data/music_shop/ 表名 .MYI
最后,系统上线后,随着数据量的增加,会发现数据目录下的磁盘空间越来越下,造成安全隐患。可以采取两种措施。一种针对 MyISAM 存储引擎的表,在建表时分别指定数据目录和索引目录到不同的磁盘空间,而默认会同时放在数据目录下。另外一种针对 InnoDB 存储引擎的表,因为数据文件和索引文件在一起的,所以无法将它们分离。当磁盘空间不足时,可以增加一个新的数据文件,这个文件放在有充足空间的磁盘上。具体请查阅参数 innodb_data_file_path
1.3
A)、 建立主从数据库集群,采用 MySQL
MySQL
1
2
3
应注意的问题:
由于实现的是异步的复制,所以主从服务器之间存在一定的差距。在从服务器上进行的查询操作要考虑到这些数据的差异,一般只有对实时性要求不高的数据可以通过从服务器查询。
B)、
以下是几点防范的措施:
• 制定一份数据库备份 /
• 启动数据库服务器的二进制变更日志,该功能的系统开销很小 ( 约为 1%)
•
•
• 把 MySQL 的数据目录和备份文件分别放到两个不同的驱动器中,以平衡磁盘 I/O
1.4
根据具体业务要求采取不同措施,目前暂不考虑。
2
2.1
有些版本的 MySQL 安装完之后会安装一个空账号( User = ‘’ ),此账号对 test 数据库有完全权限,为避免此账号登陆后,建立大表,占用磁盘空间,影响系统安全,建议删除( mysql> drop user ‘’@’localhost’;
2.2 给 root
建议以一句话的拼音为口令。如 SET PASSWORD=PASSWORD('woshiyitiaoyu')
并且限定只能通过 localhost
2.3
如: Grant select,insert,update,delete on tablename to ‘username’@’hostname’
2.4 除 root 外,任何用户不应有 mysql 库 user
否则将可以通过修改 root
2.5 不要把 file 、 process 、或 super
会产生保密信息外泄,查看管理员执行的动作,普通用户执行 kill
2.6 LOAD DATA LOCAL
可以任意加载本地文件到数据库。
在 web 环境中,客户从 web 服务器连接,用户可以使用 LOAD DATA LOCAL 语句来读取 web
2.7 使用 MERGE
2.8 DROP TABLE
2.9 REVOKE
grant all privileges on *.* to guest@localhost;
revoke all privileges on *.* from guest@localhost; 不起作用,必须针对每个数据库单独使用 revoke
3
MySQL
3.1 使用 skip-network
在网络上不允许 TCP/IP 连接,所有到数据库的连接必须由命名管道 (Named Pipes) 或共享内存 (Shared Memory) 或 UNIX 套接字 SOCKET 文件进行。这个选项适合应用和数据库共用一台服务器的情况,其他客户端将无法通过网络远程访问数据库,大大增强了数据库的安全性,但同时也带来了管理维护上的不方便。 MySQL 仅能通过命名管道或共享内存 ( 在 widows 中 ) 或 Unix 套接字文件 ( 在 Unix 系统中 )
a)、 服务器上打开此选项(默认关闭)并重启 MySQL
skip-networking
port = 3306
……
b)、
G:\xampp\mysql\bin>mysql -h10.42.1.42 -p3306 -uroot -p
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '10.42.1.42' (10060)
……
c)、
#skip-networking
port = 3306
……
d)、
G:\xampp\mysql\bin>mysql -h10.12.1.42 -p3306 -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.1.41 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
3.2 使用 SSL
SSL ( Secure Socket Layer 安全套接字)是一种安全协议,最初由 Netscape 公司所开发,用以保障在 Internet 上数据传输的安全 ,
应用场景,在主从数据库复制中使用,提供以下服务保障。
a)、
b)、
c)、
在 MySql 中使用 SSL 进行安全传输,需要在命令行或选项文件中设置 ”SSL”
安装证书管理工具
1.
Win32OpenSSL-0_9_8g.exe
2.
双击Win32OpenSSL-0_9_8g.exe 按提示进行安装。安装在C:\OpenSSL
3. 在C:\OpenSSL\bin 目录下创建root ,server ,client
4.
创建根证书,并采用自签名签署它
1.
进入DOS 窗口,进入C:\OpenSSL\bin 路径,然后输入openssl genrsa -out root/root-key.pem 1024 命令,按Enter
2.
继续输入openssl req -new -out root/root-req.csr -key root/root-key.pem ,然后按Enter 键,要求输入一系列信息,可根据实际情况输入,但是CommonName :一定要输入root
3.
继续输入openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650 ,然后按Enter
4.
要先进入证书所在路径 例:C:\OpenSSL\bin\root ,然后输入keytool -printcert -file root-cert.pem ,然后按Enter
创建服务器证书,并采用根证书签署它
1.
进入DOS 窗口,进入C:\OpenSSL\bin 路径,然后输入openssl genrsa -out server/server-key.pem 1024 命令,按Enter
2.
继续输入openssl req -new -out server/server-req.csr -key server/server-key.pem ,然后按Enter 键,要求输入一系列信息,可根据实际情况输入,但是CommonName :一定要输入localhost
3.
继续输入openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650 ,然后按Enter
4.
要先进入证书所在路径 例:C:\OpenSSL\bin\server ,然后输入keytool -printcert -file server-cert.pem ,然后按Enter
创建客户证书,并采用根证书签署它
1.
进入DOS 窗口,进入C:\OpenSSL\bin 路径,然后输入openssl genrsa -out client/client-key.pem 1024 命令,按Enter
2.
继续输入openssl req -new -out client/client-req.csr -key client/client-key.pem ,然后按Enter 键,要求输入一系列信息,可根据实际情况输入,CommonName :输入用户ID
3.
继续输入openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650 ,然后按Enter
4.
要先进入证书所在路径 例:C:\OpenSSL\bin\client ,然后输入keytool -printcert -file client-cert.pem ,然后按Enter
完成以上步骤后,将所生成的证书root 、server 和client 文件夹,拷到C:\mysll 目录下。 至此,已部署完在启动服务器时所用的有关选项指明证书文件和密钥文件。在建立加密连接前,要准备三个文件,一个 CA 证书,是由可信赖第三方出具的证书,用来验证客户端和服务器端提供的证书。 CA 证书可向商业机构购买,也可自行生成。第二个文件是证书文件,用于在连接时向对方证明自已身份的文件。第三个文件是密钥文件,用来对在加密连接上传输数据的加密和解密。 MySQL 服务器端的证书文件和密钥文件必须首先安装,在 myssl 目录里的几个文件: root-cert.pem(CA 证书 ) , server-cert.pem( 服务器证书 ) , server-key.pem( 服务器公共密钥 )
在主数据库创建从数据库操作所用的用户,并指定必须用SLL
CREATE USER 'test_guest'@'localhost' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON music_shop.* TO ' test_guest '@'10.12.1.42' REQUIRE ssl;
关闭主数据库
>mysqladmin -uroot shutdown
重启服务器,使配置生效。
>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 -u test_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
配置完成后,调用 mysql 程序运行 \s 或 SHOW STATUS LIKE 'SSL%' 命令,如果看到 SSL: 的信息行就说明是加密连接了。如果把 SSL 相关的配置写进选项文件,则默认是加密连接的。也可用 mysql 程序的 --skip-ssl