SQL Server安全:登录和用户

前言

建议配合sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系一起看。

授予 Principal (安全主体)操作 Securable(安全对象) 的 Permission(权限)。

Grants permissions on a securable to a principal

  • Principal是被授予权限的实体,包括login、user、role等。

  • Securable是Principal操作的对象,可以是table、view、SP、函数等,也可以是login、user、role等对象;有时Principal会作为Securable,被Principal操纵,也就是说,Principal 是抽象意义上的安全主体,可以向安全主体授予权限。

    Principal分为Server level和Database level,最重要的两个Principal是Login和User,他们的区别是:

    • 登录名(Login)是Server级别的Principal,作用域是整个数据库引擎。若要连接 SQL Server 实例上的特定数据库,登录名必须映射到数据库用户。数据库内的权限是向数据库用户而不是登录名授予的。

    • 数据库用户(User)是数据库级别的Principal,作用域是数据库,登录名必须映射到数据库用户才能连接到数据库。一个登录名可以作为不同用户映射到不同的数据库,但在每个数据库中只能作为一个用户进行映射。

Login和User最基本的区别是Login用于控制用户是否有权限登陆SQL Server实例,User用于用户控制是否有权限访问数据库:

  • Login是登陆SQL Server的凭证,验证方式有两种,Windows 验证和SQL Server 验证。
  • User用于访问数据库,使用Login登陆到SQL Server实例之后,必须映射到User,才能访问数据库。
  • Login提供登录Server的帐号和密码,User用于访问数据库,Role是权限的集合,控制User访问的资源。User只有担当某一个角色或具有某些权限,才能访问数据库。
  • 创建Login之后,该Login能够登录到SQL Server实例,但是,仅仅被授予Public角色,在访问数据库时,必须基于Login创建相应的数据库用户(User),Login和User通过SID关联。

创建Login

根据验证类型,Login分为SQL Server登录和Windows域登录,在创建登录时,可以设置默认数据库(Default Database),指定Login登录的默认数据库,默认值是master数据库。

创建SQL Server 登录

CREATE LOGIN login_name
WITH PASSWORD = 'password'
,DEFAULT_DATABASE = database

创建Windows域登录

如果创建Windows域登录,映射到一个Windows域账户,登录名必须使用Windows域格式: [<domainName>\<login_name>].

CREATE LOGIN [<domain_Name>\<login_name>]
FROM WINDOWSWITH DEFAULT_DATABASE = database

创建User

在SQL Server中,通常情况下,User的创建都是基于master数据库中Login,该Login的来源有三种:基于Windows域用户、Windows域用户组、SQL Server验证。

创建User

CREATE USER user_name
FOR LOGIN login_name
WITH DEFAULT_SCHEMA = shcema_name

参数解释:

  • user_name:创建的数据库用户的名字,该名字在数据库中是唯一的,用于唯一表示一个用户。
  • login_name:是用户登录SQL Server实例的登录名,分为Windows域登录名和SQL Server登录名。Windows域用户名的格式是:[<domainName>\<loginName>] 通过SID将登录名(Login)和用户名(User)关联在一起。
  • WITH DEFAULT_SCHEMA = schema_name:指定用户默认的架构(Schema),默认的Schema是指用户在引用数据库对象时,如果省略框架名,那么SQL Server将首先从默认框架下进行查找数据库对象。

在创建新的用户时,没有指定用户默认的架构,有三种处理方式:

  • 如果该用户是某一个Windows 用户组的成员,该组有默认的架构,那么该用户默认的架构是组的默认架构;
  • 对于sysadmin角色(Fixed Server Role)的成员,其默认的架构始终是dbo,忽略Create User命令的设置;
  • 如果用户不属于组,也不是sysadmin角色的成员,SQL Server不能确定该用户的架构,设置默认的架构名dbo;

创建用户名,基于SQL Server登录

CREATE LOGIN WanidaBenshoof
WITH PASSWORD = '8fdKJl3$nlNv3049jsKK';
USE AdventureWorks2012;
go
CREATE USER Wanida
FOR LOGIN WanidaBenshoof
WITH DEFAULT_SCHEMA = Marketing;

创建用户名,基于Windows域登录

CREATE USER [Domain1\WindowsUserBarry]
FOR LOGIN [Domain1\WindowsUserBarry];
use database_name
go
CREATE USER [Domain1\WindowsGroupManagers]
FOR LOGIN [Domain1\WindowsGroupManagers];

