• Security 13:SQL Server 默认的角色和用户


    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在每个数据库中都预先创建了两个特殊的用户:dboguest,在每个数据库中都有这两个用户(User):

    • dbodatabase 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角色的权限,将会影响所有的用户。

    参考文档:

    Principals (Database Engine)

  • 相关阅读:
    《痞子衡嵌入式半月刊》 第 51 期
    痞子衡嵌入式:IAR环境下无法直接下载调试i.MXRT分散链接工程的解决方案(宏文件.mac+双Flashloader)
    《痞子衡嵌入式半月刊》 第 52 期
    消息中间件RabbitMq相关概念及原理介绍【图文并茂】
    简简单单用一下 Hbase
    WxJava for Solon 咱也不知道为啥要写
    Solon 1.6.34 发布,更现代感的应用开发框架
    Water 2.5.6 发布,一站式服务治理平台
    Water 2.5.8 发布,一站式服务治理平台
    CODING 公开课火热报名中!
  • 原文地址:https://www.cnblogs.com/ljhdo/p/14009690.html
Copyright © 2020-2023  润新知