作者:陳柏鍠 / 計算機及資訊網路中心作業管理組幹事
單一認證簽入(Single Sign On)的架構導入後,認證服務的穩定度就變的相當重要,ADFS服務為其中的一個關鍵服務,如何建置一個有彈性又有高可用度的ADFS就變的很重要,本文 將介紹如何建置一個高可用度的ADFS Farm Service。
ADFS是AD的Federation Service,主要就是讓外部的服務可以透過Federation Service主機來利用AD進行驗證,進而達到Single Sign On的目標,為Windows Server裡面的一個角色。
這邊簡單的解釋一下ADFS是在做什麼的,以臺大來說,從自行開發的校務系統、電子郵件、無線網路及雲端服務,加上委外的系統等,都需要進行登入者的身分驗證,這個身分驗證機制必須是安全而且通用。
最直接的驗證方式就是每一個系統都建立一個含有使用者帳號及密碼的資料庫以供查詢,但臺大的帳號類型實在太多,光是學生加上教職員工的類型和狀態就不下數十種,還有人員的異動、密碼的管理,這些因素會導致帳號管理的成本會非常高。若考慮整合,則臺大內部可共用一個資料庫,但外部的系統呢?
這時ADFS就派上用場了,ADFS的精神就在於外部的A系統可以跟B系統建立信任關係,當B的使用者要在A系統登入時,會重新導向到B的認證系統進行驗證,若驗證通過,就可以使用A的應用系統,整個過程就在於A的應用系統信任B驗證他自己的使用者。
ADFS的架構可視情況如以下方式規劃:
本文要談的是如何建立一個具有容錯的ADFS Farm架構,也就是上圖的藍色部分,具體的環境準備如下:
- ADFS主機:Windows Server 2012 Standard兩部以上,建議用VM(做錯用快照回復比較方便),請先加入網域。
- 請在其中一台安裝SQL Server Management Studio,因為需要用到sqlcmd這個小工具。
- 資料庫主機:Windows SQL Server 2012,以Cluster方式建置。
具體要做的事情為以下三項:
(1) 新增ADFS角色
(2) 將Configuration檔案由Internal Database搬至SQL Server
(3) 將其餘ADFS主機加入同盟伺服器
這邊需解釋為什麼要把Configuration資料搬到SQL Server,因為預設的ADFS Configuration資料是放在WID的,就是Windows Internal Database,為一個內建的小資料庫,但放在WID會有一些限制,官方的解釋如下:
- No more than five federation servers should be added to a federation server farm deployment. If you need more federation servers to support higher performance in farm deployment, use SQL Server instead.
- No more than 100 trust relationships of the same type (either claims provider trusts or relying party trusts) can be supported. For example, you can have up to 100 claims provider trusts and 100 relying party trusts with a Windows Internal Database deployment, but to exceed this number for either category of trusts, use SQL Server instead.
(參考出處:http://technet.microsoft.com/en-us/library/gg557750(v=ws.10).aspx)
第一點還好,就是不能放超過五台同盟伺服器,除非是非常大的規模需要超過五台,不然應該夠用,但是第二點就比較麻煩,不能超過一百筆的信任關係,一個網址進來進行認證,就算一個,現在其實不管哪個單位,應用系統都非常多個,一百筆信任關係肯定是不夠用的,為了未來的擴充性,只好捨棄用WID了。
接下來就是實做了,詳細的步驟記載如下:
Step.0 先在ADFS主機上安裝ADFS角色
-----------------------------------------------------------------------------------------------------------------------------------
以預設的方式來安裝則很快就可以安裝完畢,裝好的當下就會提示你可以把ADFS第二台、第三台加進去讓他變成一個同盟,可以同時提供高可用性的服務,我們進行示範的環境是Server 2012,它比2008 R2簡單很多,因為2008R2預設是ADFS 1.0,必須另外獨立裝ADFS2.0,Server 2012就好多了,直接內建2.0。
Step.1 將ADFS的服務停止,並將資料庫檔案卸載並搬出
-----------------------------------------------------------------------------------------------------------------------------------
開啟工程師的好朋友 Command Prompt,記得要按右鍵"以系統管理員身分執行",然後輸入:
net stop adfssrv
把ADFS的服務停掉,沒有用系統管理員身分就會存取被拒,其實直接去服務關掉也是可以,但工程師用打指令的方式可以更加表現出專業度。
接下來要把WID上面的資料庫先卸載,打開PowerShell,輸入以下指令:
sqlcmd -S \\.\pipe\MICROSOFT##WID\tsql\query
use master
go
sp_detach_db 'adfsconfiguration'
go
sp_detach_db 'adfsartifactstore'
go
微軟在Server 2012把WID的目錄改了,如果各位有去Google就會發現,以下是差別 處:
Server 2008R2:
sqlcmd -S \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query
Server 2012:
sqlcmd -S \\.\pipe\MICROSOFT##WID\tsql\query
如果你在2012執行,會發現下指令根本沒反應,因為路徑已經換了,以前是在C:\Windows\SYSMSI\SSEE\MSSQL.2005\MSSQL\Data
現在的路徑已經改到了C:\Windows\WID\Data下面,由此可見,很多指令都要重找,不然一定會常常碰壁。
Step.2 把資料庫檔案移動到 SQL SERVER資料庫主機下
-----------------------------------------------------------------------------------------------------------------------------------
卸載了之後,到C:\Windows\WID\Data下,把兩個資料庫檔案跟兩個LOG檔
adfsconfiguration.mdf
adfsconfiguration_log.ldf
adfsartifactstore.mdf
adfsartifactstore_log.ldf
這四個檔案複製到SQL Server放資料庫檔案的目錄下,但其實要放哪裡都可以,跟其他MDF放在一起也可以。
Step.3 把ADFS的資料庫在SQL Server掛載起來
-----------------------------------------------------------------------------------------------------------------------------------
麻煩打開DBA的好朋友sqlcmd,輸入以下指令:
sqlcmd -S \\.\pipe\MICROSOFT##WID\tsql\query
use master
go
sp_attach_db 'adfsconfiguration', 'F:\MSSQL11.MSSQLSERVER\MSSQL\DATA\adfsconfiguration.mdf', 'F:\MSSQL11.MSSQLSERVER\MSSQL\DATA\adfsconfiguration_log.ldf'
go
sp_attach_db 'adfsartifactstore', 'F:\MSSQL11.MSSQLSERVER\MSSQL\DATA\adfsartifactstore.mdf', 'F:\MSSQL11.MSSQLSERVER\MSSQL\DATA\adfsartifactstore_log.ldf'
go
alter database AdfsConfiguration set enable_broker with rollback immediate
go
*裡面的路徑就是你放 mdf 檔跟 ldf 檔的地方喔
成功的話,就可以在你的SQL Server下面看到configuration跟artifactstore資料庫了。
Step.4 把ADFS的 Configuration資料庫設定切到SQL Server
-----------------------------------------------------------------------------------------------------------------------------------
做了這個步驟ADFS才會去存取SQL Server的資料庫 請用系統管理員身分執行Powershell輸入:
$temp=GEt-WmiObject -namespace root/ADFS -class SecurityTokenService
$temp.ConfigurationdatabaseConnectionstring="data source=yourdatasource;initial catalog=adfsconfiguration;User ID=username;Password=password;"
$temp.put()
*裡面的data source請依照你的資料庫名稱設定
這邊記住一定要「以系統管理員身分執行」,不然最後$temp.put()會回傳了一個無效值0,其實就是權限不足。
Step.5 啟動ADFS服務
-----------------------------------------------------------------------------------------------------------------------------------
以系統管理員身分執行 Command Prompt,輸入
net start adfssrv
可以啟動代表你剛剛切換有成功。
Step.6 把ADFS的artifactstore dbconnection設定切到SQL Server
------------------------------------------------------------------------------
記得我們剛剛移轉了兩個資料庫嗎?現在要把另外一個設定也切過去,請用系統管理員身分執行Powershell 輸入:
Add-pssnapin microsoft.adfs.powershell
Set-adfsproperties –artifactdbconnection “data source=DATASOURCE; initial catalog=adfsartifactstore;integrated security=true”
*裡面的data source請依照你的資料庫名稱設定
Step.7 重新啟動ADFS服務
-----------------------------------------------------------------------------------------------------------------------------------
以系統管理員身分執行 Command Prompt,輸入
net stop adfssrv
net start adfssrv
成功的話代表兩個資料庫都切換到SQL Server了。
Step.8 把ADFS Server加入同盟伺服器
-----------------------------------------------------------------------------------------------------------------------------------
剛剛只做了第一台,現在要把其他幾台也加進去同盟伺服器
請確定以下事情都準備好了:
- 有加入網域
- ADFS角色安裝完畢
- ADFS憑證有import進去且是正常的
- 在IIS中把ADFS用的憑證繫結到 Default Web Site的443 PORT
第三點的意思是,你要在憑證管理裡面看到憑證是沒有問題的才 OK。
第四點沒有做好等一下加入同盟伺服器會有警告出現。
如果把Configuration資料搬到SQL Server的話,就不能用精靈加入同盟,一定要利用指令方式使用ADFS目錄下的FsConfig.exe裡面的JoinSqlFarm指令才可以加入,請用管理員身分打開Command Prompt,到ADFS所在的目錄下C:\Windows\ADFS輸入:
FsConfig.exe JoinSQLFarm /ServiceAccount DomainName\AccountName /ServiceAccountPassword Password /SQLConnectionString "data source=YourDataSource;initial catalog=adfsconfiguration;User ID=username;Password=password;"
*紅色部分是依照你的帳號填入,裡面的data source請依照你的資料庫名稱設定
如果之前沒有在 IIS 把憑證繫結成功 會有以下錯誤畫面:
成功的話就像以下這樣:
接下來就把剩下的 ADFS 主機一一加入,就大功告成。之後就可以設定NLB讓數臺ADFS主機進行Load Balance,這樣就有高可用性了。
如果做的順利的話,其實大概一小時內就可以建置完成,但中間過程其實很容易碰壁,如筆者第一次做大概花了四個小時左右。碰壁的話也沒關係,其實就是多試一下就可以了,增加經驗值也是不錯的,希望大家都有一個很穩定的ADFS服務。