關於 802.1X 的匿名使用者 anonymous identity

當使用 Android 手機連線到一個 802.1X 的網路,在 EAP 方法 (Method) 選擇使用 PEAP 或是 EAP-TTLS 時,在下方的欄位會看到一個叫做 匿名使用者 (anonymous identity)

anonymous identity

而在學術網路 (TANet) 上的很多教學文件裡面,會請使用者直接留空不填,但到底這個欄位是為了什麼而設計?

針對這個問題,在這次協助建置 eduroam 的同時研究出一些心得,提供一些個人的解讀及看法給大家。

與個人隱私相關

EAP Methods 在整個驗證的過程中會傳送所謂的 Identity,也就是使用者的帳號資訊,在 RADIUS 的 Attribute Name 為 User-Name,這個 Identity 從驗證到結束都是以 明文 (Cleartext) 的方式傳遞。

在某些支援 TLS Tunnel 的 EAP Method (PEAP, EAP-TTLS…) 則會再進階的區分 outer identity / inner identity,outer identity 用於建立 TLS Tunnel,而 inner identity 則用於在 TLS Tunnel 建立完成後的身份驗證流程。

outer identity 與 inner identity 可以完全不相同,更甚至是沒有任何關係,一般預設的值會是 anonymous ,所以也叫做匿名使用者 (anonymous identity)。

這就關係到使用者的隱私問題,利用 TLS Tunnel 機制來區分 outer / inner identity 可以進階的保護使用者的資訊不被中間的 RADIUS Service Providers 紀錄下來,又可以將正確的資訊隱藏在加密的 Tunnel 裡面傳輸到 Identity Provider,所以 eduroam 官方建議使用此類型的 EAP Methods,並正確的設定 anonymous identity 來保護使用者的隱私。

但另一個問題來了,outer identity (User-Name) 變成 anonymous 時,要怎麼正確的將資訊傳送到對的 RADIUS Server ?

User-Name 變成 anonymous,如何進行 RADIUS Proxy?

這個問題其實沒有標準答案,主要是看整個架構是否有定義統一的規範。

我們知道,決定哪些使用者要留下來進行 Local Authentication 、哪些要轉送到外部 RADIUS Server (TANet 叫做漫遊中心),靠的是 User-Name 的 完整網域帳號 ,並透過 IPASS (/) 或是 suffix (@) 所設定的 delimiter 來切割 Stripped-User-Name 及 Realm 。

例如:

User-Name: user@xxx.edu.tw
Stripped-User-Name: user
Realm: xxx.edu.tw

所以當 User-Name 是 anonymous 時,則 Realm 會是 NULL。

而 FreeRADIUS 預設的 proxy.conf 是沒有開啟 realm NULL 導向,基本上這個 Access-Request 會被 reject。

如果你的環境雖然沒有開啟 realm NULL,但是有開啟 realm DEFAULT ,這個時候 Access-Request 是會轉送到 Default 哦。

1
$ vi /etc/raddb/proxy.conf
1
2
3
4
5
6
7
8
9
#
# This realm is for requests which don't have an explicit realm
# prefix or suffix. User names like "bob" will match this one.
#
#realm NULL {
# authhost = radius.example.com:1600
# accthost = radius.example.com:1601
# secret = testing123
#}

不過為了要能夠讓 anonymous 可以使用,通常會啟用並設定由 LOCAL 來處理

1
2
3
4
5
#
realm NULL {
authhost = LOCAL
accthost = LOCAL
}

這時就會發生所謂 TLS Terminate 的狀況,也就是 TLS Tunnel 其實是跟這台 RADIUS Server 建立,而不是 Identity Provider,如果這台 RADIUS Server 是你漫遊的中間商,那表示你的資訊就會被它看到,包含你所傳輸的機敏資訊 (User-Password)

通常 RADIUS Server 會設定 detail 參數,把密碼欄位排除掉不紀錄。

1
$ vi /etc/raddb/mods-enabled/detail
1
2
3
4
5
6
detail {
...
suppress {
User-Password
}
}

要如何知道是否被 TLS Terminate ?

最簡單的方式就是在連線的時候,CA 憑證欄位選擇 首次使用的信任原則 (TOFU)

Certificate TOFU

點選連線後,會彈跳出一個憑證視窗讓你確認這張憑證是否是提供你帳號的 Identity provider 端所簽發的

Certificate prompt

如何正確的設定 anonymus identity

Since the outer identity is only needed for routing purposes towards the IdP, the local username part does not have to be accurate and can be obfuscated. The IETF-suggested way of obfuscating the username is to leave it empty; but it can just as well be replaced with “anonymous”, “anon” or similar. However, the realm part (i.e. behind the @ sign) always needs to be accurate because it contains the routing information.

eduroam 官方有說明,建議在這個欄位加上 @realm ,例如 anonymous@xxx.edu.tw ,讓 outer 的驗證過程可以順利的將 User-Name 拆解出 Realm,以便傳遞到正確的 RADIUS Server 進行 TLS Tunnel handshake

結論

事實上 anonymous identity 這個欄位一直以來都不是強制必填,留空後送出也會帶你真實的使用者帳號來當作 outer identity 傳遞,如果你不介意資訊洩漏,基本上也不會在意,不過在資安意識抬頭的時代,多少還是要保護好個資會比較妥當。

我實際使用 Windows 選擇 PEAP 時發現沒有欄位可以設定 anonymous identity,而 Apple device 更是簡單到只讓你設定帳號密碼。

References

  • https://wiki.geant.org/display/H2eduroam/eap-types