本文探讨了Azure SQL数据库中的数据库级角色。
介绍Azure SQL数据库的安全管理
数据库安全对于一个组织来说是至关重要的,它可以保护对存储在数据库对象中的敏感和关键数据的未授权访问。在基础设施安全、数据库认证、授权、加密方面,有许多安全层次。
为了管理SQL Server的安全性,你可以为具有特定角色的用户授权权限。 例如,如果一个用户只需要对数据库进行读取访问,就不应该给他特权权限,如**db_owner,**他可以读取、写入、创建、删除对象。因此,了解内置的服务器和数据库级别的角色对于无缝和有效地提供和管理用户的访问是非常重要的。
一旦你使用Azure门户或Azure CLI创建了一个新的Azure SQL DB,配置过程就会在Azure地区部署一个逻辑的Azure SQL服务器。你会得到一个虚拟主数据库,用于管理服务器级别的配置和安全。它还配置了一个服务器级别的负责人作为Azure数据库的数据库所有者。这个账户在Azure SQL DB(PaaS)中拥有最高的权限,并且有足够的权利来管理服务器和数据库级别的安全。
下表总结了Azure SQL数据库和企业内部SQL数据库在数据库安全管理方面的区别。
企业内部的SQL服务器实例 | Azure SQL数据库 | |
管理服务器级别的安全 | SSMS对象资源管理器中的安全文件夹 | 使用主数据库和Azure门户 |
Windows认证 | 是的,它支持活动目录认证 | 它支持Azure活动目录认证。 |
服务器级别的安全角色 | securityadmin固定服务器角色 | 它有一个loginmanager数据库级角色,存在于主数据库中。 |
支持的命令 | create\alter\drop login | CREATE\ALTER\DROP LOGIN(带有限参数) |
创建一个新的数据库角色(服务器级别) | Dbcreator固定数据库角色 | 数据库级角色 - dbmanager |
检查登录的视图 | Sys.server_principals | 主数据库中的Sys.sql_logins |
查看列出所有数据库和它们的属性 | Sys.databases | 主数据库中的Sys.databases |
本文将帮助深入了解Azure DB中的固定数据库角色,以管理数据库级权限。
要求
要开始学习这篇文章,你应该了解SQL Server或Azure SQL数据库中的登录和角色。你需要一个有管理员权限的活跃的Azure SQL数据库。
在Azure DB中固定数据库角色
展开Azure SQL DB并导航到安全 -> 角色 -> 数据库角色,以获得可用的固定数据库角色列表,展开Azure SQL DB并导航到安全 -> 角色 -> 数据库角色。你会得到以下的固定数据库角色。
下表列出了数据库角色和它们的描述。
db_owner
db_owner固定数据库角色中的用户在数据库中提供最高权限。用户有创建、删除、改变、写入或放弃数据库的权限。
为了在db_owner角色中添加一个用户,我们可以使用T-SQL存储过程sp_addrolemember。下面的语句为demologin1提供db_owner的权限。
EXEC sp_addrolemember 'db_owner', 'demologin1';
db_accessadmin
固定数据库角色db_accessadmin提供了添加或删除、创建和管理数据库用户的权限。
下面的脚本为demologin1用户提供了db_accessadmin角色的权限。
EXEC sp_addrolemember 'db_accessadmin', 'demologin1';
db_datareader
db_datareader角色授予从数据库的所有表和视图中读取数据所需的权限。例如,假设你想让开发人员从生产数据库中读取数据。在这种情况下,你可以在相应的数据库中为他提供db_datareader角色。
下面的脚本为demologin1用户提供了db_datareader角色的权限。
EXEC sp_addrolemember 'db_datareader', 'demologin1';
db_datawriter
db_datareader角色授予从数据库的所有表和视图中写入(插入,更新)数据所需的权限。例如,你可以将你的应用程序帐户添加到这个角色中来执行数据插入、更新。
下面的脚本为demologin1用户提供了db_datawriter角色的权限。
EXEC sp_addrolemember 'db_datawriter', 'demologin1';
db_ddladmin
db_ddladmin这个固定的数据库角色授予创建和管理数据库对象的权限。例如,你可以在这个角色中添加用户来创建、改变或删除数据库中的对象。
下面的脚本为demologin1用户提供了db_ddladmin角色的权限。
EXEC sp_addrolemember 'db_ddladmin', 'demologin1';
db_denydatareader
db_denydatareader角色拒绝用户从数据库中任何使用db_denydatareader角色的表或视图中读取数据的权限。
下面的脚本为demologin1用户提供了db_denydatareader角色的权限。
EXEC sp_addrolemember 'db_denydatareader', 'demologin1';
db_denydatawriter
db_denydatawrite数据库角色拒绝用户向数据库的表或视图中写入数据。
下面的脚本为demologin1用户提供了db_denydatawriter角色的权限。
EXEC sp_addrolemember 'db_denydatawriter', 'demologin1'
db_backupoperator
db_backupoperator提供了备份SQL数据库的权限。如果你执行T-SQL语句,在Azure DB中提供db_backupoperator角色,它将成功执行。
然而,在 MS文档 状态 db_backupoperator 在Azure SQL数据库中是不适用的,因为你不能在Azure DB中运行BACKUP DATABASE语句。
公开
一旦你创建了一个新的数据库用户,并且没有提供服务器或数据库级别的权限,它就属于公共数据库角色。你不能从公共角色中删除一个用户。如果你试图使用公共角色访问一个对象,用户会继承授予公共角色的权限。
虚拟主数据库中的其他角色
如果你在虚拟主数据库中查看相同的数据库角色,你会得到额外的数据库角色,如下所示。
Azure数据库包含额外的安全角色:用于创建登录的loginmanager和用于创建数据库的dbmanager。
注意:主数据库中的用户只能被添加到这些数据库角色中。
Loginmanager角色
loginmanager数据库角色中的用户可以创建和删除主数据库中的登录。
dbmanager角色
dbmanager角色允许用户创建数据库,作为数据库所有者删除数据库。它允许用户作为一个包含所有DB权限的DBO用户连接Azure数据库。该角色的用户没有权限访问其他不属于他们的数据库。让我们通过实例来探讨虚拟主数据库中的这些特殊数据库角色。
- 在主数据库中创建一个名为[Login1]的新登录。
CREATE LOGIN login1 WITH password='P@ssw0rd123';
- 从该登录中创建一个新的用户[login1User]。
CREATE USER login1User FROM LOGIN login1;
- 在loginmanager的固定数据库角色中添加该用户
EXEC sp_addrolemember 'loginmanager', 'login1User';
- 使用下面的查询来验证用户和其分配的数据库角色。该查询使用系统视图sys.database_role_members和sys.database_principals来获取Azure DB中的所需数据。
SELECT roles.principal_id AS RolePrincipalID
, roles.name AS RolePrincipalName
, database_role_members.member_principal_id AS MemberPrincipalID
, members.name AS MemberPrincipalName
FROM sys.database_role_members AS database_role_members
JOIN sys.database_principals AS roles
ON database_role_members.role_principal_id = roles.principal_id
JOIN sys.database_principals AS members
ON database_role_members.member_principal_id = members.principal_id;
GO
如下所示,[login1user]是loginmanager角色的一个成员。
- 使用SQL登录[login1]连接到Azure SQL数据库
如上所述,loginmanager角色中的登录者可以创建或删除主数据库中的登录者。让我们试着创建一个新的登录,并把它也丢掉。
- 创建一个登录
- 删除一个登录
然而,如果你试图创建一个新表,你会得到权限拒绝的错误。在这种情况下,你可以添加数据库角色,如db_owner或db_ddladmin来创建数据库对象。
我们也可以在多个数据库角色中添加用户。例如,我们也可以在dbmanager 固定数据库角色中添加用户。现在,这个用户可以创建或删除额外的Azure SQL数据库。
EXEC sp_addrolemember 'dbmanager', 'login1User';
现在,重新运行选择语句,列出所有作为数据库级角色成员的数据库负责人。你可以看到[login1user]是两个角色的成员 - dbmanager 和 loginmanager。
你应该使用登录[login1]重新连接到Azure数据库,断开它的连接并重新连接以获得有效权限。
总结
本文介绍了Azure SQL数据库中的数据库级角色的概况。虚拟主数据库包含额外的角色--dbmanager和loginmanager,用于有效管理权限。你应该管理数据库的权限,以防止任何对数据库的未授权访问。