标签: security

SQL Server 2008 加密的简单实现

我正在考虑使用一些 SQL Server 2008 的加密。

我在 MSDN 上阅读了以下文章:

Q1a:是否为每个数据库实例创建了主密钥密码?

IF NOT EXISTS 
    (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
    CREATE MASTER KEY ENCRYPTION BY 
    PASSWORD = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
GO
Run Code Online (Sandbox Code Playgroud)

Q1b:如果我在 Server1 上创建主密钥密码并加密表中的列。当我备份该数据库 (.bak) 时,我是否能够将数据库还原到另一个 Server2,或者我是否必须使用相同的密码在 Server2 上创建一个主密钥?

Q2 : 如果我想恢复到另一台服务器,是否需要备份证书、主密钥或对称密钥?

CREATE CERTIFICATE HumanResources037
   WITH SUBJECT = 'Employee Social Security Numbers';
GO

CREATE SYMMETRIC KEY SSN_Key_01
    WITH ALGORITHM = AES_256
    ENCRYPTION BY CERTIFICATE HumanResources037;
GO
Run Code Online (Sandbox Code Playgroud)

Q3 : 什么时候应该打开对称密钥?应该在每次选择之前完成然后关闭吗?即在存储过程开始时打开,然后关闭。

-- Open the symmetric key with which to encrypt the …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 security encryption

3
推荐指数
1
解决办法
1953
查看次数

SQL Server 2005 - 将登录映射到预先存在的用户

简而言之,我们有几个数据库在两个故障转移实例之间同步。主要包含映射到数据库中用户的登录名,并且一切都很正常。但是,我没有意识到服务器登录不会在故障转移实例之间同步,因此当故障转移到备份时,没有人可以登录。关键是虽然我可以在备份上创建登录,但我不能t 将登录作为用户映射到数据库,因为具有该名称的数据库用户已经存在,并且登录不会使用现有用户,因此登录仍然失败,因为登录没有连接到数据库的权限。

我认为我必须做的是修改备份的主数据库中的登录名,使其与主数据库的登录名具有相同的 GUID,并在备份端手动创建登录名和用户之间的链接,从而“欺骗”备份实例认为在主服务器上创建的用户也是它自己的映射登录名。然而,我不知道我将如何去做这件事,而且我们在这个问题上遇到了足够多的麻烦,而我却没有为此烦恼。

帮助?

sql-server-2005 security sql-server failover

3
推荐指数
1
解决办法
894
查看次数

这是否意味着“公共”具有完全选择、插入、更新和删除访问权限?

我正在尝试创建一个SQL Server 2008 R2只能从一个 SQL 视图中进行选择的新数据库用户。但是,无论我在以这个新用户身份登录时尝试什么,我都可以从任何表中进行选择。我运行了这个查询:

select  princ.name
,       princ.type_desc
,       perm.permission_name
,       perm.state_desc
,       perm.class_desc
,       object_name(perm.major_id)
from    sys.database_principals princ
left join
        sys.database_permissions perm
on      perm.grantee_principal_id = princ.principal_id
WHERE princ.name = 'public'
AND object_name(perm.major_id) = 'User_Table'
Run Code Online (Sandbox Code Playgroud)

并得到这些结果:

name    type_desc       permission_name     state_desc  class_desc          (No column name)
public  DATABASE_ROLE   DELETE              GRANT       OBJECT_OR_COLUMN    User_Table
public  DATABASE_ROLE   INSERT              GRANT       OBJECT_OR_COLUMN    User_Table
public  DATABASE_ROLE   REFERENCES          GRANT       OBJECT_OR_COLUMN    User_Table
public  DATABASE_ROLE   SELECT              GRANT       OBJECT_OR_COLUMN    User_Table
public  DATABASE_ROLE   UPDATE              GRANT       OBJECT_OR_COLUMN    User_Table
Run Code Online (Sandbox Code Playgroud)

这是否意味着无论登录到数据库的任何人都具有基于“公共”权限的完全访问权限?

sql-server-2008 security sql-server permissions sql-server-2008-r2

3
推荐指数
1
解决办法
1万
查看次数

我可以配置 MySQL 的类型转换来考虑 0 != 'foo' 吗?

本文指出 MySQL 存在以下安全问题:

USERS
id | email            | password_reset_token
1  | one@example.com  | QTlXww)uV!Hdg3U6aGwKV2FPvAqzVgPx
2  | two@example.com  | CZor5t7WbX#LTeqiG3v@6f3@z#)BfK*n
Run Code Online (Sandbox Code Playgroud)

