一篇很有意義的MSSQL修改啟動賬戶和口令的帖子

sqysl發表於2009-06-09
帖子太大了,挑些主要的寫一下吧:

SQL code 建立角色,使用者,許可權

/*

--示例說明        示例在資料庫pubs中建立一個擁有表jobs的所有許可權、擁有表titles的SELECT許可權的角色r_test    隨後建立了一個登入l_test,然後在資料庫pubs中為登入l_test建立了使用者賬戶u_test    同時將使用者賬戶u_test新增到角色r_test中,使其透過許可權繼承獲取了與角色r_test一樣的許可權    最後使用DENY語句拒絕了使用者賬戶u_test對錶titles的SELECT許可權。    經過這樣的處理,使用l_test登入SQL Server例項後,它只具有表jobs的所有許可權。

--*/

USE pubs

--建立角色  r_test

EXEC sp_addrole 'r_test'

--授予 r_test 對 jobs 表的所有許可權

GRANT ALL ON jobs TO r_test

--授予角色 r_test 對 titles 表的 SELECT 許可權

GRANT SELECT ON titles TO r_test

--新增登入 l_test,設定密碼為pwd,預設資料庫為pubs

EXEC sp_addlogin 'l_test','pwd','pubs'-

-為登入 l_test 在資料庫 pubs 中新增安全賬戶 u_test

EXEC sp_grantdbaccess 'l_test','u_test'

--新增 u_test 為角色 r_test 的成員

EXEC sp_addrolemember 'r_test','u_test'

--拒絕安全賬戶 u_test 對 titles 表的 SELECT 許可權

DENY SELECT ON titles TO u_test

/*

--完成上述步驟後,用 l_test 登入,可以對jobs表進行所有操作,但無法對titles表查詢,雖然角色 r_test 有titles表的select許可權,但已經在安全賬戶中明確拒絕了對titles的select許可權,所以l_test無titles表的select許可權--*/

- -從資料庫 pubs 中刪除安全賬戶

EXEC sp_revokedbaccess 'u_test'

--刪除登入 l_test

EXEC sp_droplogin 'l_test'--刪除角色 r_test

EXEC sp_droprole 'r_test'

SQL code

--1. 建立示例環境。首先使用下面的程式碼建立一個登入l_test,並且為登入在資料庫pubs中建立關聯的使用者賬戶u_test,並且授予使用者賬戶u_test對錶titles的SELECT許可權,用以實現登入l_test連線到SQL Server例項後,可以訪問表titles。然後建立了一個應用程式角色r_p_test,授予該角色對錶jobs的SELECT許可權,用以實現啟用r_p_test時,允許訪問特定的表jobs。

USE pubs

--建立一個登入 l_test, 密碼 pwd, 預設資料庫 pubs

EXEC  sp_addlogin  'l_test','pwd','pubs' 

--為登入 l_test 在資料庫 pubs 中新增安全賬戶 u_test

EXEC sp_grantdbaccess 'l_test','u_test'

--授予安全賬戶 u_test 對 titles 表的 SELECT 許可權

GRANT SELECT ON titles TO u_test

--建立一個應用程式角色 r_p_test, 密碼 abc

EXEC sp_addapprole 'r_p_test','abc'

--授予角色 r_p_test 對 jobs 表的 SELECT 許可權

GRANT SELECT  ON jobs TO r_p_testGO

--2. 啟用應用程式角色。

/*--啟用說明    示例環境建立完成後,在任何地方(比如查詢分析器、應用程式)    使用登入l_test連線SQL Server例項,均只能訪問表titles,或者是guest使用者        和public角色允許訪問的物件。    如果要在某些特定的應用程式中,允許登入訪問表jobs,那麼,        可以啟用應用程式角色r_p_test,啟用應用程式角色後,登入本身的許可權會消失。    下面在查詢分析器中登入,演示啟用應用程式角色r_p_test前後對資料訪問的區別。--*/

--啟用應用程式角色 r_p_test 前,登入具有表 titles 的訪問權,但無表 jobs 的訪問權

