我有一个新的 SQL Server 2019 本地实例。假设客户端是 SQL Server Management Studio 或任何其他应用程序:
Active Directory 身份验证被认为更安全,因为 SQL Server 身份验证允许在通过网络传递时以纯文本形式查看登录信息。
我们有多个 SQL Server,每个 SQL Server 拥有数十个数据库 - 每个客户端一个(在这种情况下,客户端意味着一个客户组织)。这些数据库是通过应用程序访问的,但该应用程序当前使用单个 Windows 登录。因此,这会产生安全风险,即如果存在某些应用程序漏洞,理论上可以访问“其他”客户端的数据库。
处理这种情况的最佳方法是什么?
我们是否应该为每个客户端创建单独的登录名并让应用程序使用单独的登录凭据进行连接?这将降低安全风险,但会产生大量的管理开销(这可能是值得的)。
后续问题是:在这种情况下我们应该使用 Windows AD 安全性还是 SQL Server 身份验证。
我很感激任何建议!
我想允许某些用户在数据库(表、视图、sp、函数、模式等)上创建/修改对象,并且不想给 db_owner。
我以为我可以使用 db_ddladmin 角色来做到这一点,但不知何故这并不如预期。我得到的错误消息是这样的:
Your are not loggend on as the database owner or system administrator.
You might not beable to sache changes to tables that you do not own.
Table dbo.MyTable is set to read only,
user doesn't have enough right on this table.
Run Code Online (Sandbox Code Playgroud)
等等
知道如何实现我的目标吗?
我意识到您可以从 1433 的默认端口更改默认实例,同样您可以使命名实例使用静态端口而不是动态端口,但通常命名实例比默认实例更安全以抵御外部入侵者?
这就是为什么我会认为是这样的:
对此有何想法?我在左场出路了吗,这没有区别吗?
我已经过滤了访问数据库服务器的 IP 地址,如下所示:
设置sqlnet.ora
tcp.validnode_checking = YES
tcp.invited_nodes = (localhost, 192.168.100.130, 192.168.100.186)
Run Code Online (Sandbox Code Playgroud)
但是在我的 ORACLE_HOME 中,有 1 个以上的数据库,比如说 DB WORKSHOP 和 DB COURSE
我想问一下每个数据库连接数据库的问题,例如:
DB WORKSHOP only can be access from 192.168.100.130
DB COURSE only can be access from 192.168.100.186
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能做到?
我的客户经常运行我们将数据库从 prod 环境移动到较低环境的过程(使用 prod 数据库刷新 QA 等)。这些 DB 上有数据库主密钥。我们将这些重新加密到目标服务器上的服务主密钥中没有问题,但这是烦人的部分:
这本身不是问题。解决方法始终是将 DMK 重新加密为 SMK。我们只想知道它是否已经完成。任何人都有任何技巧吗?
谢谢,埃里克
SQL Server 2008,通过 SQL Server 身份验证连接。
我有一个存储过程在DatabaseA其调用sp_send_dbmail在msdb同一个文件附件的电子邮件。该文件在数据库服务器上,而不是在远程文件共享上。
正在使用的SQL Server的帐户没有系统管理员,但的确属于DatabaseMailUserRole在msdb。
发送没有附件的电子邮件是可以的,但是当存在附件时,我收到一个错误:
无法模拟客户端连接安全上下文。附加文件需要集成的客户端登录
有一些关于此的文章/帖子,但有些似乎在说相互矛盾的事情。我一直在研究模拟,并且在 中的存储过程中起作用的一件事是DatabaseA执行以下操作:
EXECUTE AS LOGIN = 'sa' -- or any account with sysadmin privileges
EXECUTE msdb..sp_send_dbmail ....
REVERT
Run Code Online (Sandbox Code Playgroud)
我没想到这会起作用,因为我想发送附件,您需要使用 Windows 身份验证。但是它确实有效,但这意味着需要授予权限较低的 SQL Server 帐户来模拟 sa(或其他系统管理员帐户)。
在将 DBA 的噩梦释放到野外之前,做我作为开发人员的尽职调查......
我的问题是:允许通过 SQL Server(非系统管理员)进行身份验证的用户在不打开安全漏洞的情况下从本地数据库服务器磁盘发送电子邮件附件的好/安全方法是什么?
更新:
回复:凭据
我创建了一个新的 Windows 登录,通过 SSMS 为该帐户创建凭据,将这些凭据映射到我的有限权限 SQL Server 帐户。我收到错误:
消息 22051,级别 16,状态 1,第 0 行
无法模拟客户端连接安全上下文。
附加文件需要集成的客户端登录
我肯定错过了什么!
我在无法编辑自己的作业的 SQL 2008 服务器上有 AD ID 用户。他们可以创建它们,但是为了编辑它们,他们必须删除它们然后重新添加它们。这个问题在这里解释:http : //blogs.msdn.com/b/sqlserverfaq/archive/2009/06/08/owner-of-the-job-will-not-be-able-to-modify-edit-在-job-in-sql-server.aspx
我做了进一步的研究并发现在我的特殊情况下这是因为我使用 CREATE LOGIN [domain\user] 语法添加了 AD ID 用户。使用该方法,AD ID 的大小写就是您在括号中指定的内容。
无论如何,是否可以使用正确的 Windows AD ID 案例创建用户,以便我不必弄清楚然后修改每个 AD ID 用户的登录名?
此外,我使用此脚本为特定用户获取正确的大小写:
execute as login = 'usa\johndoe'
SELECT SUSER_SNAME()
revert;
Run Code Online (Sandbox Code Playgroud)
但是当我要求用户运行 SELECT SUSER_SNAME() 并给我结果时,它为我返回所有小写字母,但所有大写字母。正确的是全部大写(好吧,为了让该用户能够编辑作业)。
我不知所措,非常沮丧。
-- 我发现获得正确大小写的最佳(唯一?)方法是使用 SQL 界面添加用户,单击搜索,输入 AD ID,然后单击检查名称。对于上面的示例,它返回所有大写字母,尽管该脚本示例返回所有小写字母。
我正在使用 WMI 来获取服务器本地组的成员以及成员的 SID。WQL 查询适用于本地用户、本地组、AD 域用户和 AD 域组的成员。但是,当脚本查看恰好与 SQL Server 相关的成员时,它在它认为应该查看的类中找不到对象,因此我没有得到成员的 SID。例如,以下是为碰巧与 SQL Server 相关的组成员动态构造的一些查询:
select SID from Win32_SystemAccount where Domain='NT SERVICE' and Name='SQLBrowser'
select SID from Win32_SystemAccount where Domain='NT SERVICE' and Name='MsDtsServer100'
select SID from Win32_SystemAccount where Domain='NT SERVICE' and Name='SQLAgent$SQLEXPRESS'
select SID from Win32_SystemAccount where Domain='NT SERVICE' and Name='MSSQL$EPROVISIONAPP'
select SID from Win32_SystemAccount where Domain='NT SERVICE' and Name='MSOLAP$EPROVISIONAPP'
select SID from Win32_SystemAccount where Domain='NT SERVICE' and Name='ReportServer$EPROVISIONAPP'
select SID from Win32_SystemAccount where Domain='NT SERVICE' and Name='SQLAgent$EPROVISIONAPP'
Run Code Online (Sandbox Code Playgroud)
上面的查询不返回任何结果,即使这些成员的 PartComponent …
security ×10
sql-server ×6
encryption ×1
multi-tenant ×1
oracle ×1
permissions ×1
postgresql ×1
ssms ×1
t-sql ×1