“孤立”用户

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

“孤立”用户

在数据库安全体系中,Login和User是两个最基本的安全主体(Principal),Login用于登陆到SQL Server实例,而User用于访问数据库。Login和User之间有一个映射关系,通过SID(安全标识,Security ID)连接到一起。在一个数据库中,如果一个User没有相应的Login,称作孤立用户(Orphaned User),也就是说,该User的SID存在于sys.database_principals 中, 而不存在于 sys.server_principals 中。一般情况下,把备份的数据库还原到在其它SQL Server实例之后,会产生孤儿用户。还有一种情况,孤立用户是DBA故意创建的,通过权限模拟来实现特定的系统维护任务。

一,检查和修复孤立用户

Login 和 User的映射关系是通过SID来关联的,如果一个SID 存在于sys.database_principals,而不存在于  sys.server_principals,那么这个User 除非是system user,否则就是孤立用户。出现孤立用户的根本原因是:数据库User没有对应的Login,解决孤立用户问题的方法是:创建Login,建立Login和孤立用户之间的映射。

1,使用以下脚本查看孤立用户

在查看孤立用户时,应该过滤掉系统预先创建的用户,例如,dbo、sys和guest(来宾用户),一般情况下,只查看SQL User,Windows Users和Windows Group这三个安全主体类型,通过以下脚本查看孤立用户,并修复孤立用户。大多数情况下,在把数据库备份还原到不同的SQL Server实例时,会出现孤立用户。

复制代码
select dp.name as UserName
    ,dp.type
    ,dp.type_desc
    ,dp.default_schema_name
    ,dp.is_fixed_role
    ,dp.authentication_type
    ,dp.authentication_type_desc
    ,dp.sid,dp.principal_id
from sys.database_principals dp
left join sys.server_principals sp 
    on dp.sid=sp.sid
where sp.sid is null
    and dp.[type] IN (N'U', N'S',N'G')
    and dp.is_fixed_role = 0
    and dp.[Name] NOT IN (N'dbo', N'guest', N'sys', N'INFORMATION_SCHEMA')
复制代码

在视图 sys.database_principals中,Principal的类型注释如下:

  • S = SQL user
  • U = Windows user
  • G = Windows group

2,创建Windows Login

创建Windows Login,Logon Name的格式是:[<domainName>\<login_name>]

CREATE LOGIN [DomainName\WindowsLoginName] -- or [DomainName\WindowsGroupName] 
FROM WINDOWS WITH DEFAULT_DATABASE=[master], 
DEFAULT_LANGUAGE=[us_english]

3,重新创建Login 和 name之间的映射关系

通过为User指定新的Login,重新把User映射到Login。Login 和User的映射关系是通过SID(security Identifier)来关联的,在重新映射时,数据库引擎会把User的SID修改为Login的SID,以建立映射关系。

ALTER USER userName  
WITH LOGIN = loginName

注:The WITH LOGIN clause enables the remapping of a user to a different login. 

二,自动修复孤立用户问题

对于孤立用户,由于User  Name和 Login Name之间没有直接的关系,因此,完全修复孤立用户的可能性几乎是没有的。在特定的情况下,当使用Windows验证创建User和Login时,把User Name 和 Login Name设置成相同的,这样,可以检测数据库的User是否有对应的Login;如果没有对应的Login,管理员可以新建相应的Windows Login,重建映射关系,进而修复孤立用户。

以下是自动修复孤立用户的脚本,仅供参考:

declare @username sysname
declare @sqlcmd nvarchar(max)

declare cur_orphaned cursor 
    local
    forward_only
    fast_forward
    read_only
for 
select dp.name as UserName
from sys.database_principals dp
left join sys.server_principals sp 
    on dp.sid=sp.sid
where sp.sid is null
    and dp.[type] IN (N'U',N'G')
    and dp.is_fixed_role = 0
    and dp.[Name] NOT IN (N'dbo', N'guest', N'sys', N'INFORMATION_SCHEMA');

open cur_orphaned
fetch next from cur_orphaned into @username

