权限
通常是在执行一条被允许的SQL查询语句后取得的与对象相关的和对象无关的
对象指定权限赋予你访问特定对象的权限
全局权限执行一些功能,比如关闭服务器,执行FLUSH,执行各种show命令
基于对象的权限让你操作服务器里的内容
MySQL权限是bool,要么被赋予,要么没有
授权表
提供GRANT,REVOKE,DROP USER权限检查一个验证通过的用户是否允许使用某个操作的查询顺序:
1.User
每一行是一个用户账户以及用户的全部权限
2.Db
每一行包含了某个用户在数据库级权限
3.Host
每一行包含了用户从指定机器登录过来时在一个数据库里的所有权限。最后不要动用这张表
4.tables_priv
每一行包含了指定用户和表的表级别上的权限,包括视图权限
5.columns_priv
每一行包含了指定用户和列的列级别上的权限
6.procs_priv
每一行包含指定用户和存储程序的权限
增加,删除授权
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY '12345678';REVOKE ALL ON *.* FROM 'admin'@'localhost';
GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限。
GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。
GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。
SHOW GRANTS;查看授权
设置MySQL权限
系统管理员账号GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '12345678' WITH GRANT OPTION;
数据库管理员账号
GRANT ALL PRIVILEGES ON *.* TO 'sb'@'localhost' IDENTIFIED BY '12345678' WITH GRANT OPTION;
用户账号
GRANT INSERT,UPDATE PRIVILEGES ON db.table TO 'user'@'%.sb.com' IDENTIFIED BY '12345678';
常见问题
1.MySQL默认会使用Unix socket连接,指定TCP/IP连接,mysql --host=127.0.0.1 或者 mysql --host=localhost --protocol=tcp。建立SSH隧道时,应该使用IP地址127.0.0.1才会使用TCP去连接端口2.安全使用临时表,临时表只被加入用户的表级权限。安全的使用方法:
CREATE DATABASE temp;
GRANT SELECT, INSERT, UPDATE, DELETE, DROP, ALTER, INDEX, CREATE TEMPORARY TABLES ON temp.* TO sb@'%';
3.不允许没有密码的访问,MySQL本身允许没有密码的访问,没有密码的账号在user表里是password列为空字符串。
无法彻底禁止无密码的访问,可以再连接发起的那台机器的my.cnf里的[client]里加入password,或者把服务器的SQL模式设为NO_AUTO_CREATE_USER
4.关闭匿名用户,User列为空字符串的是匿名用户使用的权限,最好是移除这些条目
5.主机名和用户名分别加引号
6.不重用用户名
7.给用户授予SELECT权限,允许执行SHOW CREATE TABLE
8.不把mysql数据库的权限授予用户
9.REVOKE没有删除用户账号,只删除了权限,还能连接到数据库,必须使用DROP USER删除账号
操作系统安全(关于MySQL)
1.不使用root运行MySQL2.随时更新操作系统
3.在数据库主机上限制登录
4.生产环境和开发环境,测试环境隔离开来
网络安全
1.如果只有一台服务器,可以使用skip_networking,禁止网络访问,但会限制你做远程管理更改,限制Java应用程序连接,可以更改为bind_address=127.0.0.12.防火墙,先默认拒绝所有连接,然后再追加规则,给予要访问服务器的主机访问权。MySQL服务器限制是只允许3306端口,或者开通一个远程登录服务。不能有默认的路由配置,即使防火墙的配置损害,数据包不会返回。
在Chroot环境里使用MySQL
chroot环境建立一个独立环境,指定目录的文件都无法被外界访问到。./configure --prefix=/chroot/mysql
chroot /chroot/mysql
cd /chroot/mysql
mkdir chroot
cd chroot
ln -s /chroot/mysql mysql
mysqld_safe --chroot=/chroot/mysql --user=1001
LOAD DATA INFILE或其他直接访问文件名的命令可能会有不同,不在把/当做文件系统的根目录