ITPub博客

首页 > 数据库 > MySQL > 存隐患的MySQL缺省特殊权限表 下一步

存隐患的MySQL缺省特殊权限表 下一步

MySQL 作者:mail2malto 时间:2014-03-05 17:05:45 0 删除 编辑

  我们在谈到mysql安全授权的时候,往往都会关注,“只授予必要的权限,分等级授权”,删除空密码,空用户,空IP地址的账号,最好删除root账号,删除test测试数据库,如分级管理授权:

1,超级数据库管理员:
   GRANT ALL PRIVILEGES ON *.* TO 'nigel'@'172.16.%' IDENTIFIED BY PASSWORD  ‘1234567’ WITH GRANT OPTION;
2,特定库的管理员:如
   GRANT ALL PRIVILEGES ON test.* TO 'nigel'@'172.16.%' IDENTIFIED BY PASSWORD  ‘1234567’;
3,有权限创建库、表的开发主管
   GRANT ALTER,UPDATE,DELETE,SELECT,INSERT,CREATE,DROP,INDEX,CREATE TEMPORARY TABLES  ON test.* TO 'nigel'@'172.16.%' IDENTIFIED BY PASSWORD  ‘1234567’;
4,普通用户
   GRANT DELETE,UPDATE,SELECT,INSERT ON test.* TO 'nigel'@'172.16.%' IDENTIFIED BY PASSWORD  ‘1234567’;
5,用于复制的用户
   GRANT REPLICATION SLAVE ON *.* TO 'nigel'@'172.16.%' IDENTIFIED BY PASSWORD  ‘1234567’;

  如果使用视图,存储过程及存储程序,事件,等特殊应用,如果有特殊应用,需要特殊处理,给予特殊授权。
咋看这样已经比较安全了,而且考虑的非常全面到位。

下面我们做个测试,我们就可以看到一个让你吃惊的现象,下面是一次操作过程的记录,请仔细阅读,从中发现的问题,

[root@localhost var]# /opt/mysql5/bin/mysql -unigel889 -h172.16.0.230 -p
nigel889@172.16.0.230: (none) 04:22:10>show grants;
+------------------------------------------------------------------------------------------------+
 Grants for nigel889@172.16.%                                                                    ----------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'nigel889'@'172.16.%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |
+-----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

nigel889@172.16.0.230: (none) 04:22:17>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.00 sec)

上面看上去一切正常,在预料之中,请继续往下阅读

nigel889@172.16.0.230: (none) 04:22:31>

nigel889@172.16.0.230: (none) 04:22:31>create database nigel_889;
ERROR 1044 (42000): Access denied for user 'nigel889'@'172.16.%' to database 'nigel_889'
nigel889@172.16.0.230: (none) 04:23:41>create database test_889;    
Query OK, 1 row affected (0.04 sec)

nigel889@172.16.0.230: (none) 04:23:50>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
| test_889           |
+--------------------+
3 rows in set (0.00 sec)

 

上面是不是感觉就有点和我们想象的不太一样了,有点怪异,继续往下

 

nigel889@172.16.0.230: (none) 04:23:56>

nigel889@172.16.0.230: (none) 04:23:56>create database test_abcd1234;
Query OK, 1 row affected (0.00 sec)

nigel889@172.16.0.230: (none) 04:25:28>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
| test_889           |
| test_abcd1234      |
+--------------------+
4 rows in set (0.00 sec)

nigel889@172.16.0.230: (none) 04:25:30>
nigel889@172.16.0.230: (none) 04:25:30>create database testdb_abcd1234;            
ERROR 1044 (42000): Access denied for user 'nigel889'@'172.16.%' to database 'testdb_abcd1234'
nigel889@172.16.0.230: (none) 04:26:12>
nigel889@172.16.0.230: (none) 04:26:12>use test_889
Database changed
nigel889@172.16.0.230: test_889 04:26:34>create table a(id int auto_increment not null primary key,
> name nchar(20)) engine=innodb;
Query OK, 0 rows affected (1.20 sec)

nigel889@172.16.0.230: test_889 04:27:40>
nigel889@172.16.0.230: test_889 04:27:40>show create table aG
*************************** 1. row ***************************
       Table: a
