代码改变世界

阿里云RDS for SQL Serrver关于权限的一个严重Bug

2019-10-23 23:35  潇湘隐者  阅读(...)  评论(...编辑  收藏

阿里云RDS for SQL Server的账号管理有不少小Bug,而且有一个很严重的Bug:任何普通账号,都能创建数据库。注意,我这里是说任意普通账号,任意任意普通账号!任意任意普通账号!重要的事情说三遍。

 

 

例如,下面测试环境所示,RDS for SQL Server的数据库版本为SQL Server 2016 WEB,我们在控制平台的账号管理界面,创建一个数据库账号test2,如下所示,只授予只读权限。

 

clip_image001

 

 

我们使用脚本get_login_rights_script.sql 获取数据库账号test2的具体权限如下所示:

 

clip_image002

 

使用test2账号登录数据库,执行下面脚本就能创建一数据库,如下所示。根据个人的测试,这个账号可以为任意普通账号。即使取消服务器角色setupamin与processadmin,依然是可以创建数据库的。

 

 

CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'MyDB', FILENAME = N'E:\SQLDATA\DATA\MyDB.mdf' , SIZE = 5120KB , FILEGROWTH = 10%)
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'E:\SQLDATA\DATA\MyDB_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO

 

如果可以创建数据库,当然也可以删除数据库,当然,只能删除它自己创建的数据库,不能删除其它数据库。

 

DROP DATABASE MyDB;

 

删除不是这个账号创建的数据库时就会报错。如下所示:

 

DROP DATABASE test4;
 
Msg 3701, Level 11, State 2, Line 15
Cannot drop the database 'test4', because it does not exist or you do not have permission.

 

 

是否很神奇?传统数据库需要有服务器角色dbcreator(当然,sysadmin角色肯定也可以) 或者授予CREATE ANY DATABASE、 CREATE DATABASE, ALTER ANY DATABASE其中一个权限才能创建数据库。但是RDS for SQL Server的普通账号没有授予这些权限,却依然可以创建数据库。实在是想不明白它为什么有这样一个Bug。 RDS for SQL Server的高权限账号有权限限制,所以很多事情也无法更深入的去探究。目前,我们也提交、报告了这个问题,暂时还没有得到官方回复!