創(chuàng)新USB密鑰 YubiKey實現(xiàn)雙因素驗證
YubiKey是一種新型USB密鑰,它通過雙因素驗證簡化了登錄過程,用戶只要輕觸一下設備,它就會在任意電腦或平臺上生成一個一次性的密碼(OTP),而不需要任何客戶端軟件。
YubiKey工作原理:通過輕觸按鈕,YubiKey會發(fā)送一個隨機的安全登錄密碼。這一***的密碼由YubiKey配套的Web服務或軟件應用驗證,此文中則是BIG-IP 訪問策略管理器。
什么是YubiCloud:YubiCloud是一款免費的基于云技術的YubiKey驗證服務,它將有力的雙要素驗證于網(wǎng)站或在線服務結(jié)合在一起。
使用APM的YubiKey 2-Factor 驗證進程
驗證進程可以分解為幾個簡單步驟,如下:
步驟一:用戶會看到一個登錄頁面。筆者遇到的登錄頁面要求填寫用戶名,密碼和YubiKey OTP。在輸入用戶名和密碼后,你可以把YubiKey插入USB端口,再按下按鈕。YubiKey將會生成一個***的一次性密碼供登錄者輸入進行驗證。
步驟二和三:用戶名和密碼都由Active Directory驗證。
步驟四和五:檢查以確保YubiKey已經(jīng)分配好用戶。筆者將8字節(jié)的YubiKey序列號保存到了Active Directory屬性:“employeeID”。顯然,你可以使用你喜歡的任何屬性域或是數(shù)據(jù)群組。
步驟六:確保生成的一次性密碼與YubiKey序列號匹配。YubiKey 一次性密碼使用修改后的十六進制輸出(MODHEX)。可在Yubico論壇找到MODHEX表(http://forum.yubico.com/viewtopic.php?f=6&t=96 )筆者創(chuàng)建了一個iRule,它使用一個YubiKey序列號,并將其轉(zhuǎn)換為MODHEX,然后再把它保存到一個APM對話變量。下一步,從步驟一到MODHEX序列號比較OTP值,如果字符存在,就可以往下了。
步驟7,8,9——把YubiKey一次性密碼發(fā)送到Y(jié)ubiCloud驗證服務。如果YubiCloud API返回“Status=OK”,然后用戶就可以訪問資源。#p#
BIG-IP APM 配置
APM配置是直觀的,假設:
1. 你已經(jīng)有一個目錄服務器,上面有配置好的用戶,你可以把YubiKey序列號添加給LDAP/AD屬性。
2. 你的YubiKey通過YubiCloud服務注冊。
3. 你已經(jīng)從https://upgrade.yubico.com/getapikey/ 處獲得了一個Auth ID和API 密鑰可以驗證YubiKey。
4. 你此前使用過BIG-IP,且具備適當?shù)腖TM知識。
那么可以用BIG.-IP v11.2.0創(chuàng)建此配置。讓我們進入APM配置。
驗證服務器
活動目錄
訪問策略>>AAA服務器>>>活動目錄>>>“創(chuàng)建”
如下:
1. 名稱:dc1.test.lab
2. 域名:test.lab
3. 域控制器:或 (AD服務器)
4. 管理員名稱及密碼
選擇“完成”以保存。
#p#
YubiCloud API
HTTP AAA服務器對象不支持HTTPS連接,所以我們需要創(chuàng)建一個虛擬服務器代理BIG-IP到Y(jié)ubiCloud API的數(shù)據(jù)流。這個虛擬服務器會聽取HTTP,但是我們可以使用一個創(chuàng)建HTTP的Server SSL 配置文件-——>HTTPS 代理。
本地數(shù)據(jù)>>節(jié)點>>節(jié)點列表>>“創(chuàng)建”
如下:
1. 名稱:api.yubico.com
2. 地址:api.yubico.com
3. 監(jiān)測
選擇“完成”以保存。
本地數(shù)據(jù)>>池>>池列表>>“創(chuàng)建”
如下:
1. 名稱:pool_yubicloud
2. 描述:YubiCloud 代理池 (可選項)
3. 監(jiān)測 (可選項)
4. 地址:api.yubico.com
5. 服務端口:HTTPS
選擇“完成”以保存。
本地數(shù)據(jù)>>虛擬服務器>>虛擬服務器列表>>“創(chuàng)建”
如下:
1. 名稱:vs_yubicloud
2. 描述:YubiCloud 代理 VS (可選項)
3. 目的地:
4. 服務端口:HTTP
5. HTTP配置文件:http
6. SSL 配置文件(服務器):clientssl
7. SNAT池:Auto Map
8. 默認池:pool_yubicloud
選擇“完成”以保存。
訪問策略>>AAA服務器>>HTTP
如下:
1. 名稱:aaa_yubicloud
2. 表單方法:GET
3. 表單活動:http://
4. 用戶名稱的表單參數(shù):id
5. 密碼的表單參數(shù):otp
6. 成功登錄檢測匹配類型:指定響應字符
7. 成功登錄檢測匹配數(shù)值:status=OK
表單活動使用上文配置的虛擬服務器IP,而不是YubiCloud服務器FQDN。你至少要為沒有簽名的響應提供id和otp參數(shù)。Id參數(shù)是用于YubiCloud服務的Auth ID,otp是YubiKey生成的代碼。
選擇“完成”以保存。
#p#
MODHEX 編碼iRule
本地數(shù)據(jù)>>iRules>>iRules 列表>>“創(chuàng)建”
復制粘貼下列iRule,它們可以把YubiKey序列號轉(zhuǎn)換成MODHEX格式。在本文示例中,筆者檢索了與Active Directory用戶相關的YubiKey序列號,該Active Directory使用employeeID 屬性。如果序列號已經(jīng)保存在備用處,如一個數(shù)據(jù)群組或一個自定義LDAP/AD屬性,那么就需要修改此iRule。
when ACCESS_POLICY_AGENT_EVENT { if { [ACCESS::policy agent_id] eq "irule_apm_yubikey_modhex_encode" } {
# yubikey serial number
set yubikey_serial [ACCESS::session data get session.ad.last.attr.employeeID]
# modhex alphabet
array set modhex_alphabet { 0 c 1 b 2 d 3 e 4 f 5 g 6 h 7 i 8 j 9 k A l B n C r D t E u F v }
# remove leading zeros from serial number
set yubikey_serial [string trimleft $yubikey_serial 0]
# convert serial to hex and pad with zeros
set yubikey_serial [format %012X $yubikey_serial]
# split the string
set yubikey_serial [split $yubikey_serial ""]
# for each HEX change to MODHEX using alphabet
set yubikey_modhex ""
foreach index $yubikey_serial {
append yubikey_modhex $modhex_alphabet($index)
}
ACCESS::session data set session.custom.yubikey.modhex $yubikey_modhex
}
}
訪問配置文件和策略
訪問策略>>訪問配置文件>>訪問配置文件列表>>“創(chuàng)建”
提供如下信息:
1. 姓名:profile_yubicloud
2. 語言:English
3. 使用默認設置。
選擇“完成”以保存。
訪問策略>>訪問配置文件>>訪問配置文件列表>>“編輯”
在“start”對象后的“fallback”上,添加“logon page”對象。
添加第三個域:
1. 類型:文本。
2. 貼出變量名稱:yubiotp
3. 會話變量名稱:yubiotp
4. 只讀:否
在“自定義”部分,將“表單標頭文本”設置為你需要的效果,并把“登錄頁面輸入?yún)^(qū)域#3”改成有意義的值,如下。“Branch Rules”設為默認狀態(tài)。別忘了點“保存”。
#p#
在“Logon Page”對象后面的“fallback”分支,添加一個“AD Auth”對象
這一步可以驗證姓名和密碼。
提供如下信息:
1. 姓名:AD Auth
2. AAA服務器:/Common/dc1.test.lab (選擇你的AD 服務器)
“Branch Rules”為默認。結(jié)束后選擇“保存”。
“AD Auth”對象之后的操作成功分支上,添加一個“AD Query”對象
這一步檢查用戶的Active Directory賬號是否有YubiKey。我們已經(jīng)為每位用戶把YubiKey的序列號添加到Active Directory。以前筆者出于方便會使用employeeID,但這里,推薦大家創(chuàng)建一個用于YubiKey序列號的自定義AD屬性。
提供如下屬性:
1. 姓名:YubiKey Provisioned
2. 搜索過濾:sAMAccountName=%{session.logon.last.username}
在“Branch Rules”下,刪除默認,選擇“添加Branch Rule”
更新Branch Rule設置:
姓名:Yes
表達式:expr{[mcgt{session.ad.last.attr.employeeID}]!=””}
選擇“完成”,然后保存。
在“YubiKey Provisioned”對象的“Yes”分支里,添加“iRule Event”對象
這一步可以把“session.ad.last.attr.employeeID”(YubiKey 序列)從AD Query發(fā)送到名為“irule_apm_yubikey_modhex_encode”的iRule。iRule會返回一個用MODHEX編碼的字符,并將其保存在“session.custom.yubikey.modhex”。我們需要MODHEX格式的YubiKey序列號,這樣我們就可以把它與登錄頁面輸入的原始YubiKey OTP進行比對。
提供如下信息:
1. 姓名:YubiKey MODHEX Encode
2. ID:irule_apm_yubikey_modhex_encode
#p#
現(xiàn)在,我們把MODHEX格式的YubiKey序列號與登錄頁面輸入的YubiKey OTP進行比較。這一步可以驗證用戶是否正在使用他們的YubiKey抑或是被盜用。這個YubiKey OTP的前面12個字符是YubiKey序列號,這樣就可以用“字符優(yōu)先”的TCK命令進行驗證。
在“Branch Rules”下選擇“Add Branch Rule”
更新Branch Rule的設置:
1. 名稱:YubiKey Serial Match
2. 表達式“expr { [string first [mcget {session.custom.yubikey.modhex}] [mcget {session.logon.last.yubiotp}]] == 0 }
選擇“完成”,然后保存。
在YubiKey MODHEX Encode對象后面的YubiKey Serial Match上,添加一個Variable Assign對象。
這一步會把YubiCloud Auth ID 分配到“session.logon.last.username”,并把登錄頁面上的YubiKey OTP分配給“session.logon.last.password”。這些會話變量隨后被分配到之前創(chuàng)建的HTTP Auth AAA對象aaa_yubicloud所使用的id和otp HTTP參數(shù)。
提供下列屬性:
名稱:Assign YubiCloud Variables
選擇“Add new entry”>>”change” 添加變量分配。
變量賦值1:
1. 自定義變量:session.logon.last.username
2. 自定義表達式:expr{“1111”} (把1111改為你的YubiCloud Auth ID)
變量賦值2:
1. 自定義變量:session.logon.last.password
2. 自定義表達式:expr { [mcget {session.logon.last.yubiotp}] }
選擇“完成”,然后保存。Branch Rules使用默認設置。
在“Assisign YubiCloud Variables”對象的“fallback”分支上,添加一個“HTTP Auth”對象
這樣可以把HTTP Get發(fā)送到Y(jié)ubiCloud API 以驗證登錄頁面的YubiKey OTP。
提供下列屬性:
1. 名稱:YubiCloud Auth
2. AAA Server:/Common/aaa_yubicloud
Branch Rules使用默認設置。保存退出。
這樣就媲美訪問策略了。它應該和下圖類似:
接下來把“訪問配置文件”附加到虛擬服務器做測試。
結(jié)論
這是通過APM輕松添加雙因素驗證的典型案例。F5提供了一個10人同時使用的APM試驗版本,且每個BIG-IP都頒發(fā)了LTM許可證。