while @@fetch_status=0
begin
    --create login
    set @sqlcmd = N'create login [' + @username + N'] from windows'
    exec(@sqlcmd)

    --remap user and login
    set @sqlcmd = N'alter user [' + @username + N'] with login = [' + @username + N']'
    exec(@sqlcmd)

    fetch next from cur_orphaned into @username
end

close cur_orphaned
deallocate cur_orphaned
View Code

三,来宾用户(guest)

登录(Login)用于用户身份验证,而数据库用户(User)用于数据库的访问和权限验证。登录(Login)通过安全识别符 (SID) 与用户(User)关联。如果数据库中不存在针对特定登录(Login)的用户(User),使用该登录(Login)的用户即使能够连接到 SQL Server 服务器,也无法访问数据库。但是,该情形的唯一例外是当数据库包含“guest”用户(User)时,与用户(User)不关联的登录(Login)将被映射到 guest 用户。如果存在数据库用户(User),但没有与其关联的登录(Login),则该用户将无法登录到 SQL Server 服务器中。

四,创建孤立用户

通过Create User 命令创建User和Login之间的映射关系,上文提到,这种映射关系是通过SID来关联的,即Login访问数据库使用的User的SID和Login相同。

在创建新的User时,指定关联的Login,就可以创建User和Login的映射关系,脚本如下:

CREATE USER user_name 
--FOR LOGIN login_name 
[ WITH DEFAULT_SCHEMA = schema_name ] 

在创建User时,如果没有指定for login子句,那么新建的User是孤立用户,一般用作系统维护等特殊用途。

 

参考文档:

Fixing orphaned database users in 2005 to 2012 – T-SQL Tuesday #025

Do you still use sp_change_users_login instead of ALTER USER UserName WITH LOGIN = UserName

 

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: Security

本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/5176064.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
数据管理
当前单一的数据目录已经很难满足数据管 理者和消费者对于资产管理和查找的需求。
当前单一的数据目录已经很难满足数据管 理者和消费者对于资产管理和查找的需求。
79 2
|
8月前
|
数据采集 SQL 监控
分析重复数据通常涉及以下步骤,以确保对重复项的来源和性质有深入理解
【4月更文挑战第2天】分析重复数据通常涉及以下步骤,以确保对重复项的来源和性质有深入理解
83 1
|
IDE 数据库 开发工具
VS2019连接数据库:未能找到任何适合于指定的区域性或非特定区域性的资源。
VS2019连接数据库:未能找到任何适合于指定的区域性或非特定区域性的资源。
172 0
|
存储 文件存储 数据安全/隐私保护
为部署的系统做出正确的数据存储决策
为部署的系统做出正确的数据存储决策
|
存储 数据采集 传感器
带你读《数据自治》第三章数据权3.1关于数据的活动(一)
《数据自治》第三章数据权3.1关于数据的活动
带你读《数据自治》第三章数据权3.1关于数据的活动(一)
|
搜索推荐 数据挖掘 定位技术
带你读《数据自治》第三章数据权3.1关于数据的活动(二)
《数据自治》第三章数据权3.1关于数据的活动(二)
|
存储 数据管理 数据挖掘
|
数据可视化 Oracle 关系型数据库
掌握这3个策略,轻松提升数据信息传达效率
所有的好设计其实都是专业思考的过程的反映。通过前注意过程,潜移默化地引导你的阅读顺序,强调重点的内容。好的可视化大屏,是艺术更是科学,细微的变动可能完全影响数据信息的传达。
1047 0
|
测试技术
测试应该如何处理跟开发之间的“敏感”关系?
测试从业者,打交道最多的就是开发,而测试和开发之间的关系在行业内被称为‘天敌’。最近部门内有些产品线成员和开发同事在协作之间也是双方抱怨不断,为此形成此文,算是给大家一些思路参考。 **作为测试工程师,你知道要怎么更好地来处理跟开发之间的关系么?其实对于存在这种所谓的‘敌对’关系,并不难理解。
1427 0