在这里,我们有很好的随机令牌,用户必须证明他们拥有才能重置他们的帐户。但是用户设法提交了一个重置​​令牌0,所以我们运行这个查询:

SELECT * FROM `users` WHERE `email` = 'one@example.com' AND `password_reset_token` = 0
Run Code Online (Sandbox Code Playgroud)

MySQL将令牌转换VARCHAR为 anINT以进行比较。它认为一个VARCHAR不以数字开头的 a等于 0。因此,攻击者可以匹配任何非数字字符串并接管帐户

即使重置令牌开始一些数字,情况也好不到哪里去。MySQL 在进行此比较时忽略除初始数字之外的所有字符,因此它考虑12blahblah3blah4等于12,这使得猜测更容易。

我可以将 MySQL 配置为不进行这种类型转换吗?例如,如果它投射INTVARCHAR而不是反之,则此攻击将不起作用。

笔记

如果使用'0'而不是运行查询0,这将不起作用。本文根据 Ruby on Rails 对 XML 的接受程度来讨论此漏洞,其中type=integer属性说服 Rails 在查询中发送一个实际整数。

该错误已在 …

mysql security configuration

3
推荐指数
1
解决办法
688
查看次数

如果用户需要 INSERT/UPDATE/DELETE 权限,Windows 身份验证是否仍然比 SQL Server 身份验证更安全?

先介绍一下背景:

如果所讨论的数据库是按照 DBA 的思维方式构建的,则下面描述的问题根本不存在:
仅通过视图和存储过程访问数据 --> 用户无需对表具有任何权限即可使用该应用程序.

但问题的数据库是一个“开发商的心态”制作的,所以应用程序发送INSERTUPDATEDELETE查询到服务器- >它需要有足够的权限的帐户才能够访问数据库。


显然每个人都同意 Windows 身份验证比 SQL Server 身份验证更安全,例如这里:

我的问题:
当数据库是以开发人员的心态构建时,这仍然有效,如上所述?(当用户需要INSERT/ UPDATE/DELETE对表的权限)

为什么我问这个:
我们的主要应用程序是一个带有 SQL Server 数据库的 MS Access 前端。目前,我们正在使用 Windows 身份验证,但我正在考虑切换到 SQL 身份验证。

我看到的问题:
每个人都使用自己的 Windows 帐户连接到数据库。
因此,为了使应用程序工作时,Windows帐户所有人和他们的狗需要有INSERT/ UPDATE/DELETE该表的权限。

这意味着这里的每个人都可以创建一个新的 Access 数据库,从我们的主数据库中链接几个表并编辑(或删除)它们
是的,我们有一些真正知道如何做到这一点的高级用户。

从这个角度来看,我很难理解为什么在推荐 Windows 身份验证而不是 SQL 身份验证时显然没有考虑这种安全威胁。

对我来说,任何人都可以使用他的 Windows …

authentication security sql-server windows

3
推荐指数
1
解决办法
1642
查看次数

如何限制用户只能通过应用程序文本框字段选择查询?

假设我有一个 Web 应用程序,它允许用户输入 SQL 查询(SQL Server 2008+)。我希望用户能够运行任何 SELECT 查询并读取数据库中的任何内容,但我不希望他们能够插入/更新/删除/截断/执行等(简而言之:仅选择)。请注意,整个数据库中没有数据甚至数据库元数据被视为机密。

目前的规则:

  1. 不 ”;” 特点。如果它在那里,它必须正好是 1 并且位于修剪后的查询字符串的末尾。
  2. 查询必须以 select 开头(忽略大小写,空格是正则表达式的一部分)。
  3. 所有换行符都从查询中删除。

这够了吗?除了选择之外,还有什么办法可以做吗?

编辑:谢谢 Thomas Stringer 关于 SELECT ... INSERT 的说明。这正是我所追求的信息。我将从查询字符串中删除所有换行符,这应该有助于解决这个问题。有没有其他方法可以解决这个问题并能够修改数据?

注意:CTE 与这种情况无关。让我们假设查询必须以 SELECT 开头。

security sql-server sql-injection

3
推荐指数
1
解决办法
5042
查看次数

防止 SysAdmin 执行数据库还原

