阿里云RDS for SQL Serrver关于权限的一个严重Bug
- 作者: 迎春花已开
- 来源: 51数据库
- 2021-09-04
阿里云rds for sql server的账号管理有不少小bug,而且有一个很严重的bug:任何普通账号,都能创建数据库。注意,我这里是说任意普通账号,任意任意普通账号!任意任意普通账号!重要的事情说三遍。
例如,下面测试环境所示,rds for sql server的数据库版本为sql server 2016 web,我们在控制平台的“账号管理”界面,创建一个数据库账号test2,如下所示,只授予“只读”权限。
、
我们使用脚本get_login_rights_script.sql 获取数据库账号test2的具体权限如下所示:
使用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的高权限账号有权限限制,所以很多事情也无法更深入的去探究。目前,我们也提交、报告了这个问题,暂时还没有得到官方回复!
- SQLite数据库操作:原生操作,GreenDao操作讲解
- 数据库SQL实战题:获取员工其当前的薪水比其manager当前薪水还高的相关信息(教程)
- SQLSERVER查询区分大小写的写法分析
- SQL学习总结之SQL的分类介绍
- 阶梯到高级T-SQL 1级:高级T-SQL介绍交叉连接
- 高级T-SQL级别1的Stairway:使用CROSS JOIN引入高级T-SQL分析
- 什么是SQL隔离级别?四个SQL隔离级别定义介绍
- Sql递归介绍之用with实现递归查询
- SQLSERVER查询时日期格式化的实例讲解
- 数据库SQL实战:从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略(题解)