SELECT titles_count=COUNT(*) FROM titles

SELECT jobs_count=COUNT(*) FROM jobs

/*--結果:

titles_count ------------ 

18

所影響的行數為 1 行)

伺服器: 訊息 229,級別 14,狀態 5,行 2拒絕了對物件 'jobs'(資料庫 'pubs',所有者 'dbo')的 SELECT 許可權。

--*/

GO

--用密碼 abc 啟用 r_p_test 應用程式角色,並且在將此密碼傳送到SQL Server之前對其加密

EXEC sp_setapprole 'r_p_test',{Encrypt N'abc'},'ODBC'

GO

--啟用應用程式角色 r_p_test 後,登入失去表 titles 的訪問權,獲取表 jobs 的訪問權

SELECT titles_count=COUNT(*) FROM titles

SELECT jobs_count=COUNT(*) FROM jobs

/*--結果伺服器: 訊息 229,級別 14,狀態 5,行 2拒絕了對物件 'titles'(資料庫 'pubs',所有者 'dbo')的 SELECT 許可權。jobs_count  ----------- 14(所影響的行數為 1 行)--*/

SQL code 

exec sp_dropsrvrolemember N'aa', sysadmingo

exec sp_addsrvrolemember N'aa', securityadmingo

--作好SQL的安全管理--作者:鄒建首先,做好使用者安全:   

--簡單的,只允許sql的使用者訪問sql(防止利用administrator組使用者訪問)  

 1.企業管理器--右鍵SQL例項--屬性--安全性--身份驗證--選擇"sql  server和windows"--確定 

 2.企業管理器--安全性--登陸--右鍵sa--設定密碼--其他使用者也設定密碼   

3.刪除使用者:             BUILTIN\Administrators             \Administrator  

--這個使用者不一定有     這樣可以防止用windows身份登陸SQL   

4.設定進入企業管理器需要輸入密碼  在企業管理器中             

- -右鍵你的伺服器例項(就是那個有綠色圖示的)             

--編輯SQL Server註冊屬性             

--選擇"使用 SQL Server 身份驗證"             

--並勾選"總是提示輸入登入名和密碼"             

--確定   

--經過上面的設定,你的SQL  Server基本上算是安全了.  

------------------------------------------------------------------------   

其次,改預設埠,隱藏伺服器,減少被攻擊的可能性   SQL Server伺服器             

--開始             

--程式             

--Microsoft  SQL  Server             

--伺服器網路實用工具            

- -啟用的協議中"TCP/IP"             

--屬性             

--預設埠,輸入一個自已定義的埠,比如2433             

--勾選隱藏伺服器  

 ----------------------------------------------------------------------------  

--管好sql的使用者,防止訪問他不該訪問的資料庫(總控制,明細還可以控制他對於某個資料庫的具體物件具有的許可權)   

--切換到你新增的使用者要控制的資料庫  use  你的庫名  go   

--新增使用者  exec  sp_addlogin  'test'            

--新增登入  exec  sp_grantdbaccess  N'test'            

--使其成為當前資料庫的合法使用者  exec  sp_addrolemember  N'db_owner',  N'test'            

--授予對自己資料庫的所有許可權   

--這樣建立的使用者就只能訪問自己的資料庫,及資料庫中包含了guest使用者的公共表  go   

--刪除測試使用者  exec  sp_revokedbaccess  N'test'            

--移除對資料庫的訪問許可權  exec  sp_droplogin  N'test'            

--刪除登入  如果在企業管理器中建立的話,就用:企業管理器--安全性--右鍵登入--新建登入常規項--名稱中輸入使用者名稱--身份驗證方式根據你的需要選擇(如果是使用windows身份驗證,則要先在作業系統的使用者中新建使用者)--預設設定中,選擇你新建的使用者要訪問的資料庫名伺服器角色項這個裡面不要選擇任何東西資料庫訪問項勾選你建立的使用者需要訪問的資料庫名資料庫角色中允許,勾選"public","db_ownew"確定,這樣建好的使用者與上面語句建立的使用者一樣

 ---------------------------------------------------------------------------  