权限模拟

在SQL Server的安全模型中,模拟(IMPERSONATE )权限的安全对象是User或Login,被授予者(grantee )有权限模拟特定用户的安全上下文执行特定的操作。

例如,user1授予模拟user2的权限,当user2的安全上下文有足够的权限,而user1没有时,通过权限模拟,user1能够在user2的权限上下文中执行查询请求:

GRANT IMPERSONATE
ON USER:: user2
TO user1;

通过执行EXECUTE AS 命令模拟用户的权限,用户user1就运行在user2的安全上下文中,例如,user1在登陆数据库之后,模拟user2的权限:

EXECUTE AS USER = 'user2';

通过执行 REVERT 命令退出权限模拟,返回到用户原始的安全上下文中:

REVERT;

用户和组

SQL Server 可以创建一个Windows Group作为登陆和用户(User),所有属于该组的成员,都具有相同的权限。

列出组的所有成员

在当数据库中,查看某一个Security Group的所有成员:

exec master..xp_logininfo @acctname = 'domain\group',@option = 'members'

检查组的成员

当前数据库中,检查当前的用户是否属于特定的Security Group:

select is_member('domain\group')

函数is_member的返回值是:

  • 0:当前的用户(User)不是组的成员;
  • 1:当前的用户(User)是组的成员;
  • NULL:组名或角色名不存在于当前的数据库中;

注意,数据库是当前的数据库,如果用于资源管理(Resource Governor)中的分类函数(Classifier Function),那么,要注意分类函数所在的数据库,如果分类函数创建于master数据库,那么is_member函数的当前数据库就是master,检查的结果是当前用户是否属于当前数据库的组或角色。

特殊的用户

SQL Server在每个数据库中都内置两个特殊的用户:dboguest,在每个数据库中都有这两个用户(User):

  • dbodatabase owner的简称):是WINDOWS_USER,数据库的所有者(Owner),每个数据库都有一个dbo用户,SQL Server把固定服务器角色 sysadmin 的成员都映射到数据库用户 dbo上。
  • guest:顾客,是SQL_USER,SQL Server 允许任何没有映射到数据库用户的有效登陆(Login),使用guest账户登陆数据库。在登陆数据库之前,要求dbo分配权限给guest, 一般给guest查看(select)的权限。

1,dbo用户

sysadmin 服务器角色的成员自动映射为dbo用户,dbo不同于db_owner 数据库角色,db_owner角色的成员资格不授予dbo用户特权。

2,guest用户

当一个Login登陆到SQL Server之后,如果没有在数据库中映射相应的用户,那么该Login可以使用guest用户登陆数据库。guest用户默认存在每个数据库中,默认情况下,guest用户是禁用的,可以通过命令启用guest用户。

GRANT CONNECT TO GUEST

一旦启用guest用户,所有可以登陆到SQL Server的Login,都可以使用guest身份来访问数据库,并拥有guest用户的权限。可以通过命令禁用guest用户:

REVOKE CONNECT FROM GUEST;

注意:只能在 master 和 tempdb 以外的数据库中执行禁用GUEST帐号的操作,这是因为许多用户都需要以GUEST身份访问master 和 tempdb系统数据库,GUEST用户在master 和 tempdb数据库的权限被严格限制。

另外两个特殊的用户:INFORMATION_SCHEMAsys,每个数据库都包含这两个用户,这两个用于是数据库引擎内部使用,不能被修改和删除。

补充

Login无法通过SSMS登录


将数据库服务器的身份验证模式更改成SQL Server 和 Windows 身份验证模式,然后重启SQL Server服务(不是重启SSMS软件)

