Freeradius 整合 Active Directory 認證(Multiple Domains模式)

近來協助處理某大型企業要將Aruba認證導向AD,認證的部份要用到802.1XPEAP / MS-CHAP-V2

過程之中遇到了許許多多的問題,還好大致上都解決了,趁著還有記憶的時候趕緊記錄下來,東西很多,請耐心觀看。

由於環境內需要join AD才可以查詢,所以就必須使用Samba來join AD

Change Log

  • 20210723 增加winbind NT_STATUS_ACCESS_DENIED 錯誤訊息的說明與處理,以及EAP的觀念說明。

基本環境

  • CentOS 6.x
  • Freeradius 2.1.12
  • Samba 3.5.10
  • krb5-server 1.9
  • Domain name : adtest.com
  • AD server (2008 R2): dc.adtest.com

設定Linux環境

  • 關閉 selinux與iptables(以防一些意外發生, 完成後再調整)
  • AD的ip跟domain設定在/etc/hosts裡
  • dns server設定為AD的ip
  • 關閉ipv6(避免samba log出現smbd_open_once_socket: open_socket_in: Address already in use)

Packages Install

1
[root@radius ~]# yum install freeradius freeradius-utils samba samba-winbind krb5-server krb5-workstation

Samba設定

由於我們只是要藉由samba來查詢AD的資料,不需提供AD的user來登入freeradius,所以在smb.conf的global部份只需設定以下的內容即可。

另外在這裡我們是用ADS(Domain membership)的方式來與AD做溝通,他會把Linux模擬成windows 2000來與AD做join,在這個模式中會使用kerberos的方式來做驗證

1
2
3
4
[root@radius ~]# cd /etc/samba/
[root@radius /etc/samba]# mv smb.conf smb.conf.bak

[root@radius ~]# /etc/samba# vim smb.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[global]
workgroup = adtest
# 你的domain(一定要大寫)
realm = ADTEST.COM
# 你的hostname
netbios name = radius
security = ads
# dc的domain
password server = dc.adtest.com
# 非常重要!!! 一定要做encrypt passwords 不然怎麼設定都連不上AD
# 而且winbind會造成cpu overload
encrypt passwords = yes
# 關掉cups
load printers = no
printcap name = /dev/null
disable spoolss = yes

krb5設定

1
[root@radius ~]# vim /etc/krb5.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
default_realm = ADTEST.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true

[realms]
# domain要大寫
ADTEST.COM = {
kdc = dc.adtest.com:88
admin_server = dc.adtest.com:749
default_domain = adtest.com
}

[domain_realm]
# domain要大寫
.adtest.com = ADTEST.COM
adtest.com = ADTEST.COM

[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf

kdc設定

1
[root@radius ~]# vim /var/kerberos/krb5kdc/kdc.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88

[realms]
# domain要大寫
ADTEST.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}

網域信任

如何做網域信任,這裡就不贅述了,請參考google大神的說明…

取得驗證ticket

1
[root@radius ~]# kinit administrator@ADTEST.COM

輸入完上述的指令後會要求輸入密碼,這裡需要用到網域信任的帳號密碼。

若輸入完後無出現任何訊息,就表示已完成取得ticket。

可以使用klist確認ticket狀況

1
2
3
4
5
6
7
[root@radius ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@ADTEST.COM

Valid starting Expires Service principal
10/03/12 16:31:02 10/04/12 02:31:11 krbtgt/ADTEST.COM@ADTEST.COM
renew until 10/10/12 16:31:02

加入AD Domain

當Samba與kerberos都設定好後,需要啟動一下Samba與Winbind。

1
2
[root@radius ~]# service smb start
[root@radius ~]# service winbind start

再來將Linux加入Domain

1
[root@radius ~]# net ads join -U administrator

輸入完密碼之後,正確的話會沒有任何輸出資訊。

這時就可以在AD上面看到Linux加入網域囉。

測試驗證

Domain加入成功後,就可以使用下述的指令來測試是否可以驗證

1
[root@radius ~]# ntlm_auth --request-nt-key --domain=ADTEST.COM --username=<一般使用者> --password=<使用者的密碼>

驗證成功會出現以下資訊

1
NT_STATUS_OK: Success (0x0)

如果已經確認domain及帳號密碼都是正確的,但驗證卻出現以下資訊

1
NT_STATUS_ACCESS_DENIED: {Access Denied} A process has requested access to an object but has not been granted those access rights. (0xc0000022)

請在smb.conf裡多加一個參數

1
2
3
4
5
[global]
...
# 這個參數只在samba 3.0.26以上才有支援
winbind rpc only = yes

原因在於winbind預設是使用LDAP協定與Active Directory獲取身份資訊,若你的Active Directory沒有啟動這個功能,就要強制轉為RPC協定。

更改/var/lib/samba/winbindd_privileged目錄權限

這裡需要把radiusd這個使用者加入wbpriv群組裡,不然Freeradius是無法透過ntlm_auth來與AD驗證(需透過winbind)

1
[root@radius ~]# usermod -G wbpriv radiusd

Freeradius設定

上面這個部份屬於Freeradius要與AD溝通的重要基礎,接下來就要針對Freeradius來做相關的設定

這裡只將會用到的參數列出

module/mschap設定

1
2
3
4
5
6
mschap {
# 一般會使用domain大多都採用這個方式來做驗證(domain.com\username)
with_ntdomain_hack = yes
# 預設是沒有--domain, 所以要加上去
ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --domain=%{mschap:NT-Domain} --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"
}

proxy.conf設定

預設NULL與DEFAULT是註解的狀態,把#去掉,並把下述參數加入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
realm NULL {
type = radius
authhost = LOCAL
accthost = LOCAL
# 自行修改需要的密碼
secret = testing123
}

realm DEFAULT {
type = radius
authhost = LOCAL
accthost = LOCAL
# 自行修改需要的密碼
secret = testing123
}

在EAP驗證的環節裡面,必須要完整傳輸使用者輸入的User-Name,所以realm裡面不能加入strip,否則EAP的驗證會因為User-Name miss match而失敗。

client.conf設定

把Aruba Controller的ip加入

1
2
3
4
5
client 192.168.1.100 {
# 自行修改需要的密碼
secret = testing123
shortname = aruba
}

sites-available/default設定

確認這兩個section裡的參數

1
2
3
4
5
6
7
8
9
10
11
authorize {
mschap
#suffix
ntdomain
}

authenticate {
Auth-Type MS-CHAP {
mschap
}
}

EAP 設定

Freeradius預設已經設定好EAP驗證所需支援的多種methods,包含MD5、TLS、TTLS、PEAP-MSCHAPv2、PEAP-GTC…等,這些method的選擇取決於使用者端的設定,所以不需要特別調整。

結論

以上就是Freeradius的設定,基本上在Aruba Controller上的AAA Test就可以測試mschapv2是否會成功。

所以給大家做參考囉。

P.S Aruba Controller的AAA Test是不會發送EAP-Message給Freeradius,要記得用其他工具來測試EAP的驗證。