最後一步,為具體的使用者設定具體的訪問許可權,這個可以參考下面的最簡示例:  

--新增只允許訪問指定表的使用者:  exec  sp_addlogin  '使用者名稱','密碼','預設資料庫名'   

--新增到資料庫  

exec  sp_grantdbaccess  '使用者名稱' 

--分配整表許可權  

GRANT  SELECT ,  INSERT ,  UPDATE ,  DELETE  ON table1 TO [使用者名稱]

- -分配許可權到具體的列

GRANT  SELECT ,  UPDATE  ON table1(id,AA) TO [使用者名稱]  

-------------------------------------------------------------------  

至於具體的安全設定和理論知道,參考SQL聯機幫助 SQL code 

/*--建立一個只允許特定程式使用的資料庫使用者    建立一個使用者,這個使用者只有用我們特定的應用程式登入    才具有訪問資料庫的許可權,用其他工具登入沒有任何許可權    在下面的示例中,演示瞭如何控制登入l_test    使其登入後只允許訪問pubs資料庫的titles表    而對jobs表的訪問許可權,只允許在某些許可的應用程式中訪問。--鄒建 2004.09(引用請保留此資訊)--*/

--建立測試環境USE pubs

--建立一個登入 l_test, 密碼 pwd, 預設資料庫 pubs

EXEC  sp_addlogin  'l_test','pwd','pubs' 

--為登入 l_test 在資料庫 pubs 中新增安全帳戶 u_test

EXEC sp_grantdbaccess 'l_test','u_test'

--授予安全帳戶 u_test 對 titles 表的 SELECT 許可權

GRANT SELECT ON titles TO u_test

--建立一個應用程式角色 r_p_test, 密碼 abc

EXEC sp_addapprole 'r_p_test','abc'

--授予角色 r_p_test 對 jobs 表的 SELECT 許可權

GRANT SELECT  ON jobs TO r_p_testGO

--建立好上面的測試後,現在來測試如何使用應用程式角色--我們把使用者及密碼告訴使用者,即告訴使用者,使用者是: l_test,密碼是: pwd

--使用者可以用我們這個使用者在任何地方登入,包含查詢分析器

--但是,使用者只能訪問 titles 表,不能訪問其他物件,如果建立使用者時不授予它任何許可權,則它不訪問除guest使用者和public角色允許訪問外的任何物件

--OK,到這裡,我們是把使用者控制住了

--下面我們再來說在程式中的處理,因為使用者在程式中登入後,需要對jobs表有訪問許可權的--我們只需要在使用者登入後,執行一句    

EXEC sp_setapprole 'r_p_test',{Encrypt N'abc'},'ODBC'

--這樣,我們登入的使用者就轉變為 r_p_test 角色的許可權,而它自身的許可權丟失

--只要這個使用者不退出應用程式,他的許可權就會保持--如果使用者退出了當前應用程式,則他的許可權自動收回

--同時,這個使用者即使沒有退出應用程式,他也是隻在我們的應用程式中有許可權,在其他地方登入,也不會有許可權

--因為這個密碼我們是不用給使用者的,所以,使用者沒有這個角色的密碼,也就限制了他只能在程式中使用我們的資料

--啟用應用程式角色 r_p_test 前,登入具有表 titles 的訪問權,但無表 jobs 的訪問權

SELECT titles_count=COUNT(*) FROM titles

SELECT jobs_count=COUNT(*) FROM jobs

/*--結果:

titles_count 

------------ 

18

(所影響的行數為 1 行)

伺服器: 訊息 229,級別 14,狀態 5,行 2拒絕了對物件 'jobs'(資料庫 'pubs',所有者 'dbo')的 SELECT 許可權。--*/

GO

--用密碼 abc 啟用 r_p_test 應用程式角色,並且在將此密碼傳送到SQL Server之前對其加密

EXEC sp_setapprole 'r_p_test',{Encrypt N'abc'},'ODBC'GO

--啟用應用程式角色 r_p_test 後,登入失去表 titles 的訪問權,獲取表 jobs 的訪問權

