要遠端到客戶的開發機,但 VPN 要求固定 IP,所以要從家裡跳到公司 VM,才有客戶允許的固定 IP,結果是:
在家裡用 NB,為避免影響 NB Host 的網路設定 -> 先進 NB 內 VM -> 透過 VM VPN 到公司內 VM -> 客戶跳板機 -> 客戶開發機
中間有一堆不同 VPN 連線設定,登入的 MFA 設定…
星期六早上,2 個多小時,終於繞進了客戶開發機,可以寫第一行 Code 了…騷擾 Aska 好久,非常感謝 🙂
要遠端到客戶的開發機,但 VPN 要求固定 IP,所以要從家裡跳到公司 VM,才有客戶允許的固定 IP,結果是:
在家裡用 NB,為避免影響 NB Host 的網路設定 -> 先進 NB 內 VM -> 透過 VM VPN 到公司內 VM -> 客戶跳板機 -> 客戶開發機
中間有一堆不同 VPN 連線設定,登入的 MFA 設定…
星期六早上,2 個多小時,終於繞進了客戶開發機,可以寫第一行 Code 了…騷擾 Aska 好久,非常感謝 🙂
資訊世界昨是今非,此僅是個人理解,參考看看吧:
#Identity:本體,例如一組帳號/密碼。
#Account:帳戶,在系統(如 Windows)或應用服務(在 SQL Server 稱此為 Login)賦予本體一組資料結構,例如顯示名稱、Email、電話,SQL Server 則會賦予預設語言、context 資料庫…等 。
#Principal:身分,本體加入某些群組(Group)/角色(Role)後,而擁有的身分。例如加入了 Windows Administrators Group 後有了管理員身分。但 Windows Vista 後,透過 UAC(User Account Control)讓擁有管理員身分的本體無法以身分存取資源。需要透過 Run As 換身分(Run as Administrator)。如同 Linux 的 sudo。
#Service principal:服務或應用程式使用的身分。
#Multi-factor authentication:多重要素驗證(採用微軟的翻譯),呈現多種資訊(兩種以上)來證明來者是其所宣稱者。而要素(factor)歸於以下三類:
最近與 Winnie 合作,找尋一個癱瘓網路的攻擊原因,整個伺服器群內滿目瘡痍的木馬。又與 SQL Injection 這個老問題有關,只是這次不僅是偷資料,而是毀掉 IT 機房內的各系統
眾多開發商,各種帳號權限過大,程式碼有 SQL Injection 的問題…
幾個老生常談的基本阻斷面向:
另外,對外包廠商的品管能力非一般 IT 系統管理員能及,這是個隱憂。因為管理員無法回答安裝設定,各種帳號權限、功能需求、追蹤所得資料的意義、程式碼品質…
看來,幾個可以主動阻斷高權限語法傳遞到 DB 伺服器的資安產品真的有賣點,但若這些產品誤判,是否它本身就發揮了病毒的功能…
DBA 參與開發都屬於安全的一環了
附上 Winnie 對這個案子的看法 ^^
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]
與朋友討論在 Windows AD 上的 RS ,其 Report 的 Data Source 以 Delegation 方式存取 AS,應註冊 SPN 及啟動 Delegation。感謝他詳盡地記錄下來:
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
不知誰有更好的方法…