此篇文章主要是最近經過二位大師的指導,修正一些以前的概念,自已嘗試作過一次後,發現其中其實有許多的坑,沒有作過一次,真的很難說有 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
啟用鎖定記憶體分頁選項 (Windows) - SQL Server | Microsoft Learn
SELECT sql_memory_model, sql_memory_model_desc
FROM sys.dm_os_sys_info;
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 的權限而已,所以這部份絕對是最小化的權限。
沒有留言:
張貼留言