SQL Server安全:登录和用户
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在每个数据库中都内置两个特殊的用户:dbo和guest,在每个数据库中都有这两个用户(User):
- dbo(database 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_SCHEMA
和 sys
,每个数据库都包含这两个用户,这两个用于是数据库引擎内部使用,不能被修改和删除。
补充
Login无法通过SSMS登录
将数据库服务器的身份验证模式
更改成SQL Server 和 Windows 身份验证模式
,然后重启SQL Server服务(不是重启SSMS软件)
SQL Server安全:登录和用户相关推荐
- 【转载】SQL Server 2008 中新建用户登录并指定该用户的数据库
提要:我在 SQL Server 中新建用户登录时,出现了三种错误,错误代码分别是 18456.15128.4064 -----------------------------------正 文 -- ...
- java sql 登录失败_JDBC连接到SQL Server:登录失败,用户X
我想设置一个JDBC连接到SQL Server 2008,我创建在SQL Server数据库这样的信息:我安装了JDBCJDBC连接到SQL Server:登录失败,用户X CREATE LOGIN ...
- 使用DBATools PowerShell修复SQL Server中的孤立用户
This article gives an overview of Orphan users and fixing them using DBATools PowerShell. 本文概述了Orpha ...
- SQL SERVER数据库中GUEST用户
SQL SERVER数据库中GUEST用户 问题 谁邀请这些客人(guest)到我的数据库中?你可知道在你的SQL SERVER数据库中还存在guest用户?你可知道SQL SERVER 需要gues ...
- Sql Server 2000 无法打开用户默认数据库。登录失败
解决的办法是修改该用户的默认数据库为一个已经存在的数据库: 企业管理器--安全性--用户--右键登录失败的用户--属性--修改默认数据库 如果你不清楚是由那个用户引起的,则可以在查询分析器中,用sa登 ...
- 工作学习笔记——用SQL语句新建SQL SERVER数据库、数据库用户以及登录名
查阅了一些资料,对几个概念先有了个大概的认识.登录名用来连接SQL SERVER数据库,也就是连接字符串里USER ID的值.同一个登录名可以操作很多数据库,只需要这些数据库中有拥有操作权限的数据库用 ...
- java sql 登录失败_java – 接收连接到SQL Server 2008的SQLException“用户登录失败”
我试图通过 Java连接到SQL Server 2008. >我已将sqljdbc4.jar添加到我的项目库中. >没有为访问数据库的数据库设置用户名和密码(Windows身份验证). & ...
- SQL Server 2005登录名,用户名,角色,架构之间的关系
SQL Server 2005对2000进行了很大的改进,而用户关系这部分也变得相当复杂了,很多朋友都对此一知半解!下面,我将把我应用中总结的和大家分享下,先从概念入手,希望对不理解的朋友有点提示. ...
- 如何使用PowerShell创建简单SQL Server数据库登录对话框
In this article, we'll be creating a SQL Server login form, as shown in the example below, using Pow ...
- SQL SERVER 服务器登录名、数据库用户名、服务器角色、数据库角色、DENY、sp_addlogin ETC.
数据库用户:隶属于服务器登录名:属于某组数据库角色以获取操作数据库的权限 如果,添加登录名的时候,用户映射那里,同时选择了一个数据库.并且该数据库的角色,勾选了db_ower或更高权限.那么SqlSe ...
最新文章
- 一篇文章教你搞定传说中的“随机森林”
- python方法和函数的格式是完全一样的_Python成为专业人士笔记-返回变量形式函数- str() 和 repr()...
- GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机
- endp 汇编start_飞思卡尔Kinetis L 汇编语言启动文件startup_MK25Z4简单分析
- mysql varchar 长度限制_MySQL数据库varchar的限制规则说明
- 需要单机还是集群部署_单机、分布式、集群的区别与联系
- jupyter notebook python怎么设置_jupyter notebook 的工作空间设置操作
- linux进程线程协程的区别,进程和线程、协程的区别
- ironpython不想要可以卸载吗_IronPython的致命弱点
- 她拒绝麦肯锡 Offer,建立图片训练数据库,斯坦福 AI 实验室负责人 | 人物志
- 计算机辅助 齿轮怎么做,ug怎么画齿轮_UG齿轮画法 UG绘制圆柱型齿轮的方法
- 闪迪U盘插入电脑后,系统能识别到插入,但在我的电脑中没有显示的解决方法
- 大数据分析师的报考条件是什么?
- 内网网段范围_局域网IP段有哪些 - 卡饭网
- 车辆出险理赔记录接口文档
- Python批量抓取swissadme数据——smiles
- 玩一玩Spring容器(可视化笔记02)
- R语言中如何编写自己的函数初步入门
- Latex中IOP模板下amsmath包报错
- 如何在Joomla中创建一个漂亮的单页网站