如何在给定场景下为某用户授权?
如何定义MySQL数据库账号
账号组成
用户名@可访问控制列表
- %:表示可以从所有外部主机访问
- 192.168.1.%:表示可以从192.168.1网段访问
- localhost:表示可以从DB服务器本地访问
注意:
- MySQL5.7之前用户名长度限制为最多16字节,MySQL5.7之后用户名长度限制为最多32字节。
- %不包括localhost,即希望从DB服务器本地访问需要显式指定localhost进行授权
- 未指定可访问控制列表时,默认为%,非常不安全。
- 如果一个用户名有多个不同的可访问控制列表对应的不同账号时,MySQL会进行最精确匹配。
- 客户端使用账号时只需要指定用户名,而可访问控制列表部分会由MySQL客户端自动识别补全。
账号创建
使用CREATE USER
命令
CREATE USER user@ip IDENTIFIED BY 'password';
注意: MySQL5.7之前可以使用GRANT命令为账号授权的同时创建账号,但5.7之后不能如此做。只能先进行创建,再进行授权。
如何为账号授权
常用的账号权限
类别 | 语句 | 说明 |
---|---|---|
Admin | CREATE USER | 建立新的用户的权限 |
Admin | GRANT OPTION | 为其他用户授权的权限 |
Admin | SUPER | 管理服务器的权限 |
DDL | CREATE | 新建数据库、表的权限 |
DDL | ALTER | 修改表结构的权限 |
DDL | DROP | 删除数据库、表的权限 |
DDL | INDEX | 建立和删除索引的权限 |
DML | SELECT | 查询表中数据的权限 |
DML | INSERT | 向表中插入数据的权限 |
DML | UPDATE | 更新表中数据的权限 |
DML | DELETE | 删除表中数据的权限 |
DML | EXECUTE | 执行存储过程的权限 |
可用show privileges;查看当前MySQL所支持的权限列表
账号授权
- 使用GRANT命令对用户授权
GRANT SELECT,INSERT,UPDATE,DELETE ON db.tb TO user@ip;
- 使用REVOKE命令收回用户已有的权限
REVOKE DELETE ON db.tb FROM user@ip;
如何保证数据库账号的安全?
权限
最小权限原则
- 不要设置可访问控制列表为%
- 如果要从外网访问,需要考虑SSL链路保证安全
- 数据库表权限按照所需最小进行授权
密码
密码不要上传或保存到公有git,也不要写到代码中或代码内的配置中,应集中到配置服务中进行管理。
密码强度策略
- 建议使用16位长度的随机字符
- 如果要用特殊符号需考虑外部程序代码能否支持
密码过期+限制历史密码重用次数原则
注意:
- MySQL8.0之后支持此功能。
- 密码过期不影响已建立好的连接。
- 如果要使用此功能,需要保证外部程序支持动态获取配置密码并刷新使用。
如何迁移数据库账号?
- 导出用户建立及授权语句
使用percona公司提供的工具pt-show-grants
pt-show-grants u=root,p=password,h=localhost
- 在目的实例上执行