ตั้งค่า freeradius exec python
ต่อจากงานที่ต้องทำให้ freeradius ต่อกับ ad แล้วไปเจอปัญหาว่า
ลูกค้าต้องการให้ แยก OU ที่ต่างกันให้ได้รับ reply แอตทริบิวต์ ที่ต่างกัน
ปัญหาที่เจอคือ radius ไม่สามารถอ่าน OU แล้วส่งแยกได้แบบนั้น (จากที่หาข้อมูลและพยายามตั้งค่านะ หากได้จะมาแจ้งอีกที)
จึงได้ทำให้freeradius สามารถexec ไฟล์ python ในการไปอ่าน ad และดึง ou แทน โดยมีรายละเอียดดังนี้
ไปที่ mods-enabled/exec โดยไปแก้ที่ wait = yes
จากนั้นไปที่ sites-enabled/default
แล้วไปที่ authorize แล้วลงมาดูที่ -sql โดยเพิ่มด้งนี้
-sql{
notfound = 1
reject = 2
}
if(notfound){
if ( “%{exec:/usr/bin/python3.6 /etc/raddb/radiusAuthentication.py %{User-Name} %{%{User-Password}:-Chap-Password}}” == “accept” ) {
if ( “%{exec:/usr/bin/python3.6 /etc/raddb/radius_check_ou.py %{User-Name} %{%{User-Password}:-Chap-Password}}” == “OU=guestDC=kmzohanDC=com” ) {
update control {
Auth-Type := accept
reply:Service-Type := ‘NAS-Prompt-User’
}
}elsif ( “%{exec:/usr/bin/python3.6 /etc/raddb/radius_check_ou.py %{User-Name} %{%{User-Password}:-Chap-Password}}” == “OU=strefDC=kmzohanDC=com” ) {
update control {
Auth-Type := accept
reply:Service-Type := ‘Administrative-User’
}
}else{
update reply {
Reply-Message := “Login Failed. Please check your Username and Password”
}
reject
}
}else{
update reply {
Reply-Message := “Login Failed. Please check your Username and Password”
}
reject
}
}
if(reject){
update reply {
Reply-Message := “Login Failed. Please check your Username and Password”
}
reject
}
จากด้านบนขออธิบายดังนี้
-sql{
notfound = 1
reject = 2
}
อันนี้คือผลที่ได้จาก sql โดย notfound จะเกิดตอน username ผิด ส่วน หาก password ผิด จะไม่สามารถ ส่งมาหา python ได้
if(notfound){ << ในนี้คือ if ที่จะเช็คหลังจาก username ผิด
if ( “%{exec:/usr/bin/python3.6 /etc/raddb/radiusAuthentication.py %{User-Name} %{%{User-Password}:-Chap-Password}}” == “accept” ) {
if นี้คือ จะใช้ radiusAuthentication.py ไป login ตรวจสอบกับ ad โดยผมจะไม่ได้อธิบาย radiusAuthentication.py แต่หากพบว่าถูกให้ตอบ accept ออกมา หรือ print ถ้าไม่ผ่านให้ reject
if ( “%{exec:/usr/bin/python3.6 /etc/raddb/radius_check_ou.py %{User-Name} %{%{User-Password}:-Chap-Password}}” == “OU=guestDC=kmzohanDC=com” ) {
if นี้จะตรวจสอบ OU โดยที่ หากพบว่าถูกจะreply:Service-Type := ‘NAS-Prompt-User’ ออกไปแล้วแต่ if เลย
update reply {
Reply-Message := “Login Failed. Please check your Username and Password”
}
reject
จากอันนี้ สรุปคือหาก reject ตรงไหนโปรแกรมจะยิงออกเลย
แต่หากเอาไปลองแล้วมี user มากกว่า 1 ที่เช่น sql ad หรืออืนๆด้วย แนะนำให้เตรียม user ที่ต่างสักที่ละ 2 user เพื่อทดสอบ