首先感恩廖大讚歎廖大(chianan_liao)的分享私人筆記才有這篇騙吃騙喝的文章
現況
有一台該死的Microsoft AD(Active Directory) 但我離不開她 (其實用 samba 的偽 AD 也可以) 我的無線網路環境有一堆人要用,不想用單一密碼,我需要 802.1x 做無線網路驗證,讓每個人打自己的 AD 帳密連線
架構
本文就是要弄出右上角這台 RADIUS Server
網域: alexw.net 網域簡寫: ALEXW 原本就有的 AD Server host: ads.alexw.net ip: 192.168.1.2 本文要建立的 FreeRADIUS + samba host: rad.alexw.net ip: 192.168.1.3
本文測試環境: Debian 10 / Windows Server 2019
前置作業
裝好一台 debian,設置 hosts 對應
debian 會設置 127.0.1.1 對應本機,這個註解掉改為 host ip
/etc/hosts
127.0.0.1 localhost
# 127.0.1.1 rad.alexw.net rad
192.168.1.3 rad.alexw.net rad
設置 DNS server (設為兼任 dns 的 AD server)
/etc/resolv.conf
nameserver 192.168.1.2
domain alexw.net
search alexw.net
安裝套件
安裝 freeradius 和 samba 等相關套件
apt install freeradius samba-common winbind krb5-config libpam-winbind libnss-winbind -y
設定 krb5
/etc/krb5.conf
[libdefaults]
dns_lookup_realm = false
dns_lookup_kdc = true
default_realm = ALEXW.NET
[realms]
ALEXW.NET = {
kdc = ads.alexw.net
admin_server = ads.alexw.net
}
[domain_realm]
.alexw.net = ALEXW.NET
alexw.net = ALEXW.NET
設定 samba
/etc/samba/smb.conf
* * security = ADS 這行的 ADS 不是 ads.alexw.net 的 server name 而是真的要打 “ADS” * *
[global]
security = ADS
workgroup = ALEXW
ntlm auth = Yes
realm = ALEXW.NET
client NTLMv2 auth = YES
log file = /var/log/samba/log.%m
max log size = 1000
logging = file
log level = 1
password server = ads.alexw.net
winbind use default domain = true
winbind offline logon = false
template homedir = /home/%U
template shell = /bin/bash
idmap config * : backend = tdb
idmap config * : range = 10000-20000
/etc/nsswitch.conf
passwd: compat winbind
group: compat winbind
shadow: compat winbind
gshadow: files
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
加入網域
把這台機器加入 AD 網域,當個快樂的 AD 成員(使用 administrator 帳號,理論上非 administrator 也可以)
net ads join -U administrator
下面這錯誤可以忽略 這是動態更新 DNS 失敗(因為伺服器都設置 static dns 不做 dynamic)
Enter administrator's password:
Using short domain name -- ALEXW
Joined 'RAD' to dns domain 'alexw.net'
DNS Update for rad.alexw.net failed: ERROR_DNS_UPDATE_FAILED
DNS update failed: NT_STATUS_UNSUCCESSFUL
備註:以後如果機器撤掉要退網域則使用 (現在不要打這行指令啦啊啊啊)
## 這是退網域用的指令 ## net ads leave -U administrator
重啟 winbind
systemctl restart winbind
測試是否能讀取 AD 使用者和群組的資料
wbinfo -u wbinfo -g
測試帳號登入
ntlm_auth --username={AD_USER_ACCOUNT} --password={AD_USER_PASSWORD}
正確會出現
NT_STATUS_OK: The operation completed successfully. (0x0)
設定FreeRADIUS
把 freerad 帳號加入 winbindd_priv 群組
usermod -a -G winbindd_priv freerad
重啟 winbind
systemctl restart winbind
編輯 FreeRADIUS 設定
/etc/freeradius/3.0/radiusd.conf 不需更改
編輯用戶端設定
/etc/freeradius/3.0/clients.conf
secret 後面接的是 radius 用的 secret key (自行設定)
client localhost {
ipaddr = 127.0.0.1
secret = AAA@AAA
}
client localhost_ipv6 {
ipv6addr = ::1
secret = AAA@AAA
}
client private-network-1 {
ipaddr = 192.168.0.0/16
secret = AAA@AAA
}
修改 mschap
/etc/freeradius/3.0/mods-available/mschap
mschap {
use_mppe=yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes
winbind_username = "%{mschap:User-Name}"
winbind_domain = "ALEXW"
ntlm_auth = "/usr/bin/ntlm_auth --allow-mschapv2 --request-nt-key --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"
}
修改 /etc/freeradius/3.0/mods-available/ntlm_auth
修改裡面的 path 和 domain
exec ntlm_auth {
wait = yes
program = "/usr/bin/ntlm_auth --request-nt-key --domain=ALEXW --username=%{mschap:User-Name} --password=%{User-Password}"
}
測試 RADIUS 連線
停止服務並改用啟動偵錯模式 freeradius -X
systemctl stop freeradius freeradius -X
然後用另一個 console 測試連線測試本地端 (本地開 18120,如果是遠端則是 1812)
radtest -t mschap {USER} "{USER_PASSWORD}" localhost:18120 0 AAA@AAA
成功會得到這樣的訊息
Sent Access-Request Id 12 from 0.0.0.0:57999 to 127.0.0.1:18120 length 132
User-Name = "{USER}"
MS-CHAP-Password = "{USER_PASSWORD}"
NAS-IP-Address = 127.0.0.1
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "{USER_PASSWORD}"
MS-CHAP-Challenge = 0x3a6a904d7a1c7d7b
MS-CHAP-Response = 0x0001000000000000000000000000000000000000000000000000beb439542bf97174619a4b7a7360141633ba32b8719a5de4
Received Access-Accept Id 12 from 127.0.0.1:18120 to 127.0.0.1:57999 length 84
MS-CHAP-MPPE-Keys = 0x00000000000000004e09b29052bcb917ed0d2bc195ce801a
MS-MPPE-Encryption-Policy = Encryption-Required
MS-MPPE-Encryption-Types = 4
測試成功後 ctrl-c 終止 freeradius -X
程序 啟用並設置每次開機啟動服務
systemctl start freeradius systemctl enable freeradius
現在連線可以使用
Android 手機連線時選擇 PEAP / MSCHAPV2 / 不驗證
iOS 則無腦直連
以上就可以算完工了,不過對於 android 11 更新後會發現不能選不驗證,他一定要做驗證才能連線
只好繼續往下做
加入憑證
這邊我們採用免費的 Let’s encrypt 的憑證來使用
let’s encrypt 是發行憑證的單位,但是我們會用第三方套件去申請和更新憑證,本文採用 certbot 這個套件來處理
記得以前都是用 apt 直裝,不過這次發現 certbot 是建議使用 snap 套件管理來安裝,那就來試試看)
那就先來安裝 snap
apt install snapd -y
安裝完之後要更新 snap core
snap install core snap refresh core
使用 snap 安裝 certbot
snap install --classic certbot
取得憑證 (需公用 ip 正反解 + 80 port 防火牆暢通)
/snap/bin/certbot certonly --standalone
完成後金鑰會存放在 /etc/letsencrypt/live/{your_domain}
裡
測試自動更新
/snap/bin/certbot renew --dry-run
在 free radius 目錄內建立 let’s encrypt 資料夾 將金鑰檔案複製過去並設置權限
mkdir -p /etc/freeradius/3.0/certs/letsencrypt
cp /etc/letsencrypt/live/rad.alexw.net/privkey.pem /etc/freeradius/3.0/certs/letsencrypt
cp /etc/letsencrypt/live/rad.alexw.net/fullchain.pem /etc/freeradius/3.0/certs/letsencrypt
chown freerad:freerad -R /etc/freeradius/3.0/certs/letsencrypt
修改 /etc/freeradius/3.0/mods-enabled/eap
# private_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
private_key_file = /etc/freeradius/3.0/certs/letsencrypt/privkey.pem
# certificate_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
certificate_file = /etc/freeradius/3.0/certs/letsencrypt/fullchain.pem
重啟 freeradius
systemctl restart freeradius
android 手機連線的時候,驗證部分選使用系統憑證應該就可以通了
iOS 一樣無腦直連
搞定收工