我正在考虑使用一些 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) 简而言之,我们有几个数据库在两个故障转移实例之间同步。主要包含映射到数据库中用户的登录名,并且一切都很正常。但是,我没有意识到服务器登录不会在故障转移实例之间同步,因此当故障转移到备份时,没有人可以登录。关键是虽然我可以在备份上创建登录,但我不能t 将登录作为用户映射到数据库,因为具有该名称的数据库用户已经存在,并且登录不会使用现有用户,因此登录仍然失败,因为登录没有连接到数据库的权限。
我认为我必须做的是修改备份的主数据库中的登录名,使其与主数据库的登录名具有相同的 GUID,并在备份端手动创建登录名和用户之间的链接,从而“欺骗”备份实例认为在主服务器上创建的用户也是它自己的映射登录名。然而,我不知道我将如何去做这件事,而且我们在这个问题上遇到了足够多的麻烦,而我却没有为此烦恼。
帮助?
我正在尝试创建一个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
本文指出 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 配置为不进行这种类型转换吗?例如,如果它投射INT到VARCHAR而不是反之,则此攻击将不起作用。
如果使用'0'而不是运行查询0,这将不起作用。本文根据 Ruby on Rails 对 XML 的接受程度来讨论此漏洞,其中type=integer属性说服 Rails 在查询中发送一个实际整数。
该错误已在 …
先介绍一下背景:
如果所讨论的数据库是按照 DBA 的思维方式构建的,则下面描述的问题根本不存在:
仅通过视图和存储过程访问数据 --> 用户无需对表具有任何权限即可使用该应用程序.
但问题的数据库是一个“开发商的心态”制作的,所以应用程序发送INSERT,UPDATE并DELETE查询到服务器- >它需要有足够的权限的帐户才能够访问数据库。
显然每个人都同意 Windows 身份验证比 SQL Server 身份验证更安全,例如这里:
我的问题:
当数据库是以开发人员的心态构建时,这仍然有效,如上所述?(当用户需要INSERT/ UPDATE/DELETE对表的权限)
为什么我问这个:
我们的主要应用程序是一个带有 SQL Server 数据库的 MS Access 前端。目前,我们正在使用 Windows 身份验证,但我正在考虑切换到 SQL 身份验证。
我看到的问题:
每个人都使用自己的 Windows 帐户连接到数据库。
因此,为了使应用程序工作时,Windows帐户所有人和他们的狗需要有INSERT/ UPDATE/DELETE该表的权限。
这意味着这里的每个人都可以创建一个新的 Access 数据库,从我们的主数据库中链接几个表并编辑(或删除)它们。
是的,我们有一些真正知道如何做到这一点的高级用户。
从这个角度来看,我很难理解为什么在推荐 Windows 身份验证而不是 SQL 身份验证时显然没有考虑这种安全威胁。
对我来说,任何人都可以使用他的 Windows …
假设我有一个 Web 应用程序,它允许用户输入 SQL 查询(SQL Server 2008+)。我希望用户能够运行任何 SELECT 查询并读取数据库中的任何内容,但我不希望他们能够插入/更新/删除/截断/执行等(简而言之:仅选择)。请注意,整个数据库中没有数据甚至数据库元数据被视为机密。
目前的规则:
这够了吗?除了选择之外,还有什么办法可以做吗?
编辑:谢谢 Thomas Stringer 关于 SELECT ... INSERT 的说明。这正是我所追求的信息。我将从查询字符串中删除所有换行符,这应该有助于解决这个问题。有没有其他方法可以解决这个问题并能够修改数据?
注意:CTE 与这种情况无关。让我们假设查询必须以 SELECT 开头。
我是我的 SQL Server 2008 的系统管理员,我需要成为,但我想在生产服务器上设置我的安全性,以防止我意外恢复到生产数据库。我经常将数据库恢复到测试机器上供开发人员调试/测试,虽然我总是非常小心,大约十年后,今天我不是。
我的想法是在恢复权限上设置拒绝,如果我真的需要恢复,请删除拒绝,但我找不到这样的东西。
有谁知道如何做到这一点,或者有更好的主意?
我正在尝试创建一个存储过程,该过程可用作创建数据库的代理,而用户无权创建数据库。请参阅限制用户组访问数据库/功能?欲了解更多信息
当我尝试执行存储过程时,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) 我试图围绕 SQL Server 如何决定根据用户登录权限授予某些权限。如果用户属于有权访问 DB1 的“READ ONLY”组,但他们也属于对同一 DB1 具有完全数据库所有者权限的“SysAdmin”组,则他们在登录时会获得哪些权限? 在类似的说明上。如果他们是一个组的一部分,但也有一个具有其他中间权限的独立帐户怎么办?
我们有一个所有者为“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 年前某个人制作的(他不再与我们合作了)。如果可能(只要它有效),我们希望避免更改该领域。
在我看来,我们有三个选择:
security ×10
sql-server ×8
permissions ×2
encryption ×1
failover ×1
logins ×1
mysql ×1
restore ×1
users ×1
windows ×1