Tag Archives: Security

參與一次 SQL Injection 防禦

最近與 Winnie 合作,找尋一個癱瘓網路的攻擊原因,整個伺服器群內滿目瘡痍的木馬。又與 SQL Injection 這個老問題有關,只是這次不僅是偷資料,而是毀掉 IT 機房內的各系統

眾多開發商,各種帳號權限過大,程式碼有 SQL Injection 的問題…

幾個老生常談的基本阻斷面向:

  • 帳號與權限
    • SQL Server Services Account 權限不可以大
    • AP 帳號不能有SQL Server System Admin 權限
  • 程式碼品質
    • AP 程式要防 SQL Injection
  • 功能
    • Firewall 要有阻斷、監控、追蹤的功能
    • SQL Server Surface Area 要關閉
  • 監控
    • 網路的監控能力
    • SQL Auditing 要開啟,尤其對高權限語法
    • 定期看SQL Server log 與 trace
    • 對 Audit 與 Log 的變動要被 trace 與 warning

另外,對外包廠商的品管能力非一般 IT 系統管理員能及,這是個隱憂。因為管理員無法回答安裝設定,各種帳號權限、功能需求、追蹤所得資料的意義、程式碼品質…

看來,幾個可以主動阻斷高權限語法傳遞到 DB 伺服器的資安產品真的有賣點,但若這些產品誤判,是否它本身就發揮了病毒的功能…

DBA 參與開發都屬於安全的一環了

 

附上 Winnie 對這個案子的看法 ^^

  • 資料庫涉及的問題真的很廣泛
  • 如果知道資料庫安全性運作的原理及管理就可以了解有什麼可能的途徑會造成今天的事件,方便之門一但打開了,小偷也會一起進來。所以DBA在日常也要扮演安全的守門員。
  • 還有…虛擬化在這個時候更彰顯了它的好處。因為網段裡的每一台電腦都要重灌,而且還要找到實體機暫時替代,可能一個月的工作都是在裝機吧。
廣告

透過 Certificate 建立跨 DB 的信任

參照 Ellie 的 blog

http://www.dotblogs.com.tw/ellie.hong/archive/2011/11/16/58341.aspx

跨資料庫信任與 msdb.dbo.sp_send_dbmail

Ellie 真是一位用功的夥伴 :),以下是她的問題與測試

 

Dear 百敬老師,

請問一個db mail 的問題。

Scenario

1) grant msdb.dbo.sp_send_dbmail的執行權限給 aaa,

2) 在其它user db 裡 create SP with exec as ‘aaa’

3) 有權限執行步驟2)建立的SP之使用者,要可以發信

測試script及Error 如下:

/* create sql login */

use master

go

create login [aaa] with password= N’password’

go

create login [bbb] with password= N’password’

go

use msdb

go

create user [aaa] for login [aaa]

go

/*

EXEC msdb.dbo.sp_addrolemember @rolename = ‘DatabaseMailUserRole’

    ,@membername = ‘aaa’;

GO

EXEC sp_droprolemember N’DatabaseMailUserRole’, N’aaa’

*/

GRANT EXEC ON [dbo].[sp_send_dbmail] TO [aaa]

go

/* create test DB & stored procedure */

create database TestMailDB

Go

use TestMailDB

go

create user [aaa] for login [aaa]

go

create user [bbb] for login [bbb]

go

create proc test_email

with exec as’aaa’

as

EXEC msdb.dbo.sp_send_dbmail       

        @recipients =’someone@someSMTP.com’,    

        @subject= ‘TEST’ ;

go

grant exec on test_email to [bbb]

go

/* execute stored procedure */

exec as user =’bbb’

go

exec test_email

revert

錯誤訊息

訊息 229,層級 14,狀態 5,程序 sp_send_dbmail,行 1
結構描述 ‘dbo’,資料庫 ‘msdb’,物件 ‘sp_send_dbmail’ 沒有 EXECUTE 權限。

/* clean testing data */

use master

drop database TestMailDB

use msdb

drop user [aaa]

use master

drop login [aaa]

drop login [bbb]

我google到一篇文章,介紹使用certificate的方法可達到我要求的目的。

http://www.sqlservercentral.com/articles/Security/68873/

請問老師是不是有其它較好的方法? 謝謝。

 

我的回答如下:

Dear Ellie,

這是跨 DB 安全的一個典型。

妳的作法就是文中提及 trustworthy 的作法,只要設定如下就可執行
alter database TestMailDB set trustworthy on

但該 DB 的 db_owner(dbo) 和 db_ddladmin 等相關安全權利需要掌握在妳手上,若其他人在該 DB 擁有上述權利,且知道 login 及其他 DB 的 user 關係,就有安全疑慮

否則就要利用文中的 certificate 作法。

謝謝

百敬

 

 

 

 

Ellie 提供的 Certificate Script

— Create a database for the Example
CREATE DATABASE TestDBMail
GO

— Switch the database
USE [TestDBMail]
GO

create proc test_email
WITH EXECUTE AS OWNER
–exec as user = ‘DBMailLogin’
AS
BEGIN
EXEC msdb.dbo.sp_send_dbmail       
        @recipients = someone@someSMTP.com’,    
        @subject = ‘TEST’ ;
End;      
go

CREATE CERTIFICATE [DBMailCertificate]
ENCRYPTION BY PASSWORD = ‘password’
WITH SUBJECT = ‘Certificate for signing TestSendMail Stored Procedure’;
GO

