MFA
freeradius
gauth
協助同事處理 MFA 驗證問題,之前也沒玩過,順便紀錄一下過程。這種架構應該是蠻適合用 Docker 建立的,有機會再說囉!
使用 hostnamectl
可不用重啟系統調整主機名稱,但記得要重新登入。
hostnamectl set-hostname authServer
hostnamectl
Ubuntu 預設使用 systemd-timesycd 作為 NTP 校時服務。
使用 timedatectl
確認系統時間相關資訊。
timedatectl [status]
以上資訊可以得知:
System clock synchronized: yes
該系統啟用系統網路校時服務。timedatectl set-ntp true
timedatectl set-ntp false
systemd-timesyncd.service active: yes
該系統目前使用 systemd-timesyncd
服務進行網路校時作業。/etc/systemd/timesyncd.conf
。systemctl restart systemd-timesyncd
重啟服務。同樣使用 timedatectl
列出可用時區及調整時區。
timedatectl list-timezones
指定 Asia/Taipei
作為系統時區。
timedatectl set-timezone Asia/Taipei
再次使用 timedatectl
確認系統時間相關設定。
timedatectl [status]
注意
RTC 時間 請使用 UTC 時間,而不要儲存本地時間(Local Time)。
一般 Linux 作業系統關於 DNS 解析都可以檢視 /etc/resolv.conf
並修改其中 nameserver
參數。
不過,目前似乎各發行版本都改由 systemd-resolved
服務處理。該組態檔可以檢視
/run/systemd/resolve/resolv.conf
: 基本上可以直接修改此組態檔,再重啟服務。
/run/systemd/resolve/stub-resolv.conf
當然也可以使用不同 Linux 發行平台所提供的工具。
組態檔: /etc/netplan/<network_config>.yaml
。編輯網路組態後,使用 netplan apply
套用設定。
使用 systemd-resolve --status | grep -A2 'DNS Servers'
查詢設定。
使用 nmcli connection modify <device> ipv4.dns "8.8.8.8 8.8.4.4"
使用 resolvectl status | grep 'DNS Servers'
查詢設定。
使用 dig
確認名稱解析。
參考
以上系統更新及套件安裝動作,可以使用腳本檔一鍵執行完成,可以免去重複打字或輸入錯誤的問題或使用 Ansible 自動佈署達成。
注意
freeradius -v
可檢視安裝版本。
/etc/freeradius/3.0/
。為了不刪除既有使用者,建立一個暫時禁用權限的群組 radius-disabled
。
/etc/freeradius/3.0/radiusd.conf
警告 在編輯任一個服務組態檔時,務必先備份原始檔案後變動。
將會變動以下列出組態檔內容:
編輯組態檔 /etc/freeradius/3.0/radiusd.conf
,進行以下變更。
註解以下內容
增加以下內容
/etc/freeradius/3.0/users
請在 # Deny access for a group of users. 這個區塊加入以下內容。
請務必按照以下內容的格式對齊,否則將會出現無法正確啟用 FreeRADIUS 應用服務。
/etc/freeradius/3.0/sites-enabled/default
請在 Pluggable Authentication Modules. 這個區塊加入註解掉 pam
內容。
/etc/pam.d/radiusd
配置 PAM 以便透過組合本機用戶密碼和 Google Authenticator 產生 PIN 作為驗證方式。
以下註解
增加以下設定
完成以上設定,請將系統重開,並確認服務運作正常。
用戶端就是設定可以向 FreeRADIUS 要求進行用戶身份驗證的主機。若以防火牆整合驗證需求來看,防火牆 就可視為一個用戶端,而設定的 IP 位址就是要與 FreeRADIUS 溝通並進行驗證行為的。
/etc/freeradius/3.0/clients.conf
以下是用戶端設定範例。
我們也可以參考設定檔中 localhost
和 localhost_ipv6
的設定。
根據以下流程建立使用者並進行 Goolge Authenticator 生成。
可以使用以下簡單的腳本檔建立測試使用者帳號及密碼。
使用 sudo userdel -r {user_name}
命令可以刪除使用者相關資訊。
使用新建立的使用者帳號及密碼登入系統進行測試。
在該使用者家目錄下直接執行 google-authenticator
程式。
在終端機中產生的 QR-Code 尺寸過大,所以加入
-Q UTF8
可縮小一些,要不然就要手動調整終端機配置了!
由於我們使用的是 Time-based One-Time Password(TOTP),所以第一個選項請回答 y
。
接著系統便會產生相關資訊:
稍微研究一下顯示 QR Code URL。程式產生的 URL 如下:
其中帶了一些 urlencode 碼 [參考],可以透過 urlencode -d
轉換成可識別字符。
所以 QR Code 顯示 URL 的結構可以解析成 (1) + (2)。其中 (1) 部份為固定, (2) 部份其中 {variable} 則為變數。
(1) https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&
(2) chl=otpauth://totp/{USERNAME}@{HOSTNAME}?secret={SECRET_KEY}&issuer={HOSTNAME}
所以此 QR Code 顯示的 URL,可以取得相關 {變數} 後自行產生建立。
有關 Key URI 詳細資訊可以參考 [連結]。
參考以下步驟繼續完成 Goolge Authenticator Token 建立程序。
完成上述設定程序,會將相關資訊儲存在該使用者家目錄中的 .google-authenticator
檔案。
其實可以研究一下 google-authenticator
程式執行的參數,讓這樣的設定程序可以自動化一點。
根據上述的問答流程,大致可以知道需要的配置如下:
可簡寫為以下命令:
透過上述命令可以查看執行結果,省去產生 QR Code 及問答流程,可直接產生組態檔。
至於 QR Code URL 透過以下簡單的腳本程式就可以取得!
getCodeUrl.sh
將上述產生的 QR Code URL 貼於瀏覽器確認狀態。
若要取得該使用者的驗證備用碼也很容易!
透過簡單的 mailx | mutt 程式,可以模擬將驗證碼資訊寄發給使用者的應用情境。信件內文的訊息就是透過以上動作整合完成的。
這樣一來,串連以上相關的步驟,應該就可以自動化產生驗證碼並寄發使用者相關資訊了!
若要透過 Linux 主機的郵件服務寄送至外部郵件伺服器,則須注意是否有被 Anti-SPAM 功能阻擋囉。
公司採用的是 Office365,可以透過 反垃圾郵件 IP 取消清單網站 [連結] 將 IP 位址列入驗證要求清單。完成設定,可能需要等待一段時間再進行測試吧。
重新寄送驗證碼資訊到公司郵箱,模擬使用者收到驗證碼設定的郵件,看起來沒有問題!
注意: 請務必確認以下連結是否存在,否則二次驗證在 FreeRADIUS 中無法成功啟用。
完成所有配置程序,將 FreeRADIUS 服務重啟。
若有需要進行手機 App 測試,請取得 QR Code URL 後,以手機 App 操作掃描完成相關設定即可。
為了簡化驗證測試,就先使用 localhost
本機進行驗證程序。使用 radtest
命令,採用使用者 user02
,驗證密碼為 {使用者密碼}{Google Authenticator 驗證碼}
。使用以下命令進行測試。
執行結果
驗證碼也採用備用碼以簡化測試過程。
另外檢視使用者的組態檔 .google_authenticator
,也可發現使用的備用碼也從該組態檔中刪去。
可查看 /var/log/auth.log
檔檢視驗證紀錄。
待解問題