SQL Server在服务器级别和数据库级别都有默认的安全主体(Principal),用户经常遇到的有sa 登录,dbo 用户,guest 用户和public角色,public 角色分为服务器级别和数据库级别。
一,sa 登录
sa login 是服务器级别的特殊安全主体,登录名是sa,是服务器级别的SQL LOGIN。默认情况下,在安装SQL Server实例时,sa login就被创建了。从SQL Server 2005开始,sa login的默认数据库是master,并且是sysadmin角色的成员,因此sa login拥有服务器的最高权限,并且权限不能被限制。虽然sa login不能被删除,但是可以禁用。一旦sa被禁用,任何人都无法使用sa login来管理SQL Server实例。
二,数据库级别的特殊用户
在数据库级别,SQL Server在每个数据库中都预先创建了两个特殊的用户:dbo和guest,在每个数据库中都有这两个用户(User):
- dbo(database owner的简称):是WINDOWS_USER,数据库的所有者(Owner),每个数据库都有一个dbo用户,SQL Server把固定服务器角色 sysadmin 的成员都映射到数据库用户 dbo上。
- guest:宾客,是SQL_USER,对于任何没有映射到数据库用户的有效登陆(Login),SQL Server使用guest账户登陆数据库。在登陆数据库之前,需要分配权限给guest, 一般给guest查看(select)数据库对象的权限,默认情况下,guest是没有登录数据库的权限。
1,dbo 用户
dbo是数据库所有者(database owner)的简写,dbo用户存在于每一个数据库中,是数据库中权限最大的user,sa login,sysadmin角色的所有成员和db_owner角色的成员,都会以dbo身份登录到数据库 。
dbo用户拥有数据库的所有权限,权限不能被限制,不能被删除,也不能被禁用。dbo 用户并不完全等价于db_owner 角色,通常情况下,db_owner角色的成员就是数据库的所有者(Database Owner)。
2,guest 用户
每个数据库都包含一个guest用户,当一个login有权限登录SQL Server实例后,如果没有在数据库中映射响应的user账户,那么该login使用guest用户连接到数据库,同时继承guest用户的权限,以guest的身份来访问数据库。
guest用户默认存在每个数据库中,默认情况下,guest用户是禁用的,可以通过命令启用guest用户。
GRANT CONNECT TO GUEST
一旦启用guest用户,所有可以登陆到SQL Server的Login,都可以使用guest身份来访问数据库,并拥有guest用户的权限,可以通过命令禁用guest用户。guest用户不会被删除,但是可以通过回收 CONNECT 权限来禁用。
REVOKE CONNECT FROM GUEST;
注意:只能在 master 和 tempdb 以外的数据库中执行禁用GUEST帐号的操作,这是因为许多用户都需要以GUEST身份访问master 和 tempdb系统数据库,GUEST用户在master 和 tempdb数据库的权限被严格限制。
三,public 角色
public是一个服务器级别的角色,同时也是一个数据库级别的角色,注意,public角色的权限不是固定的,因此public 不属于固定角色(fixed role),在 sys.server_permissions 和 sys.database_principals的 字段 is_fixed_role 是 0。
- 对于服务器级别的public角色,每一个login 都属于public 角色,当一个login没有被授予特定的权限时,那么该login会继承public的权限。
- 对于数据库级别的public角色,每一个user都属于public 角色,当一个user没有被授予特定的权限时,那么该user会继承public的权限。
public角色特殊之处在于:角色的权限可以被修改。当一个login 或user没有被授予特定安全对象上的权限时,该login或user会继承public角色的权限。public 角色不能被删除,但是可以对public角色的权限进行授予(Grant)、拒绝(Deny)和回收(Revoke)。
默认情况下,有一些权限会被授予到public角色上,比如, VIEW ANY DATABASE 用于查看SQL Server实例上的所有数据库。
当对public角色进行权限管理时,一定要慎重,因为这会影响所有的login或user。通常情况下,不要把对public设置deny权限,这是由于deny语句的优先级最高,deny权限会覆盖所有的grant权限。
每个 SQL Server 的登录(Login)均属于 public 服务器角色,所有的数据库用户(User) 都属于public数据库角色。用户不能删除public角色,但是,可以授予或收回public角色的权限。默认情况下,public角色被分配很多权限,大部分权限都跟数据库中的日常操作有关。默认情况下,
- 数据库级别的public 角色拥有的权限:查看特定系统表
- 服务器级别的public 角色拥有的权限:查看数据库(VIEW ANY DATABASE),链接服务器(CONNECT)
当一个对象对所有用户或登录可用时,只需把权限分配给 public 角色即可。默认情况下,所有的数据库用户都属于public角色,因此,授予或回收public角色的权限,将会影响所有的用户。
参考文档: