程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server數據庫帳號密碼安全設計

SQL Server數據庫帳號密碼安全設計

編輯:關於SqlServer

一、背景

作為一個DBA,或許你有很多的系統需要管理,而且不同的系統使用了不同的數據庫,通常的情況下,我們都是通過sa進行設置密碼的,而且在config文件裡面明文的寫上我們的帳號和密碼,這樣的設計我們是否太大方了呢?

或許你會說,我們的數據庫是安全的,因為我們的數據庫是只有內網可以訪問的,但是那台機器的安全性呢?因為能進入操作系統就能看到我們的帳號密碼了。再加上有些時候我們不希望客戶能看到數據庫密碼的。那麼應該如何保證我們的數據庫賬號密碼的安全性呢?

二、架構設計

針對上面的安全性問題,我設計了下面的方案,主要是運用加密算法進行加密,再通過分離一些職責,設置幾道關卡,加強數據的安全性。

下面是這個方案的總體架構圖:


(架構圖)

三、架構解析說明

1. 程序1,程序2表示我們的應用程序,在程序的config中再也沒有明文的數據庫帳號和密碼的了,它調用一個公用的webservice,只需要傳入一個唯一的key值(有DBA發布這個key值),獲取數據庫IP、帳號、密碼;

2. 網頁接口調用程序是我們提供的一個webservice,它使用只讀帳號視圖,查詢key值所對應加密後的數據庫IP、帳號、密碼;如下圖所示:

[LinkName] 表示key值;

[En_LinkIP]表示程序需要鏈接的數據庫IP地址;

[En_LinkSa]表示數據庫使用的帳號;

[En_LinkPassWord]表示數據庫帳號所對應的密碼;


(只讀賬號視圖)

3. 把上圖獲取到的數據返回給網頁接口調用程序,把這些值以|符號進行串聯成一個字符串,再進行二次加密(使用不同的加密算法);再把加密後的字符串返回給程序1、程序2;

4. 當程序拿到這些加密後的字符串後,使用我們發布的DLL進行解密,這裡的解密包括兩個解密算法,把解密後的值返回給程序;

5. 那這些記錄是怎麼錄入的呢?你猜對了,那就是DBA,DBA收集這些帳號和密碼進行管理,只要開發人員告知數據庫的相關信息(或許根本就不需要,因為部署是DBA的事情,或許開發人員根本就不需要知道這個數據庫在哪裡),我就使用單機機密程序,加密我們的數據庫IP、帳號、密碼,並生成唯一的key值,把這個key告訴開發人員。

把加密後的數據插入到數據庫;超級管理員視圖如下圖所示:


(超級管理員視圖)

四、特別說明

1. 就安全性考慮,LinkIP的值盡量能使用端口進行設置,修改默認的1433端口;

2. 雖然在程序中可以獲取到明文的帳號密碼,但是這比明文寫在config上要安全很多倍了;

3. 對字符串進行二次加密是為了防止數據的攔截的;

4. 如果網頁接口調用程序給爆掉了,拿到的數據還是加密後的數據;而且這個帳號是只讀數據的,是沒有insert、update、delete的權限的;

5. 有這個超級管理員帳號,這個帳號可以只有為數幾個人知道,與網頁接口調用程序的數據庫帳號是完全分離的;

6. 程序中可能需要在使用帳號密碼的時候需要捕獲一下異常,就是當我們DBA修改了帳號密碼後引起的鏈接異常;

7. 這個帳號表中,我們可以通過State字段進行控制這個帳號是否可用(甚至你可以直接刪掉這條記錄),這樣當我們的業務系統洩漏了數據帳號的時候,我們可以很快速的修改帳號密碼,不需要通知開發人員去修改config文件;

8. 只讀賬號視圖現在只是簡單的MD5加密,你完全可以設計自己算法;

9. LinkName是需要唯一的,所以在表設計的時候是使用了這個作為主鍵的;

10. 其實上面的設計我是為了體現出只讀帳號視圖和超級管理員視圖的區別的;可以參考:SQL Server 2005控制用戶權限訪問表,其實你完全可以讓網頁接口調用程序調用數據庫的config的帳號密碼也進行一次加密,讓程序去解密,這樣只需要做一次就夠了。

