我正在浏览我的Visual Studio数据库项目生成的脚本,我发现了这个:
GRANT CONNECT
ON ENDPOINT::[TSQL Default TCP] TO PUBLIC
AS [sa];
我不知道它的作用,但它似乎将PUBLIC访问权限授予SA(只是通过它的读取方式)。
任何人都知道这是真的吗? (Clearly it grants some access via an "ENDPOINT"。但用简单的英语做什么呢?)
通过阅读它,它告诉我任何通过TCP端口连接的人都可以作为[sa]运行。 (我希望这不对,但如果是,为什么Visual Studio的DB Project会这样做?)
答案 0 :(得分:4)
首先,GRANT是不正确的,原因很明显:它为被授权者使用名称[PUBLIC]
,但它应该是[public]
。在区分大小写的安装上,名称将无法解析。
现在关于你的问题:AS [sa]
部分与授予权限的行为相关,它不会转移给受让人。它读起来像:
我以
[sa]
的名义授予将[TSQL Default TCP]
端点连接到[public]
组成员的权限。
具体而言,它不暗示受让人([public]
的成员)将被提升为[sa]
。授予连接权限是连接到数据库的必要但不充分的特权。被授予者仍然需要访问数据库的权限(即,将用户映射到其在数据库中的登录)。此外,授予[public]
服务器主体的连接权限不等于为BUILTIN\Everyone
(或BUILTIN\ANONYMOUS LOGIN
的安全主体(或其他{{3)创建登录。换句话说,SQL Server中没有登录(通过NT组成员身份显式或隐式)的NT用户仍然无法连接到该实例。
作为旁注,在任何全新安装上运行以下查询都会发现连接到默认T-SQL端点的权限已授予[public]
:
select s.name as grantee,
e.name as endpoint,
p.permission_name as permission,
p.state_desc as state_desc
from sys.server_permissions p
join sys.server_principals s on s.principal_id = p.grantee_principal_id
join sys.endpoints e on p.major_id = e.endpoint_id
where p.type='CO'