我是我的 SQL Server 2008 的系统管理员,我需要成为,但我想在生产服务器上设置我的安全性,以防止我意外恢复到生产数据库。我经常将数据库恢复到测试机器上供开发人员调试/测试,虽然我总是非常小心,大约十年后,今天我不是。

我的想法是在恢复权限上设置拒绝,如果我真的需要恢复,请删除拒绝,但我找不到这样的东西。

有谁知道如何做到这一点,或者有更好的主意?

security sql-server permissions sql-server-2008-r2 restore

3
推荐指数
2
解决办法
1162
查看次数

系统管理员的 CREATE DATABASE 权限被拒绝

我正在尝试创建一个存储过程,该过程可用作创建数据库的代理,而用户无权创建数据库。请参阅限制用户组访问数据库/功能?欲了解更多信息

当我尝试执行存储过程时,SQL Server 生成一个安全错误:

Msg 262, Level 14, State 1, Line 1
CREATE DATABASE permission denied in database 'master'.
Run Code Online (Sandbox Code Playgroud)

这是代码:

CREATE LOGIN DatabaseCreator WITH PASSWORD='Pa$$w0rd'; /* REPLACE WITH A SECURE PASSWORD! */
GO
CREATE USER DatabaseCreator FOR LOGIN DatabaseCreator;
GO
EXEC sys.sp_addsrvrolemember 'DatabaseCreator','sysadmin';
GO
CREATE PROCEDURE dbo.CreateDatabase
(
    @DatabaseName SYSNAME
)
WITH EXECUTE AS 'DatabaseCreator'
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @cmd NVARCHAR(max);
    IF COALESCE(@DatabaseName,'') <> ''
    BEGIN
        SET @cmd = 'CREATE DATABASE ' + QUOTENAME(@DatabaseName) + ';' …
Run Code Online (Sandbox Code Playgroud)

security sql-server sql-server-2008-r2

3
推荐指数
1
解决办法
1万
查看次数

当用户属于具有各种权限的多个组时,SQL Server 如何处理登录?

我试图围绕 SQL Server 如何决定根据用户登录权限授予某些权限。如果用户属于有权访问 DB1 的“READ ONLY”组,但他们也属于对同一 DB1 具有完全数据库所有者权限的“SysAdmin”组,则他们在登录时会获得哪些权限? 在类似的说明上。如果他们是一个组的一部分,但也有一个具有其他中间权限的独立帐户怎么办?

security sql-server

3
推荐指数
1
解决办法
835
查看次数

DROP LOGIN 在 SQL Server 2014 上失败

我们有一个所有者为“dbowner”的数据库。我们的安装过程删除用户“dbowner”的登录名并重新创建它。

在任何其他版本的 SQL Server 上,以下 SQL 查询成功:

USE [master]
DROP LOGIN 'dbowner'
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 2014 上,相同的查询返回以下错误:

登录 'dbowner' 拥有一个或多个数据库。在删除登录之前更改数据库的所有者。

谁能解释为什么这在 SQL Server 2014 上会有所不同?删除登录适用于所有其他版本的 SQL Server(2005、2008 和 2012)。

是否有任何设置可以强制在 SQL Server 2014 上使用相同的设置?

更新:

我可以用一个使用 Windows 用户的例子来复制这个。有任何想法吗?

CREATE LOGIN [comp\winuser] FROM WINDOWS;
GO
CREATE DATABASE mydb;
GO
ALTER AUTHORIZATION ON DATABASE::mydb TO [comp\winuser];
GO
DROP LOGIN [comp\winuser];
GO
Run Code Online (Sandbox Code Playgroud)

更新 2:

谢谢您的意见。我同意删除所有者的登录名是不可取的(但除 SQL Server 2014 外,其他地方的 Windows 用户都可以使用)。然而,我们的安装脚本目前依赖于它,极其复杂的数据库安装过程是 15 年前某个人制作的(他不再与我们合作了)。如果可能(只要它有效),我们希望避免更改该领域。

在我看来,我们有三个选择:

  1. 使 SQL 2014 像以前的版本一样运行并保持脚本不变。我们更喜欢这个选项,我在这里发帖看看是否可以做到。
  2. 将所有者更改为其他用户,删除并创建所有者登录并将所有者移回。这是一个黑客,但可能会奏效。
  3. 改变我们处理用户的方式并停止放弃所有者的登录。这将是正确的方法,但也是最大的变化。

security sql-server users logins sql-server-2014

3
推荐指数
1
解决办法
7702
查看次数