— Backup certificate so it can be create in master database
BACKUP CERTIFICATE [DBMailCertificate]TO FILE = ‘C:\Backup\DBMailCertificate.CER’;
GO

— Sign the procedure with the certificate’s private key
ADD SIGNATURE TO OBJECT::[test_email]
BY CERTIFICATE [DBMailCertificate]
WITH PASSWORD = ‘password’;
GO

— Drop the private key.
ALTER CERTIFICATE [DBMailCertificate]
      REMOVE PRIVATE KEY;
GO

— Add Certificate to Master Database
USE [master]
GO
CREATE CERTIFICATE [DBMailCertificate]FROM FILE = ‘c:\Backup\DBMailCertificate.CER’;
GO

— Create a login from the certificate
CREATE LOGIN [DBMailLogin]FROM CERTIFICATE [DBMailCertificate];
GO

— The Login must have Authenticate Sever to access server scoped system tables
— per
http://msdn.microsoft.com/en-us/library/ms190785.aspx
GRANT AUTHENTICATE SERVER TO [DBMailLogin]
GO

— Create a MSDB User for the Login
USE [msdb]
GO
CREATE USER [DBMailLogin] FROM LOGIN [DBMailLogin]
GO

— Add msdb login/user to the DatabaseMailUserRole
EXEC msdb.dbo.sp_addrolemember @rolename = ‘DatabaseMailUserRole’, @membername = ‘DBMailLogin’;
GO

use TestDBMail 
EXECUTE [test_email]

CREATE LOGIN Ellie WITH PASSWORD = ‘password’;
CREATE USER Ellie;
grant exec on test_email to [Ellie]

exec as user = ‘Ellie’
exec test_email

revert

select * From sys.certificates

— clean object
USE [msdb]
GO
DROP USER [DBMailLogin]
GO
USE [master]
GO
DROP LOGIN [DBMailLogin]
DROP CERTIFICATE [DBMailCertificate]
DROP DATABASE [TestDBMail]

解開已加密的 SQL Server 物件

感謝阿德提供的網址:

http://www.dotblogs.com.tw/ricochen/archive/2011/07/13/31574.aspx

http://optillect.com/products/sqldecryptor/download.html

改 SQL Server sa 密碼

參看巧玫的 blog http://mydiamond.pixnet.net/blog/post/18944114

RS 透過 Delegation 存取 AS

與朋友討論在 Windows AD 上的 RS ,其 Report 的 Data Source 以 Delegation 方式存取 AS,應註冊 SPN 及啟動 Delegation。感謝他詳盡地記錄下來:

http://learnsqlblog.wordpress.com/2011/03/02/%e5%9f%9f%e7%8e%af%e5%a2%83%e4%b8%8b%e7%9a%84ssrs%e6%95%b0%e6%8d%ae%e6%ba%90ssas%e9%9b%86%e6%88%90%e5%ae%89%e5%85%a8%e6%80%a7%e9%85%8d%e7%bd%ae/

不知怎麼換 BULK INSERT 的執行身分

SQL Server 2005 後執行 BULK INSERT 語法,若是以 Windows Login 登入,SQL Server 會模擬該 Windows 帳號存取 File,若是 SQL Server 自建帳號,則會以 SQL Server 服務帳號存取 File。因此,若該 Windows 帳號無法存取 File 會有錯誤:

bulk insert t from ‘c:tempa.txt’

訊息 4861, 層級 16, 狀態 1, 伺服器 WIN2K3R2, 行 1
無法大量載入,因為檔案 "c:tempa.txt" 無法開啟。作業系統錯誤碼 5(存取被拒。)。

不管我用 exec as login、login 配認證(credential)、將 windows login 加入到 bulkadmin 伺服器角色(BOL 建議的)都沒用。

最後,只好用 xp_cmdshell 搭配 bcp…

–xp_cmdshell 將使用以下的Windows帳號當作認證(credential)來執行 console 的 AP

EXEC sp_xp_cmdshell_proxy_account ‘domainadministrator’, ‘password’

create proc spBCP

as

exec sp_configure ‘show adv’,1

reconfigure

exec sp_configure ‘xp_cmdshell’,1

reconfigure

exec xp_cmdshell ‘bcp tempdb.dbo.t in "C:tempa.txt" -T -c’

exec sp_configure ‘xp_cmdshell’,0

reconfigure

exec sp_configure ‘show adv’,0

reconfigure

go

 

不知誰有更好的方法…

安控記錄與分析

感謝承修提供了幾個廠家,可滿足如 沙賓 法案的要求

ArcSight

GFI EVENT MANAGER

iMPERVA(承修特別強調–很貴)

以及我曾經參與的

玄力科技(Chalet Tech)

不從特定 IP 不准某帳號登入 SQL Server

CREATE TRIGGER [connection_limit_trigger]
ON ALL SERVER
WITH EXECUTE AS ‘I7Administrator’
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= ‘a’ AND
not exists  (SELECT * FROM sys.dm_exec_connections
WHERE client_net_address = ‘127.0.0.1’
and session_id=@@SPID)
ROLLBACK;
END;

–ENABLE TRIGGER [connection_limit_trigger] ON ALL SERVER

 

 

若設錯可以用 DAC(dedicated admin connection) 解掉

Escaping from a runaway Logon trigger

SQL 2008 Reporting 匿名存取