常见问题及解决方法
1. localhost作为连接参数 $ mysql --host=localhost,默认使用unix socket而非tcp 使用ssh通道连接tcp端口必须使用127.0.0.1 登陆时不会将localhost与%匹配 2. 临时表 只有CREATE TEMPORARY TABLE权限,其他的“表权限”应用到临时表 可能会导致不能对临时表做ddl操作,但是赋予这些权限会影响正常表 解决方法是建一个tmp的db,将权限赋予用户 3. 必须使用密码 [client] section of my.cnf as follows: password mysql.user表中空串的密码是没有密码,而非密码为空串你 4. 考虑禁用匿名用户 show grants 可能不会显示所有权限 mysql提供的mysql_secure_installation可以实现 5. 合理使用用户的host host应该用来区分where connect,而非what can do 容易产生问题 6. select允许show create table 7. 不要给一般用户授权mysql db中的权限 他们可以自己修改了 不要使用grant *.* 8. 小心授权SUPER 9. Mysql没有“可以使用所有db 除了”的权限 好的命名可以解决 mysql> GRANT ... ON `analysis%`.* TO 'analyst' ...; 让用户只能使用其名称开头的db,如果db有下划线,需要转义 mysql> GRANT ... ON `sunny\_%`.* TO 'sunny' ...; 10. 隐式权限 show grants只显式授予的权限 mysql默认安装,将test_开头的db权限授予任何人 有可能还能建db,如果有以下两行 mysql> SELECT * FROM mysql.db\G *************************** 1. row *************************** Host: % Db: test User: Select_priv: Y *************************** 2. row *************************** Host: % Db: test\_% User: Select_priv: Y ... omitted ... 另外一种情况是,用户权限查找时精确的匹配隐藏模糊匹配,即使模糊匹配权限更高,隐藏风险是用户权限修改后,模糊匹配会生效 11. 过期权限 表被删除,用户被赋予的表的权限没有删 操作系统安全 1. 不要使用特权用户启动mysql 2. 保持OS更新 3. 限制db host的登录 4. 生产测试分离 5. server审计 6. 使用chrooting, jails, zones, or virtual servers进一步隔离mysql 网络安全 1. 仅允许本机连接 禁止tcp socket 但允许unix socket [mysqld] skip_networking 允许tcp 但仅限于本机 [mysqld] bind_address=127.0.0.1 2. tcp wrapper:再封一个中间层,定义访问规则 数据加密 1. 用户密码:MD% mysql> SELECT MD5('p4ssword'), ENCRYPT('p4ssword'), SHA1('p4ssword')\G *************************** 1. row *************************** MD5('p4ssword'): 93863810133ebebe6e4c6bbc2a6ce1e7 ENCRYPT('p4ssword'): dDCjeBzIycENk SHA1('p4ssword'): fbb73ec5afd91d5b503ca11756e33d21a9045d9d INSERT INTO user_table (user, pass) VALUES ('user', MD5('p4ssword') ) SELECT * FROM user_table WHERE user = ? AND pass = MD5(?) 2. 文件系统加密 chroot环境