SQL Server安全:登录和用户相关推荐

  1. 【转载】SQL Server 2008 中新建用户登录并指定该用户的数据库

    提要:我在 SQL Server 中新建用户登录时,出现了三种错误,错误代码分别是 18456.15128.4064 -----------------------------------正 文 -- ...

  2. java sql 登录失败_JDBC连接到SQL Server:登录失败,用户X

    我想设置一个JDBC连接到SQL Server 2008,我创建在SQL Server数据库这样的信息:我安装了JDBCJDBC连接到SQL Server:登录失败,用户X CREATE LOGIN ...

  3. 使用DBATools PowerShell修复SQL Server中的孤立用户

    This article gives an overview of Orphan users and fixing them using DBATools PowerShell. 本文概述了Orpha ...

  4. SQL SERVER数据库中GUEST用户

    SQL SERVER数据库中GUEST用户 问题 谁邀请这些客人(guest)到我的数据库中?你可知道在你的SQL SERVER数据库中还存在guest用户?你可知道SQL SERVER 需要gues ...

  5. Sql Server 2000 无法打开用户默认数据库。登录失败

    解决的办法是修改该用户的默认数据库为一个已经存在的数据库: 企业管理器--安全性--用户--右键登录失败的用户--属性--修改默认数据库 如果你不清楚是由那个用户引起的,则可以在查询分析器中,用sa登 ...

  6. 工作学习笔记——用SQL语句新建SQL SERVER数据库、数据库用户以及登录名

    查阅了一些资料,对几个概念先有了个大概的认识.登录名用来连接SQL SERVER数据库,也就是连接字符串里USER ID的值.同一个登录名可以操作很多数据库,只需要这些数据库中有拥有操作权限的数据库用 ...

  7. java sql 登录失败_java – 接收连接到SQL Server 2008的SQLException“用户登录失败”

    我试图通过 Java连接到SQL Server 2008. >我已将sqljdbc4.jar添加到我的项目库中. >没有为访问数据库的数据库设置用户名和密码(Windows身份验证). & ...

  8. SQL Server 2005登录名,用户名,角色,架构之间的关系

    SQL Server 2005对2000进行了很大的改进,而用户关系这部分也变得相当复杂了,很多朋友都对此一知半解!下面,我将把我应用中总结的和大家分享下,先从概念入手,希望对不理解的朋友有点提示. ...

  9. 如何使用PowerShell创建简单SQL Server数据库登录对话框

    In this article, we'll be creating a SQL Server login form, as shown in the example below, using Pow ...

  10. SQL SERVER 服务器登录名、数据库用户名、服务器角色、数据库角色、DENY、sp_addlogin ETC.

    数据库用户:隶属于服务器登录名:属于某组数据库角色以获取操作数据库的权限 如果,添加登录名的时候,用户映射那里,同时选择了一个数据库.并且该数据库的角色,勾选了db_ower或更高权限.那么SqlSe ...

最新文章

  1. 一篇文章教你搞定传说中的“随机森林”
  2. python方法和函数的格式是完全一样的_Python成为专业人士笔记-返回变量形式函数- str() 和 repr()...
  3. GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机
  4. endp 汇编start_飞思卡尔Kinetis L 汇编语言启动文件startup_MK25Z4简单分析
  5. mysql varchar 长度限制_MySQL数据库varchar的限制规则说明
  6. 需要单机还是集群部署_单机、分布式、集群的区别与联系
  7. jupyter notebook python怎么设置_jupyter notebook 的工作空间设置操作
  8. linux进程线程协程的区别,进程和线程、协程的区别
  9. ironpython不想要可以卸载吗_IronPython的致命弱点
  10. 她拒绝麦肯锡 Offer,建立图片训练数据库,斯坦福 AI 实验室负责人 | 人物志
  11. 计算机辅助 齿轮怎么做,ug怎么画齿轮_UG齿轮画法 UG绘制圆柱型齿轮的方法
  12. 闪迪U盘插入电脑后,系统能识别到插入,但在我的电脑中没有显示的解决方法
  13. 大数据分析师的报考条件是什么?
  14. 内网网段范围_局域网IP段有哪些 - 卡饭网
  15. 车辆出险理赔记录接口文档
  16. Python批量抓取swissadme数据——smiles
  17. 玩一玩Spring容器(可视化笔记02)
  18. R语言中如何编写自己的函数初步入门
  19. Latex中IOP模板下amsmath包报错
  20. 如何在Joomla中创建一个漂亮的单页网站

热门文章

  1. 《算法导论》第三版第31章 数论算法 练习思考题 个人答案
  2. Windows经典播放器Winamp回归 功能界面迎来全新改革
  3. golang mobile 开发移动应用第三方库
  4. VC实现对Excel表格的操作
  5. Python如何将多张照片制作成视频
  6. 超市库存管理系统 代码
  7. hqchartPy2数据对接教程7-指标引用
  8. echarts横向滚动_ECharts滑动条型数据区域缩放组件(dataZoomSlider)
  9. (Java)IntelliJ IDEA 2021.1使用技巧、常用快捷键大全(win+mac)
  10. jQuery实现的各种不同样式弹出框