五、SQL代碼

--創建表

CREATE TABLE [dbo].[LinkConfigTest](

[Id] [int] IDENTITY(1,1) NOT NULL,

[LinkName] [nvarchar](50) NOT NULL,

[LinkIP] [varchar](50) NULL,

[LinkSa] [varchar](50) NULL,

[LinkPassWord] [varchar](50) NULL,

[Description] [nvarchar](100) NULL,

[State] [int] NULL CONSTRAINT [DF_LinkConfigT_State] DEFAULT ((0)),

[StateDescription] [nvarchar](50) NULL,

[HostName] [nvarchar](50) NULL,

[CreateTime] [datetime] NULL,

[En_LinkIP] [varchar](50) NULL,

[En_LinkSa] [varchar](50) NULL,

[En_LinkPassWord] [varchar](50) NULL,

CONSTRAINT [PK_LinkConfigT] PRIMARY KEY NONCLUSTERED

(

[LinkName] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

--插入測試數據

INSERT [LinkConfigTest] ([LinkName],[LinkIP],[LinkSa],[LinkPassWord],[Description],[State],[HostName],[CreateTime],[En_LinkIP],[En_LinkSa],[En_LinkPassWord]) VALUES ( 'sd9_DB1','192.168.1.147,14339','sd158admin','sd158admin+-987','內網_DB1',1,'SERVR9','2012-3-7 14:08:52','0xddf4a1c5a5dadc7374a9ca3ed3aa9f6b','0xe319cb7bedd3b0d400c3da3484c6a6e3','0xdc24223e94b4c4d754cfc40230680156')

INSERT [LinkConfigTest] ([LinkName],[LinkIP],[LinkSa],[LinkPassWord],[Description],[State],[HostName],[CreateTime],[En_LinkIP],[En_LinkSa],[En_LinkPassWord]) VALUES ( 'sc13','192.168.1.25,13433','sc13admin','sc13adminasdfg','內網_DB1',1,'BAREOT-4','2012-3-7 14:08:52','0x0f3e6234263b544bbb7861fc3be9d4a9','0xe969c53b6c44990ac38a92f1c6ad2d97','0xac7663644f8de76a3da122257a6593ea')

INSERT [LinkConfigTest] ([LinkName],[LinkIP],[LinkSa],[LinkPassWord],[Description],[State],[StateDescription],[HostName],[CreateTime],[En_LinkIP],[En_LinkSa],[En_LinkPassWord]) VALUES ( 'sd9_DB2','192.168.1.147,14339','gd14admin','sc13admin#$','內網_DB2',0,'停用','SERVR9','2012-3-7 14:08:52','0xddf4a1c5a5dadc7374a9ca3ed3aa9f6b','0x8cfaec93141b6fb3fc5de4cef40c8648','0x99f2fb6b0f14d47fa725a79c62ae60c3')

INSERT [LinkConfigTest] ([LinkName],[LinkIP],[LinkSa],[LinkPassWord],[Description],[State],[HostName],[CreateTime],[En_LinkIP],[En_LinkSa],[En_LinkPassWord]) VALUES ( 'jh16','192.168.1.30,16433','jh16admin','sc13admin$%as','內網_DB1',1,'SERVR16','2012-3-7 14:08:52','0x012f0e163b9f1d9624e56154e0159452','0x13c540aff4fe6d61f48de0e097fd1c66','0xb59032aaffddc07b72d9958359a5da97')

INSERT [LinkConfigTest] ([LinkName],[LinkIP],[LinkSa],[LinkPassWord],[Description],[State],[HostName],[CreateTime],[En_LinkIP],[En_LinkSa],[En_LinkPassWord]) VALUES ( 'hb17','192.168.1.35,17433','hb17admin','sc13admin$%asdf','內網_DB5',1,'BAEF-1','2012-3-7 14:08:52','0x8723f377c50a33f3cb6794978be09895','0x4bce38f66dfba3f8779f070636a6a70d'

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved