Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Windows身份验证-限制SQL Server后端访问_Sql Server_Security_Windows Authentication_Database Administration - Fatal编程技术网

Sql server Windows身份验证-限制SQL Server后端访问

Sql server Windows身份验证-限制SQL Server后端访问,sql-server,security,windows-authentication,database-administration,Sql Server,Security,Windows Authentication,Database Administration,问题 早上好!我在一个应用程序团队工作,该团队支持一些利用SQL Server进行数据存储的应用程序。最近,我们的数据库支持团队决定不再允许SQL身份验证(出于安全和日志原因),因此我的团队被迫将所有连接转换为Windows身份验证,包括我们的应用程序用于数据检索的几个专用服务ID 首先,我要说的是,转到Windows身份验证肯定有好处,我不想对此提出异议。但这一变化给我们带来了一个巨大的问题。。。通过将我们的服务ID切换到Windows身份验证,我们现在已经向每个具有前端应用程序访问权限的内部

问题

早上好!我在一个应用程序团队工作,该团队支持一些利用
SQL Server
进行数据存储的应用程序。最近,我们的数据库支持团队决定不再允许
SQL身份验证
(出于安全和日志原因),因此我的团队被迫将所有连接转换为
Windows身份验证
,包括我们的应用程序用于数据检索的几个专用服务ID

首先,我要说的是,转到
Windows身份验证
肯定有好处,我不想对此提出异议。但这一变化给我们带来了一个巨大的问题。。。通过将我们的服务ID切换到
Windows身份验证
,我们现在已经向每个具有前端应用程序访问权限的内部业务用户开放了我们的后端数据库

msaccess
被推送到每个用户的桌面上,一些超级用户甚至可以访问
SSMS
。此时,我们完全依靠用户的无知来阻止内部用户直接访问后端数据库。考虑到某些角色提升了DML的权限,这可能会导致一些恶劣的数据后果

这一新的企业标准让我的团队在这一点上进退两难,因此我们正在寻找任何数据库、帐户或体系结构解决方案,以允许我们将用户访问限制在前端

问题

  • 还有其他人遇到过这个问题吗?我们是否缺少一种体系结构解决方案,它允许我们消除
    SQL身份验证
    ,而不公开数据库
  • 是否有人知道一种方法,可以将对
    SQL Server
    数据库的访问限制为仅使用某些连接方法?我想知道是否有办法将特定ID(或角色)指定为只允许通过前端进行连接(并完全消除
    ODBC
    连接)
  • 有人有聪明的解决办法吗
-----------编辑-------------------

一些人提出了一个关于角色访问的好观点,所以我想澄清我们以前和现在的解决方案。。。以前,所有角色访问都是在前端管理的,数据检索完全由私有系统SQL身份验证ID处理,最终用户对该ID不可见

当我们被迫消除这些SQL身份验证ID时,我们在后端数据库上创建了与前端数据库类似的基于角色的设置。创建Active Directory组是为了容纳不同的用户组,并在数据库中为这些组分配特定的角色权限。因此,目前访问权限尽可能受到角色的限制


问题是,即使是最低权限的角色也可以对某些表进行插入、更新和删除访问(通常通过代码控制访问)。因此,虽然我们能够通过利用数据库角色在某种程度上降低风险,但我们仍然可以让用户通过直接登录数据库绕过前端保护。

编辑:问题澄清使此答案过时,但由于一些评论对此进行了讨论,因此将其留作参考。

假设您的意思是必须(基于您的体系结构)允许每个windows用户帐户访问数据库,一个选项是使用数据库角色

您可以禁用对数据库的公共访问,然后根据您的用例定义一组数据库角色。每个角色都被授予权限,以便该角色的成员能够操作他们需要的数据和/或使用他们需要的对象。然后将用户映射到他们需要的角色中。连接到数据库时,将根据用户所属的角色授予用户权限

例如,我们在一个名为
MyAppUser
的数据库中有一个角色(我们的名字实际上与使用数据库的应用程序有关),该数据库仅为最终用户设计用于读取和插入数据。可以简单地按如下方式创建:

CREATE ROLE [MyAppUser]
角色只被授予它对相关模式或表的权限(假设我们所有的“公共”表现在都在dbo模式中)

应具有此公共读写访问权限的每个用户都将映射到相关角色

ALTER ROLE [MyAppUser] ADD MEMBER [UserName]
这将分离数据库中的用户和角色/权限,并允许您使用单个入口点来控制谁可以访问数据库中的内容

默认情况下(对最终用户)拒绝“查看定义”权限,他们将无法使用access甚至SSMS“浏览”数据库/视图表定义等。


注意:SSMS提供了用于管理和查看权限和成员身份的向导,这些向导对于最初设置/测试/处理非常方便。

SQL和Windows身份验证之间应该没有区别,除非您一开始没有安全性,并且依赖于向最终用户隐藏SQL帐户的密码。创建适当的角色,授予表/存储过程对适当角色的访问权,并将用户分配给这些角色,无论这些角色是Windows还是SQL用户。您是正确的,从数据库的角度来看,在我们的SQL Auth解决方案下,我们没有用户直接或通过应用程序连接到数据库。用户角色仅通过前端进行管理,任何数据请求都将被提供给私有系统SQL ID,该ID将处理所有数据库调用。此后,我们将应用程序级角色也移到了数据库层,但这允许最终用户在直接访问数据库时绕过数据输入逻辑。您可以将Windows组映射到。这使得管理用户更加容易,因为域管理员可以在一个地方添加/删除用户,例如数据库和网络访问。@PanagiotisKanavos:
ALTER ROLE [MyAppUser] ADD MEMBER [UserName]