1、关于账号
user@host 账号三要素:账号、密码、来源主机
账号的创建
传统方式:create user abc@'192.168.1.2' identified by 'abc';
grant方式:grant select on abc_db.* to abc@'192.168.1.2' identified by 'abc';
另类方式:insert into mysql.user(host,user,....) values ('192.168.1.2','abc',...)
修改字典表后需要flush privileges使之生效
删除账号:drop user abc@host;
修改密码:set password for abc=password('123456');
另类修改:update mysql.user set password=password('123456') where user='abc' and host='...';
账号失效:(失效后仍能登录,不能执行操作):alter user abc password expire;
账号授权:grant select,insert,... on xxdb.xx to abc@192.168.1.2;
查看授权:show grants for abc@192.168.1.2;
回收授权:(回收时的权限级别必须与授权时一致);
revoke select,insert,... on xxdb.xx from abc@192.168.1.2;
全量回收授权:revoke all,grant option from user@host;
2、关于权限级别
mysql权限颗粒:全局、库、表、列、程序(routine,包括procedure、function)
可精确的为某个用户分配从某台机器连接进来,访问某个数据库下某张表的某个列的某部分记录权限
权限匹配时,从大到小,直到匹配成功,否则无权限;
相关的字典表:user、db、host(5.6之后弃用)、tables_priv、columns_priv、procs_priv
3、账户方面的安全考虑
建议账户建立三个维度:
user_oper
user_read
user_mgr
两个原则:
管理员账户改名,不允许出现root名称的用户;
用户访问域设定为服务器所在IP段
要命的历史文件:~/.mysql_history
Linux/Unix系统下,使用mysql命令行工具执行的所有操作,包括口令,均保存在该隐藏文件下
解决:
方案1:改变环境变量MYSQL_HISTFILE,将其值改为/dev/null
方案2:将.mysql_history改为/dev/null的软连接:ln -s -f /dev/null ~/.mysql_history
修改后,上下键翻看历史命令仅针对当前会话有效!
管理员口令丢失
找回方法非常规,必须多次重启MySQL服务
方法1:重启MySQL,附加参数:--init-file,执行含有密码重置的脚本
方法2:杀掉MySQL,附加特殊参数启动,跳过权限验证,而后登录库重置密码后,再正常重启
mysql_safe --defaults-file=/.../my.cnf --skip-grant-tables --skip-networking &
--skip-networking:不监听来自TCP/IP的连接,只允许MySQL服务本地创建连接,确保安全
重启后mysql登录,update掉user表,停服务:mysqladmin shutdown
启动服务:mysql_safe --defaults-file=/.../my.cnf &