SELECT titles_count=COUNT(*) FROM titles

SELECT jobs_count=COUNT(*) FROM jobs

/*

--結果伺服器: 訊息 229,級別 14,狀態 5,行 2拒絕了對物件 'titles'(資料庫 'pubs',所有者 'dbo')的 SELECT 許可權。

jobs_count 

 ----------- 14

(所影響的行數為 1 行)--*/

go

--刪除測試

EXEC sp_dropapprole 'r_p_test'

EXEC sp_revokedbaccess 'u_test'

EXEC sp_droplogin 'l_test'

對於第一個問題是否可以用SCM呢?SCM有做新增資料夾目錄和登錄檔讀取許可權麼?只是純粹修改服務啟動賬號?請大蝦指教。


  scm  -Action  {1  |  2  |  3  |  4  |  5  |  6  |  7}  
          -Service  service_name  
          [-Server  server_name]  
          [-Pwd  sa_password]  
          [-StartupOptions  startup_option  [  ...n]  ]  
          [-ExePath  exe_file_path]  
          [-SvcStartType  {1  |  2}]  
          [-SvcAccount  service_account]  
          [-SvcPwd  service_password]  
          [-Dependencies  service_name_dependency  [;...n]  ]  
    
  -Action  {1  |  2  |  3  |  4  |  5  |  6  |  7}  
    
  指定實用工具執行下列何種操作。  
    
  程式碼  對策    
  1  開始    
  2  重新啟動    
  3  正在執行    
  4  刪除服務    
  5  安裝服務    
  6  停止    
  7  修改    
    
    
  scm  實用工具返回訊息框以指出操作是成功還是失敗。使用操作程式碼  3  時,成功表示該服務正在執行,

失敗則表示該服務沒有執行。  
    
  -Service  service_name  
    
  指定被影響的  SQL  Server  2000  服務。  
    
  [-Server  server_name]  
    
  指定其服務將受到影響的伺服器。預設設定是本地計算機。  
    
    
    
  說明    不要在  server_name  中包含例項名稱。僅使用計算機名稱。若要影響命名例項,請用  -

Service  選項指定唯一的  service_name。  
    
    
  [-Pwd  sa_password]  
    
  是伺服器的  sa  登入密碼。預設是空白密碼。  
    
  [-StartupOptions  startup_option  [  ...n]  ]  
    
  指定當服務啟動時使用的用空格分隔的伺服器啟動選項列表。在安裝或修改該服務時可應用該選項。  
    
  [-ExePath  exe_file_path]  
    
  指定可在本地計算機上執行的服務的檔案路徑。在安裝或修改該服務時可應用該選項。  
    
  [-SvcStartType  {1  |  2}]  
    
  指定服務是否自動啟動。如果指定  1,則必須手動啟動該服務。如果指定  2,則當計算機啟動時自動啟動該

服務。在安裝或修改該服務時可應用該選項。  
    
  [-SvcAccount  service_account]  
    
  指定分配給服務的網路登入帳戶。在安裝或修改該服務時可應用該選項。  
    
  [-SvcPwd  service_password]  
    
  指定網路登入帳戶密碼。在安裝或修改該服務時可應用該選項。  
    
  [-Dependencies  service_name_dependency  [;...n]  ]  
    
  指定該服務與其它服務的相關性。只有當父服務執行時,相關服務才能執行。在安裝或修改該服務時可應用該選

項。  


scm  -Action  7  -Service  SQLSERVERAGENT  -ExePath  c:\MICROS~2\MSSQL\binn\sqlagent.exe  -

SvcStartType  1  -SvcAccount  ECH\HUGHIE-SvcPwd  1111  
1.  透過本地使用者管理,建立一個本地使用者sqlserver,密碼:123456;
2.  如果現在就我們開啟SERVICES配置透過該使用者啟動,系統會報錯誤:
Source:Service Control Manager
Event ID:7000
Description:
The %service% service failed to start due to the following error:
The service did not start due to a logon failure.
No Data will be available.
這是因為作為一個普通使用者是無法啟動服務的,我們需要給sqlserver使用者分配必要的許可權。
SQL Server服務啟動賬號必須有3個基本許可權:
l        資料庫本地目錄的讀寫許可權;
l        啟動本地服務的許可權;
l        讀取登錄檔的許可權;
  