Create Table: CREATE TABLE `a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` char(20) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.04 sec)

nigel889@172.16.0.230: test_889 04:28:48>insert into a select '1','leo';
Query OK, 1 row affected (0.07 sec)
Records: 1  Duplicates: 0  Warnings: 0

nigel889@172.16.0.230: test_889 04:29:38>select * from a;
+----+------+
| id | name |
+----+------+
1 | leo  |
+----+------+
1 row in set (0.00 sec)

 

不但可以创建数据,还可以建表,插入想要的数据

 

nigel889@172.16.0.230: test_889 04:30:23>show grants;
+--------------------------------------------------------------------------------------------- Grants for nigel889@172.16.%                                                             +-----------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'nigel889'@'172.16.%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |
+-----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

nigel889@172.16.0.230: test_889 04:30:26>


 在mysql5.1中,所有能够授予或者被回收的权限如下

权限名称:
--具体含义

ALL [PRIVILEGES]
授予除了‘GRANT OPTION’的所有权限
ALTER
可以使用 ‘ALTER TABLE’语句

ALTER ROUTINE
允许存储过程和存储程序被修改或者是删除
CREATE
允许创建数据库及表
CREATE ROUTINE
允许创建存储过程及存储函数
CREATE TEMPORARY TABLES
允许使用‘ CREATE TEMPORARY TABLE’即创建临时表

CREATE USER
允许使用 ‘CREATE USER, DROP USER, RENAME USER’及‘ REVOKE ALL PRIVILEGES’即能够创建、删除、重命名用户及收回用户权限

CREATE VIEW
允许创建和修改视图
DELETE
允许使用‘ DELETE’删除数据

DROP
允许删除数据库,表及视图
EVENT
允许为事件调度器开启事件
EXECUTE
允许执行存储过程及存储函数
FILE
允许操作服务器文件,即创建及读取操作系统文件
GRANT OPTION
允许把自己拥有的权限授予其他用户
INDEX
允许创建和删除索引
INSERT
允许使用‘ INSERT’插入数据

LOCK TABLES
在拥有 ‘SELECT’权限的前提下,允许使用‘ LOCK TABLES’获取表锁

PROCESS
允许使用‘SHOW PROCESSLIST’查看所有进程情况

REFERENCES
此权限在5.1中还未实现
RELOAD
允许使用‘ FLUSH’ 选项刷新日志,缓存等

REPLICATION CLIENT
允许查看主从服务器的位置
REPLICATION SLAVE
允许从服务器到主服务器上读取binlog,即允许复制
SELECT
允许使用‘ SELECT’读取数据

SHOW DATABASES
使用‘ SHOW DATABASES’ 查看数据库

SHOW VIEW
允许使用‘SHOW CREATE VIEW’查看创建视图信息

SHUTDOWN
允许使用‘mysqladmin shutdown’关闭数据库

SUPER
其他的管理操作权限,比如 CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, 及 mysqladmin debug 命令

TRIGGER
允许操作触发器
UPDATE
允许使用‘ UPDATE’更新数据

USAGE
这是创建用户后第一个拥有的权限,没有任何权限

 从上面我们可见,我们仅仅授予‘USAGE’权限的账号,在下表中查阅,会发现:“USAGE 这是创建用户后第一个拥有的权限,没有任何权限”
   没有任何权限的账号,现在看来也可以干很多事情,如果用来做破坏,那影响力和杀伤力将是无穷的。

到这里,我们看到了现象,但是为什么呢?其实我们可以从下面这里找到答案,我们注意到:

root@localhost: (none) 04:31:29>SELECT * FROM mysql.dbG
*************************** 1. row ***************************
                 Host: %
                   Db: test
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: Y
         Trigger_priv: Y
*************************** 2. row ***************************
                 Host: %
                   Db: test\_%
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: Y
         Trigger_priv: Y
*************************** 3. row ***************************

可以发现默认的mysql授权表里面,出现了上面两行,这可是很致命的权限,所以我们要做的就是要从db表中删除这两条有隐患的记录,你懂的。
ps:当然我们也可以使用mysql的这一特性来给有规律的一批库统一授权。

 

 

    QQ: 45899077

讨论群: 65576300

  微博:
<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21515245/viewspace-1114552/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-04-29