2023年11月8日 星期三

SQL Server 啟動帳號最佳實踐與最小化權限設定

        此篇文章主要是最近經過二位大師的指導,修正一些以前的概念,自已嘗試作過一次後,發現其中其實有許多的坑,沒有作過一次,真的很難說有 100% 的懂 (我自已),而且作完後有更深的體驗,所以整理成此篇,相信這也是企業內日後主推的部份,也希望大家可以參考並套用在企業中。        

預設的情況下,SQL Server 的啟動帳號為 NT Service\MSSQLSERVER,而在網域的架構上,許多人會設定為網域帳號,如常見的 Domain User + Local Admin,但這樣的設定在安全性與稽核上,存在著許多的問題。

在許多的公司,常見的情況,通常會規定不能使用 Local Admin,而且規定每一個帳號 60 or 90 天後要重新設定密碼,所以以前常遇到客戶提出SQL重啟後,無法正常啟動,常見遇到的就是密碼過期等情況,所以造成無法啟動。

另外如果 SQL Server 的啟動帳號權限設定的太大,一但遇到如 SQL Injection 等的攻擊時,容易會造成更大的問題,因為會被當作跳板,再進行其他主機的攻擊,所以最小化的權限設定,將可以有效的防止等問題的發生。

最後許多的系統管理員要維護自已的帳號與密碼於 Excel or 筆記本中,而且在固定的時間就要進行更新,這種明碼存在的方式,也是另一個安全性的隱憂。

講了這麼多,我們就講主題,在啟動帳號的部份,微軟 (Microsoft) 強烈的推薦透過 受控服務帳戶 (Managed Service Accounts) 與 群組受控服務帳戶 (Group Managed Service Accounts) 來進行,如同我上述的介紹,這二個帳號類型就符合我提到的部份,在使用這二個帳號類型前,我們也來說看一下最低限制。

Group Managed Service Account Prerequisites:

  • Domain Functional Level of 2012 or higher
  • SQL Server 2014 or higher
  • Window Server 2012 R2 Operating System

另外受控服務帳戶 (Managed Service Accounts) 與 群組受控服務帳戶 (Group Managed Service Accounts) 在設定上,也不需要手動輸入密碼,不需要再透過 Excel 等筆記本來記錄帳號密碼等,而密碼的部份也是每30天自動更新,二個帳號一個應用於單機的環境,而另一個則是應用於 HA 等的架構,如 WSFC、AlwaysOn 等群組節點的情境,所以本篇將透過  群組受控服務帳戶 (Group Managed Service Accounts) 與 AlwaysOn 的環境來進行設定。

1. 登入主要網域進行下列的設定

2. 首先檢查 KDS (Key Distribution Service) 是否有 Root Key 的存在。 

Test-KdsRootKey -KeyId (Get-KdsRootKey).KeyId

如果存在的話,會傳回 "True",如果沒有的話,就需要進行下列設定。

Add-KdsRootKey –EffectiveTime ((get-date).addhours(-10))
or
Add-KdsRootKey -EffectiveImmediately

3. 也可以透過下列的指令查詢目前所有的 KDS KEY

Get-KdsRootKey

4. 建立一個群組,並將二個 SQL 節點加入群組中。

New-ADGroup -Name gmsa-sql-alwayson -Description "Security group for gMSAsql computers" -GroupCategory Security -GroupScope Global

4-1 將 SQL 節點加入群組中。

Add-ADGroupMember -Identity gmsa-sql-alwayson -Members SQL2019-AG1$,SQL2019-AG2$

PS: 上述的 SQL2019-AG1$ 是第一台節點,SQL2019-AG2$ 為第二個節點。

4-2 透過下列的語法查詢目前此群組中的成員有那些。

Get-ADGroupMember -Identity gmsa-sql-alwayson

4-3 也可以透過 Active Directory Users and Computers 介面的方式進行檢示。

5. 建立 群組受控服務帳戶 (Group Managed Service Accounts)

New-ADServiceAccount -name gMSAsql -DNSHostName gMSAsql.mscaryhsu.com -PrincipalsAllowedToRetrieveManagedPassword gmsa-sql-alwayson

Get-ADServiceAccount gMSAsql -Property PasswordLastSet

PS: 上述你也可以查詢到此帳號密碼最後更新的時間

6. 設定此 群組受控服務帳戶 (Group Managed Service Accounts可以擁有註冊 SPN 的權限,這個非常的重要,後面我們也會確認是否在更換帳號後可以正確的註冊 SPN.  

dsacls (Get-ADServiceAccount -Identity gMSAsql).DistinguishedName /G "SELF:RPWP;servicePrincipalName"

7. 一切設定完成後,必須到各自的節點進行套用,我們先登入到第一台節點,再登入到第二個節點進行即可。

8.  啟用 Windows 的功能

8-1 檢查功能是否已啟用

PS C:\> Get-WindowsFeature AD-Domain-Services

Display Name                           Name                Install State
------------                           ----                -------------
[ ] Active Directory Domain Services   AD-Domain-Services  Available


8-2 啟用此功能

PS C:\Users\Administrator> Add-WindowsFeature AD-Domain-Services

Display Name                                            Name                       Install State
------------                                            ----                       -------------
[X] Active Directory Domain Services                    AD-Domain-Services             Installed


9.  啟用 群組受控服務帳戶 (Group Managed Service Accounts)

Install-ADServiceAccount -Identity gMSAsql
Test-ADServiceAccount -Identity gMSAsql

10. 請至另一個節點也是完成 8與9 的步驟

11. 完成上述的步驟後,就已完成 群組受控服務帳戶 (Group Managed Service Accounts) 的設定,完成設定後,請至 SQL Server Configuration Manager 更換 SQL Server 的啟動帳號,請注意千萬不要透過系統中的服務列表進行更換,否則會有問題。


12. 更換完成後,目前已是最小權限,但仍建議進行作業系統上的系統原則,有二個是一定要設定的,要不然也是會因為權限不夠,而造成問題,一個是 啟用鎖定記憶體分頁選項 (Lock pages in memory) 與 執行磁碟區維護工作(Perform volume maintenance tasks),這二個設定也是在二個節點都需要進行。



執行磁碟區維護工作(Perform volume maintenance tasks)
執行磁碟區維護工作 - Windows Security | Microsoft Learn


13. 確認上述的二個設定是否有啟用成功

13-1 透過 SQL Server Error Log

2023-11-08 15:10:34.63 Server      Using locked pages in the memory manager.

13-2 透過 DMV 查詢是否有啟用成功

SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;

沒有啟用



啟用 Lock pages in memory



14. 另外在 SQL 各個服務的部份,下列的文章也有詳細的介紹所需的權限,這樣即可達到最小化權限的部份,目前我並沒有透過下列的文章進行,確認是沒有問題的,但仍建議在相關的目錄上,尤其是 SQL Server 的主要引擎的部份仍是需要進行設定。

Configure Windows service accounts and permissions
https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/configure-windows-service-accounts-and-permissions?view=sql-server-ver16#GMSA

15. 最後我們也確認在 AlwaysOn 的部份也是一切正常,


16. 在權限的部份,網域帳號的群組,不是歸屬在 Domain Admin 中,而且也不歸屬在任何的群組中,而在 SQL Server 中,只有自動加入的電腦帳號,其中也只有 Connect 的權限而已,所以這部份絕對是最小化的權限。

沒有留言:

張貼留言