หมายเหตุ: ต้องระวัง การปรับแต่งค่า freeradius 2.x บน ubuntu เปลี่ยนแปลงไปจาก freeradius 1.x ไปมาก
- ทดสอบกับ ubuntu 10.04 และ freeradius 2.x
- ต้นฉบับ freeradius อยู่ที่ http://freeradius.org
- สมมติว่า radius server นี้มีหมายเลข ip เป็น 10.0.1.1
- ติดตั้งด้วยคำสั่ง sudo apt-get install freeradius freeradius-utils freeradius-mysql freeradius-ldap gawk
- สั่งให้ทำงานด้วยคำสั่ง sudo /etc/init.d/freeradius start
- ทดสอบว่า freeradius ติดตั้งใช้งานได้แล้วด้วยตัวอย่างคำสั่ง
*** จากตัวอย่างให้แทนข้อความ your_root_password ด้วยรหัสผ่านของ root
sudo radtest your_name your_password 127.0.0.1 0 testing123
หากถูกต้องจะได้รับข้อความตอบกลับประมาณว่า
Sending Access-Request of id 232 to 127.0.0.1 port 1812
User-Name = "your-name"
User-Password = "your_password"
NAS-IP-Address = 255.255.255.255
NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=232, length=20
ถึงตอนนี้แสดงว่า freeradius ใช้งานได้แล้ว แต่ใช้ได้เพียง localhost คือ 127.0.0.1
- หากต้องการอนุญาติให้ radius client เข้ามาใช้ radius server นี้ได้
ต้องแก้ไขสิทธิ์ที่แฟ้ม /etc/freeradius/clients.conf ปรับตั้งให้มีค่าดังประมาณตัวอย่างนี้
client 10.0.1.0/24 {
secret = mytestkey
shortname = private-network
}
ตัวอย่างนี้คือให้ radius client ที่มีหมายเลข ip 10.0.1.x สามารถเข้ามาใช้ด้วย secret key ว่า mytestkey
เมื่อแก้ไขเสร็จแล้วให้ reload ใหม่ ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
ลองทดสอบด้วยคำสั่งตัวอย่าง sudo radtest your_name your_password 10.0.1.1 0 mytestkey
*** ค่า your_password คือ รหัสผ่านของ your_name และ 10.0.1.1 คือหมายเลข ip ของ radius server
ได้ผลแสดงข้อความดังตัวอย่าง
Sending Access-Request of id 246 to 10.0.1.1:1812
User-Name = "your_name"
User-Password = "your_password"
NAS-IP-Address = 255.255.255.255
NAS-Port = 0
rad_recv: Access-Accept packet from host 10.0.1.1:1812, id=246, length=20
ถึงขั้นตอนนี้เป็นอันเปิดบริการระบบ radius server ได้แล้ว
- ขั้นตอนการทำงานของ configuration ของ freeradius
แฟ้ม /etc/freeradius/radiusd.conf เป็นที่ปรับค่าของระบบต่างๆ
หากเป็น freeradius 2.x จะมีการแยกแฟ้มย่อยออกไปจาก /etc/freeradius/radiusd.conf
ไปอยู่ที่ /etc/freeradius/sites-available/default และ /etc/freeradius/modules
หากเป็น freeradius 1.x ทุกอย่างจะกระจุกตัวในแฟ้ม /etc/freeradius/radiusd.conf
เมื่อ radius server ได้รับการติดต่อจากผู้ใช้ radius client
วิธีการตรวจสอบคุณสมบัติของผู้ใช้อยู่ในส่วนที่ชื่อ authorize {...}
ภายใน authorize {...} นี้ ประกอบด้วยชื่อ modules ตรวจสอบต่างๆ
หากคุณสมบัติไม่ตรง ปรกติแล้วระบบก็จะรีบดีดออกมาพร้อมแจ้ง reject
แต่เราสามารถกำหนดให้ไปตรวจสอบต่อกับ authorize modules
เรียงลำดับอันถัดๆไปที่เหลืออื่นๆได้อีก
หากคุณสมบัติผ่าน ก็จะเข้าขั้นตอนตรวจสอบรหัสผ่านของผู้ใช้ว่าถูกต้องหรือไม่
โดย authorize modules จะเลือก modules ที่ต้องการเอง จากส่วนที่ชื่อ authenticate {...}
หากรหัสผ่านถูกต้อง ก็จะเข้าสู่ส่วนของ postauth {...}
เป็นการตรวจสอบทิ้งท้ายก่อนส่งคืนค่ากลับให้แก่ radius client ที่ติดต่อมา
การบันทึกประวัติใช้งานอยู่ในส่วน accounting {...}
modules ทุกตัวที่ใช้งาน จะต้องได้รับการประกาศไว้ก่อนแล้ว
หากเป็น freeradius 2.x จะแยก modules ออกเป็นแฟ้มย่อยๆอยู่ที่ directory ชื่อ /etc/freeradius/modules
หากเป็น freeradius 1.x จะมี modules อยู่ในแฟ้ม /etc/freeradius/radiusd.conf พื้นที่ส่วนของชื่อ modules {...}
- หากต้องการตรวจสอบผู้ใช้กับ mail server ผ่าน imap/pop3 ให้ทำดังนี้
ตัวอย่างนี้จะตรวจสอบกับ mail server ชื่อ your.mail.server
ต้องติดตั้ง php และ php-imap ก่อนแล้ว ติดตั้งด้วยคำสั่ง sudo apt-get install php5 php5-imap php5-cli
แก้ไขแฟ้ม /etc/php5/cli/conf.d/imap.ini ตรวจสอบ/เพิ่มให้มีบรรทัดตัวแปรว่า extension=imap.so
ต่อไปสร้างแฟ้ม /etc/freeradius/imap.php ให้มีเนื้อหาว่า
<?php
error_reporting(0);
$host = $argv[1];
$username = $argv[2];
$password = $argv[3];
$service = $argv[4];
$imap_host="{" . $host . $service . "}";
$mbox = imap_open("$imap_host", "$username", "$password");
$folders = imap_listmailbox($mbox, "$imap_host", "*");
if ($folders == false) {
echo "false";
} else {
echo "true";
}
imap_close($mbox);
?>
สร้างแฟ้มคำสั่ง shell script ชื่อ /etc/freeradius/imap-authen.sh มีเนื้อหาว่า
#!/bin/bash
#exit 0 = valid ; exit 1 = invalid
AUTHEN_SHADOW="YES"
AUTHEN_MAIL="YES"
AUTHEN_LDAP="NO"
AUTHEN_PSU_PASSPORT="NO"
NAME=$(echo ${USER_NAME} | cut -d'"' -f2)
PASSWORD=$(echo ${USER_PASSWORD} | cut -d'"' -f 2-|sed "s/\"$//")
KEY="false"
if [ "${AUTHEN_SHADOW}" = "YES" ] ; then
KEY=$(/bin/sh /etc/freeradius/check-shadow.sh "${NAME}" "${PASSWORD}")
if [ "${KEY}" = "true" ] ; then
exit 0
fi
fi
if [ "${AUTHEN_LDAP}" = "YES" ] ; then
KEY=$(/bin/sh /etc/freeradius/check-ldap.sh "${NAME}" "${PASSWORD}")
if [ "${KEY}" = "true" ] ; then
exit 0
fi
fi
if [ "${AUTHEN_PSU_PASSPORT}" = "YES" ] ; then
USER=$(echo ${NAME} | cut -d'@' -f1)
KEY=$(/usr/bin/php /etc/freeradius/soap-authen.php ${USER} ${PASSWORD} $1 $2})
if [ "${KEY}" = "true" ] ; then
exit 0
fi
fi
if [ "${AUTHEN_MAIL}" = "YES" ] ; then
IS_EMAIL=$(echo ${NAME}|grep "@")
if [ -n "${IS_EMAIL}" ] ; then
USER=$(echo ${NAME} | cut -d'@' -f1)
DOMAIN=$(echo ${NAME} | cut -d'@' -f2)
else
USER=${NAME}
DOMAIN="mail.psu.ac.th"
fi
case ${DOMAIN} in
psu.ac.th)
HOST="mail.psu.ac.th"
SERVICE=":143/imap/notls" ;;
pharmacy.psu.ac.th)
HOST="mail.pharmacy.psu.ac.th"
SERVICE=":143/imap/notls" ;;
pn.psu.ac.th)
HOST="bunga.pn.psu.ac.th"
SERVICE=":143/imap/notls" ;;
gmail.com)
HOST="pop.gmail.com"
SERVICE=":995/pop3/ssl" ;;
live.com)
HOST="pop3.live.com"
USER=${NAME}
SERVICE=":995/pop3/ssl" ;;
*)
HOST=${DOMAIN}
SERVICE=":110/pop3/notls" ;;
esac
KEY=$(/usr/bin/php /etc/freeradius/imap.php ${HOST} ${USER} ${PASSWORD} ${SERVICE})
if [ "${KEY}" = "true" ] ; then
exit 0
fi
fi
exit 1
สร้างแฟ้มแบบ text ชื่อ /etc/freeradius/myusers มีเนื้อหาว่า
DEFAULT Auth-Type := Accept
Exec-Program-Wait="/bin/sh /etc/freeradius/imap-authen.sh"
หากเป็น freeradius 2.x ให้แก้ไขแฟ้ม /etc/freeradius/modules/files เติมข้อความต่อท้ายแฟ้มว่า
files myimap {
usersfile = ${confdir}/myusers
}
แล้วแก้ไขแฟ้ม /etc/freeradius/sites-available/default
ที่ส่วนของ authorize {...} ประมาณบรรทัดที่ 152 ที่บริเวณข้อความขึ้นต้นด้วย authorize {
...
# Read the 'users' file
files
ให้ comment บรรทัด files เพื่อยกเลิกค่านี้ แล้วแทรกเพิ่มบรรทัดข้อความเพิ่ม กลายเป็นว่า
# files
แทรกเพิ่มบรรทัดข้อความว่า myimap ต่อไปอีกบรรทัด กลายเป็นว่า
# files
myimap
เสร็จแล้วให้สั่งทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
แค่นี้ก็เสร็จแล้ว ทดสอบผลงานได้เลย
- หากต้องการว่าหลังผ่านการตรวจสอบ username/password ถูกต้องแล้ว
จะทำการบันทึกลงแฟ้ม log file เก็บไว้ที่ /var/log/freeradius/myauthen และยังต้องการตรวจวิธีการพิเศษเฉพาะของตนเองเพิ่มเติมอีก
ตัวอย่างต้องการไม่อนุญาติให้ผู้ใช้ชื่อ demo และ abc ใช้งาน ให้ทำดังนี้
สร้างแฟ้มคำสั่ง shell script ชื่อ /etc/freeradius/my-authen.sh มีเนื้อหาว่า
#!/bin/bash
###exit 0 = valid ; exit1 = invalid
ALL_PASS="YES"
CHECK_STAFF="NO"
CHECK_STUDENT="NO"
export LANG=en.US
MYDIR="/var/log/freeradius/myauthen"
if [ ! -d ${MYDIR} ] ; then
mkdir -p ${MYDIR}
fi
TODAY=$(date "+%Y%m%d")
MYFILE="${MYDIR}/${TODAY}"
if [ ! -e ${MYFILE} ] ; then
touch ${MYFILE}
fi
MYTIME=$(echo $1|awk '{print strftime("%Y%m%d:%H:%M:%S",$1)}')
echo "${MYTIME};${USER_NAME};$2;$1;PASS" >> ${MYFILE}
MYUSER=$(echo $USER_NAME | cut -d'"' -f2)
if [ "${ALL_PASS}" = "YES" ] ; then
exit 0
fi
if [ "${CHECK_STAFF}" = "YES" ] ; then
case "${MYUSER}" in
demo) exit 1 ;;
*) exit 0 ;;
esac
fi
if [ "${CHECK_STUDENT}" = "YES" ] ; then
case "${MYUSER}" in
demo) exit 1 ;;
*) exit 0 ;;
esac
fi
exit 1
หากเป็น freeradius 2.x ให้แก้ไขแฟ้ม /etc/freeradius/modules/exec เติมข้อความต่อท้ายแฟ้มว่า
exec my-auth {
program = "/bin/sh /etc/freeradius/my-authen.sh %l %{Packet-Src-IP-Address}"
wait = yes
input_pairs = request
output_pairs = reply
packet_type = Access-Accept
}
แล้วแก้ไขแฟ้ม /etc/freeradius/sites-available/default
ที่ส่วนของ post-auth {...} ประมาณบรรทัดที่ 439 ที่บริเวณข้อความขึ้นต้นด้วย post-auth {
...
แทรกเพิ่มบรรทัดข้อความเพิ่ม
my-auth
เสร็จแล้วให้สั่งทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
- การบันทึกประวัติการใช้งานของ radius โดย defualt จะบันทึกไว้ในพื้นที่ /var/log/freeradius/radacct
โดยแยกเป็น directory ของแต่ละหมายเลข ip ของ radius client
แล้วยังแตกย่อยออกเป็นแฟ้มของแต่วันอีก ซึ่งอาจไม่สะดวกต่อการวิเคราะห์ข้อมูล
เราสามารถเพิ่ม module บันทึกประวัติการใช้งานเพิ่มเติมจากของเดิม ตัวอย่างคือ
ต้องการบันทึกไว้ใน directory ชื่อ /var/log/freeradius/myaccount
แล้วเก็บแฟ้มแยกเป็นรายวันในรูปแบบ 20060729 ภายในแฟ้มมีรูปแบบว่า
20060729:15:54:05;"demo";10.0.0.153;1154163245;"a5f56ebd6ebc1321";Start;
20060729:15:55:06;"demo";10.0.0.153;1154163306;"a5f56ebd6ebc1321";Stop;61
ให้ทำดังนี้ สร้างแฟ้มคำสั่ง shell script ชื่อ /etc/freeradius/log-radius-account.sh มีเนื้อหาว่า
#!/bin/bash
export LANG=en.US
MYDIR="/var/log/freeradius/myaccount"
if [ ! -d ${MYDIR} ] ; then
mkdir -p ${MYDIR}
fi
TODAY=$(date "+%Y%m%d")
myfile="${MYDIR}/${TODAY}"
if [ ! -e ${MYDIR} ] ; then
touch ${MYDIR}
fi
MYTIME=$(echo $1|awk '{print strftime("%Y%m%d:%H:%M:%S",$1)}')
echo "${MYTIME};${USER_NAME};$2;$1;${ACCT_UNIQUE_SESSION_ID};${ACCT_STATUS_TYPE};${ACCT_SESSION_TIME}" >> ${MYFILE}
แฟ้ม shell script จบแค่นี้
หากเป็น freeradius 2.x ให้แก้ไขแฟ้ม /etc/freeradius/modules/exec เติมข้อความต่อท้ายแฟ้มว่า
exec my-log-account {
wait = no
program = "/bin/sh /etc/freeradius/log-radius-account.sh %l %{Packet-Src-IP-Address} "
}
แล้วแก้ไขแฟ้ม /etc/freeradius/sites-available/default
ที่ส่วนของ accounting {...}ประมาณบรรทัดที่ 358 ที่บริเวณข้อความ accounting {
...
detail
ให้แทรกเพิ่มบรรทัดข้อความว่า
my-log-account
เสร็จแล้วให้สั่งทำงานใหม่ ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
- radius server สามารถส่งค่าบอกเวลาที่ยังคงเหลือให้ใช้งาน
โดยส่งค่ากลับมาที่ attribute ชื่อ Session-Timeout
แต่ตัวมันเองคำนวณไม่เป็น ต้องหาวิธีอื่นในการคำนวณเวลา
แล้วส่งกลับมาให้ radius ส่งคำตอบให้อีกทอดหนึ่ง
จากตัวอย่างข้อ 8 หากต้องการใส่ค่าเวลาที่เหลือในการใช้งาน
ตัวอย่างเช่นเหลือ 120 วินาที ให้เพิ่มบรรทัดข้อความว่า
echo "SESSION-TIMEOUT = \"120\""
ลงไปก่อนบรรทัดข้อความ exit 0 ดังตัวอย่าง
#!/bin/bash
###exit 0 = valid ; exit1 = invalid
MYUSER=$(echo $USER_NAME | cut -d'"' -f2)
case "${MYUSER}" in
demo) exit 1 ;;
abc) exit 1 ;;
*) echo "SESSION-TIMEOUT = \"120\""
exit 0 ;;
esac
เสร็จแล้วให้สั่งทำงานใหม่ ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
แค่นี้ก็เสร็จแล้ว PC ที่ติดต่อเข้ามาจะได้รับคำตอบกลับไป
ระบุว่าเหลือเวลาใช้งานอีกเท่าไร ขึ้นกับตัวเลขทีกำหนดส่งออกมา
จากตัวอย่างให้แก้ไขตัวเลข 120 เป็นอื่นๆตามต้องการ
- การบันทึกประวัติการ authen radius ไว้ในพื้นที่ /var/log/freeradius/myauthen ให้ทำดังนี้
สร้างแฟ้มคำสั่ง shell script ชื่อ /etc/freeradius/log-radius-authen.sh มีเนื้อหาว่า
#!/bin/bash
export LANG=en.US
MYDIR="/var/log/freeradius/myauthen"
if [ ! -d ${MYDIR} ] ; then
mkdir -p ${MYDIR}
fi
TODAY=$(date "+%Y%m%d")
MYFILE="${MYDIR}/${TODAY}"
if [ ! -e ${MYFILE} ] ; then
touch ${MYFILE}
fi
MYTIME=$(echo $1|awk '{print strftime("%Y%m%d:%H:%M:%S",$1)}')
echo "${MYTIME};${USER_NAME};$2;$1;CHECK_IN" >> ${MYFILE}
แฟ้ม shell script จบแค่นี้
หากเป็น freeradius 2.x ให้แก้ไขแฟ้ม /etc/freeradius/modules/exec เติมข้อความต่อท้ายแฟ้มว่า
exec my-log-authen {
wait = no
program = "/bin/sh /etc/freeradius/log-radius-authen.sh %l %{Packet-Src-IP-Address} "
}
แล้วแก้ไขแฟ้ม /etc/freeradius/sites-available/default
ที่ส่วนของ authorize {...}ประมาณบรรทัดที่ 152 ที่บริเวณข้อความ authorize {
...
# files
myimap
ให้แทรกเพิ่มบรรทัดข้อความ กลายเป็นว่า
my-log-authen
# files
myimap
เสร็จแล้วให้สั่งทำงานใหม่ ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
- ตัวอย่างคำสั่งการทดสอบด้วยคำสั่ง radclient
ทดสอบการ authen คำสั่งประมาณว่า
echo "User-Name=mama,User-Password=123456" | radclient 10.0.1.2 auth mytestkey
ทดสอบการ accounting ตอนเข้า คำสั่งประมาณว่า
echo "User-Name=mama,Acct-Status-Type=Start" | radclient 10.0.1.2 acct mytestkey
ทดสอบการ accounting ตอนออก คำสั่งประมาณว่า
echo "User-Name=mama,Acct-Status-Type=Stop" | radclient 10.0.1.2 acct mytestkey