3.  賦予sqlserver使用者mssql(WINDOWS平臺上強大的資料庫平臺)目錄的讀寫許可權;
因為我的SQL SERVER是安裝在D盤,所以我在許可權管理中,將D:\PROGRMAM FILE\Microsoft SQL Server\mssql(WINDOWS平臺上強大的資料庫平臺)讀寫許可權賦予sqlserver使用者。
4.  分配sqlserver使用者啟動本地服務的許可權;
這個比較複雜,我只舉例作為成員伺服器的情況。
l        啟動“Local Security Setting” MMC 管理單元。  
l        展開Local Policy,然後單擊User Rights Assignment。  
l        在右側窗格中,右鍵單擊Log on as Service,將使用者新增到該策略,然後單擊OK。  
l        在右側窗格中,右鍵單擊Log on as a batch job,將使用者新增到該策略,然後單擊OK
l        在右側窗格中,右鍵單擊Locks pages in memory,將使用者新增到該策略,然後單擊OK
l        在右側窗格中,右鍵單擊Act as part of the operating systme,將使用者新增到該策略,然後單擊OK
l        在右側窗格中,右鍵單擊Bypass traverse checking,將使用者新增到該策略,然後單擊OK
l        在右側窗格中,右鍵單擊Replace a process level token,將使用者新增到該策略,然後單擊OK
l        關閉“Local Security Setting” MMC 管理單元。  
如圖:
5.  重新啟動系統,用sqlserver使用者登陸系統;
6.  再重新啟動系統,已administrator使用者登陸,開啟SERVICES管理工具,配置用該使用者啟動mssql(WINDOWS平臺上強大的資料庫平臺)SERVER服務;
    
  
這樣我們就可以透過限制SQLSERVER使用者的許可權來控制SQLSERVER擴充套件儲存過程的許可權。
/* =============================================
-- Author:      UltraDBA
-- Date:        2009-05-30
-- Description: How to change SQL Server 2000 startup account(NO Administrators)
--              Step 1:Install the WMI.
--              Step 2:Programming with the WMI.
--              Step 3:Execute VBS.
-- =============================================
*/

--Step 1:Install the WMI.
BatchFile code @echo oncd\msiexec /i "D:\sql server2000\X86\OTHER\WMI\SQLWMI80.MSI" /quiet /passive /qn /norestartpause@echo off


--Step 2:Programming with the WMI,Saved to D:\ChangeMSSQLSERVERAccount.vbs.
VBScript. code strComputer = "." Set bjWMIService = GetObject("winmgmts:\\" & strComputer & "\root\MicrosoftSQLServer")    ' Obtain an instance of the the class ' using a key property value. Set bjShare = objWMIService.Get("Win32_Service.Name='MSSQLServer'") ' Obtain an InParameters object specific ' to the method. Set bjInParam = objShare.Methods_("Change").inParameters.SpawnInstance_() ' Add the input parameters. objInParam.Properties_.Item("StartName") = ".\SqlUser" objInParam.Properties_.Item("StartPassword") = "123456" ' Execute the method and obtain the return status. ' The OutParameters object in objOutParams ' is created by the provider. Set bjOutParams = objWMIService.ExecMethod("Win32_Service.Name='MSSQLServer'", "Change", objInParam) ' List OutParams If objOutParams.ReturnValue = 0 Then    Wscript.Echo "The service account of MSSQLServer was changed."Else    Wscript.Echo "ReturnValue: " & objOutParams.ReturnValueEnd If


--Step 3:Execute VBS D:\ChangeMSSQLSERVERAccount.vbs.
SQL code @echo oncd\D:\ChangeMSSQLSERVERAccount.vbs@echo off

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-605582/,如需轉載,請註明出處,否則將追究法律責任。

相關文章