- 元数据数据库:mysql
系统授权表:
db, host, user
columns_priv, tables_priv, procs_priv, proxies_priv - 用户账号:
'USERNAME'@'HOST':
@'HOST':
主机名;
IP地址或Network;
通配符: % _
示例:172.16.%.%
用户管理
- 创建用户:CREATE USER
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
默认权限:USAGE
create user test@'192.168.32.129' identified by 'centos';
知识扩展:
在192.168.32.129主机的/etc/hosts文件中写入192.168.32.130主机的ip与域名的对应关系
vim /etc/hosts
192.168.32.130 centos7.localdomain centos7.localdomain为130主机的主机名
则可以使用以下方式连接数据库
mysql -utest -pcentos123456 -hcentos7.localdomain 说明数据库把主机名解析为192.168.32.130连接数据库
- 用户重命名:RENAME USER
RENAME USER old_user_name TO new_user_name - 删除用户:
DROP USER 'USERNAME'@'HOST'
示例:删除默认的空用户
DROP USER ''@'localhost';
- 修改密码:
mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
mysql>UPDATE mysql.user SET password=PASSWORD('password') WHERE clause;
此方法需要执行下面指令才能生效:
mysql> FLUSH PRIVILEGES;
#mysqladmin -u root -poldpass password 'newpass' - 忘记管理员密码的解决办法:
启动mysqld进程时,为其使用如下选项:
--skip-grant-tables
--skip-networking
使用UPDATE命令修改管理员密码
关闭mysqld进程,移除上述两个选项,重启mysqld
实验:破解mysql数据库管理员密码
如何破解mysql管理员密码
(1)更改配置文件
vim /etc/my.cnf
[mysqld]
skip-grant-tables 启动数据库服务时,不检查授权表
skip-networking 生产环境中,为了防止其他用户在破解口令时连接数据库,处于维护模式,禁止其他用户登录
(2)重启数据库服务
systemctl restart mariadb
(3)再次连接数据库,无需密码
[root@centos7-1 ~]#mysql
清除或更改密码
update mysql.user set password = ''; 设置密码为空
flush privileges; update命令通过更改表的方式清空密码,因此需要刷新策略
(4)删除配置文件/etc/my.cnf中的skip-grant-tables和skip-networking,回复原有配置信息
重启数据库服务,再次连接数据库
如果是多实例配置数据库,只需在服务脚本中增加--skip-grant-tables即可
${cmd_path}/mysqld_safe --skip-grant-tables --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null
MySQL权限管理
- 权限类别:
管理类
程序类
数据库级别
表级别
字段级别 - 管理类
CREATE TEMPORARY TABLES
CREATE USER
FILE
SUPER
SHOW DATABASES
RELOAD
SHUTDOWN
REPLICATION SLAVE
REPLICATION CLIENT
LOCK TABLES
PROCESS - 程序类: FUNCTION、PROCEDURE、TRIGGER
CREATE
ALTER
DROP
EXCUTE - 库和表级别:DATABASE、TABLE
ALTER
CREATE
CREATE VIEW
DROP
INDEX
SHOW VIEW
GRANT OPTION:能将自己获得的权限转赠给其他用户 - 数据操作:
SELECT
INSERT
DELETE
UPDATE - 字段级别:
SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...) - 所有权限:ALL PRIVILEGES 或 ALL
授权
参考:https://dev.mysql.com/doc/refman/5.7/en/grant.html
- 语法:
GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION]; priv_type: ALL [PRIVILEGES] object_type:TABLE | FUNCTION | PROCEDURE priv_level: *(所有库) | *.* | db_name.* | db_name.tbl_name | tbl_name(当前库的表) | db_name.routine_name(指定库的函数,存储过程,触发器) with_option: GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count | MAX_USER_CONNECTIONS count
示例:
GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';
- 回收授权:REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ...
示例:
REVOKE DELETE ON testdb.* FROM 'testuser'@'%'
- 查看指定用户获得的授权:
Help SHOW GRANTS
SHOW GRANTS FOR 'user'@'host';
SHOW GRANTS FOR CURRENT_USER[()]; - 注意:MariaDB服务进程启动时会读取mysql库中所有授权表至内存
(1) GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效
(2) 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:mysql> FLUSH PRIVILEGES
注意:
grant all on *.* to test@'192.168.32.129'; 授权test用户可以查询所有数据库中的所有表
在192.168.32.129主机上测试,发现并不能查看所有数据库,这时需要退出重新登录才能具有该权限,这是因为被授权用户在线时不能获取到权限,因此需要重新登录
撤销权限时也需要被撤销权限用户重新登陆数据库才能生效
文章评论