การติดตั้ง radius server
ด้วยโปรแกรม freeradius
วิธีติดตั้ง radius server ด้วยโปรแกรม freeradius
*** แหล่งข้อมูลต้นฉบับ freeradius คือ
http://www.freeradius.org
- ติดตั้งโปรแกรม freeradius ด้วยคำสั่ง
yum install freeradius
- แก้ไขให้ทำงานทุกครั้งที่บูทเครื่อง
chkconfig radiusd on
- สั่งให้ทำงานด้วยคำสั่งว่า
service radiusd start
Starting RADIUS
server:
[ OK ]
- ตรวจสอบว่าโปรแกรมทำงานแล้วด้วยคำสั่ง
service radiusd status
ได้ผลออกมาดังตัวอย่าง
radiusd (pid 19180) is running...
- แฟ้มที่เกี่ยวข้อง
- /var/log/radius/radius.log
- /etc/raddb/radiusd.conf
- /etc/raddb/clients.conf
- เมื่อให้ radiusd ทำงานแล้ว
เริ่มขั้นตอนทดสอบระบบโดยป้อนตัวอย่างคำสั่งดังนี้
radtest root password-root localhost 0 testing123
*** จากตัวอย่าง password-root คือรหัสผ่านของ root
ได้ผลข้อความตอบกลับดังตัวอย่าง
Sending Access-Request of id 43 to 127.0.0.1:1812
User-Name = "root"
User-Password =
"password-root"
NAS-IP-Address =
10.0.1.2
NAS-Port = 0
Re-sending Access-Request of id 43 to 127.0.0.1:1812
User-Name = "root"
User-Password =
"{\277\033\t\217\224\n\021\036\271$\301\026\234\353\225"
NAS-IP-Address =
10.0.1.2
NAS-Port = 0
rad_recv: Access-Reject packet from host 127.0.0.1:1812, id=43,
length=20
แสดงว่าระบบใช้งานได้แล้ว ถึงแม้ว่าจะมีการแจ้งว่า Access-Reject
เป็นสาเหตุเนื่องจากไม่มีสิทธิในการอ่านแฟ้ม /etc/shadow ของระบบ
- *** ควรทดสอบและปรับแต่งให้ถูกต้องตามหัวข้อนี้ให้เรียบร้อยก่อน
จึงค่อยใช้งานจริง
หากต้องการให้ใช้กับบัญชีผู้ใช้ระบบ UNIX
ต้องตั้งค่าให้อ่านแฟ้ม /etc/shadow ได้
โดยแก้ไขแฟ้ม /etc/raddb/radiusd.conf
ทำการ comment ยกเลิกบรรทัดข้อความจากเดิม
user = radiusd
group = radiusd
ให้เป็น
#user = radiusd
#group = radiusd
เสร็จแล้วให้ restart ระบบ radiusd ใหม่ด้วยคำสั่ง service radiusd
restart
ต่อไปลองป้อนตัวอย่างคำสั่งเดิมเพื่อทดสอบดังนี้
radtest root password-root localhost 0 testing123
คราวนี้จะได้ผลข้อความว่า
Sending Access-Request of id 82 to 127.0.0.1:1812
User-Name = "root"
User-Password =
"password-root"
NAS-IP-Address =
10.0.1.2
NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=82,
length=20
โดยมีผลการแจ้งว่า Access-Accept ถูกต้องตามต้องการ
- หากต้องการให้ radius client เข้ามาติดต่อใช้งานระบบ radiusd
นี้ได้
ให้แก้ไขแฟ้ม /etc/raddb/clients.conf ให้มีค่าดังตัวอย่างนี้
client 10.0.1.0/24 {
secret =
mytestkey
shortname = private-network
}
ตัวอย่างคือให้ radius client ที่มีหมายเลข ip 10.0.1.x
สามารถเข้ามาใช้ด้วย secret key ว่า mytestkey
เมื่อแก้ไขเสร็จแล้วให้ reload ใหม่ด้วยคำสั่ง service radiusd
reload
ลองทดสอบด้วยคำสั่งตัวอย่าง
radtest root passwordroot 10.0.1.1 0 mytestkey
*** ค่า passwordroot คือ รหัสผ่านของ root และ 10.0.1.1 คือหมายเลข
ip ของ radius server
ได้ผลแสดงข้อความดังตัวอย่าง
Sending Access-Request of id 246 to 10.0.1.1:1812
User-Name = "root"
User-Password =
"passwordroot"
NAS-IP-Address =
10.0.1.2
NAS-Port = 0
rad_recv: Access-Accept packet from host 10.0.1.1:1812, id=246,
length=20
ถึงขั้นตอนนี้เป็นอันเปิดใช้ระบบ radiusd ได้แล้ว
- ขั้นตอนการทำงานของ configuration ของ freeradius คือ
ในแฟ้ม /etc/raddb/radiusd.conf มีการปรับค่าของระบบต่างๆ
เมื่อ radius server ได้รับการติดต่อจากผู้ใช้ radius client
วิธีการตรวจสอบคุณสมบัติของผู้ใช้อยู่ในส่วนที่ชื่อ authorize
{...}
ภายใน authorize {...} นี้ ประกอบด้วยชื่อ modules ตรวจสอบต่างๆ
หากคุณสมบัติไม่ตรง ปรกติแล้วระบบก็จะรีบดีดออกมาพร้อมแจ้ง reject
แต่เราสามารถกำหนดให้ไปตรวจสอบต่อกับ authorize modules
เรียงลำดับอันถัดๆไปที่เหลืออื่นๆได้อีก
หากคุณสมบัติผ่าน
ก็จะเข้าขั้นตอนตรวจสอบรหัสผ่านของผู้ใช้ว่าถูกต้องหรือไม่
โดย authorize modules จะเลือก modules ที่ต้องการเอง จากส่วนที่ชื่อ
authenticate {...}
หากรหัสผ่านถูกต้อง ก็จะเข้าสู่ส่วนของ postauth {...}
เป็นการตรวจสอบทิ้งท้ายก่อนส่งคืนค่ากลับให้แก่ radius client
ที่ติดต่อมา
การบันทึกประวัติใช้งานอยู่ในส่วน accounting {...}
modules ทุกตัวที่ใช้งาน จะต้องได้รับการประกาศไว้ก่อนแล้ว
อยู่ในส่วนชื่อ modules {...}
- *** แนะนำให้ทำขั้นตอนนี้ด้วย เลิกใช้ module file
เพราะ module files ทำงานแล้วอาจเจอปัญหาแปลกๆ
หลังจากที่ radiusd ทำงานได้ดีแล้ว หากต้องการให้ radiusd
ตรวจสอบผู้ใช้จากแฟ้ม /etc/passwd
ขอแนะนำให้มีการแก้ไขปรับปรุงดังนี้คือ โดย default ในแฟ้ม
/etc/raddb/radiusd.conf
ส่วนของ authorize {...} มีการใช้ module ชื่อ files
ที่สั่งให้ระบบไปเปิดแฟ้มชื่อ /etc/raddb/users เพื่อทำงานต่อ
ผลคือหากผ่าน module files แล้ว จะไม่สามารถไหลต่อไปให้ modules
ที่เหลือถัดไปอีก
แนะนำให้เลิกใช้ module files แล้วสร้าง module
ใหม่เพื่อการตรวจสอบกับแฟ้ม /etc/passwd
ให้แก้ไขแฟ้ม /etc/raddb/radiusd.conf
ส่วนของ modules {...} ที่บริเวณข้อความ passwd etc_smbpasswd
{...}
...
ให้เพิ่ม module ใหม่ โดยแทรกบรรทัดข้อความว่า
passwd mypasswd {
filename = /etc/shadow
format = "*User-Name::"
authtype = unix
}
ส่วนของ authorize {...} ที่บริเวณข้อความขึ้นต้นด้วย authorize {
...
ให้ comment บรรทัด files เพื่อยกเลิกค่านี้
แล้วแทรกเพิ่มบรรทัดข้อความเพิ่ม กลายเป็นว่า
# files
mypasswd {
ok = return
}
เสร็จแล้วให้สั่งทำงานใหม่ด้วยคำสั่งว่า service radiusd reload
ทดสอบผลงานด้วยคำสั่ง radtest root password-root localhost 0
testing123
หากได้ผลข้อความประมาณว่า
Sending Access-Request of id 82 to 127.0.0.1:1812
User-Name = "root"
User-Password =
"password-root"
NAS-IP-Address =
10.0.1.2
NAS-Port = 0
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=82,
length=20
โดยมีผลการแจ้งว่า Access-Accept แสดงว่าถูกต้องตามต้องการแล้ว
- หากต้องการตรวจสอบผู้ใช้กับ mail server ผ่าน imap
ให้ทำดังนี้
ตัวอย่างนี้จะตรวจสอบกับ mail server ชื่อ your.mail.server
ต้องติดตั้ง php และ php-imap ก่อนแล้ว หากยังไม่ได้ติดตั้ง
ให้ติดตั้งด้วยคำสั่ง yum install php php-imap
สร้างแฟ้ม /root/imap.php ให้มีเนื้อหาว่า
<?php
error_reporting(0);
$host = $argv[1];
$username = $argv[2];
$password = $argv[3];
$imap_host="{" . $host . ":143/imap/notls}";
$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 ชื่อ /root/imap-authen.sh
มีเนื้อหาว่า
#!/bin/sh
user=`echo $USER_NAME | cut -d'"' -f2`
password=`echo $USER_PASSWORD | cut -d'"' -f2`
key=`/usr/bin/php /root/imap.php your.mail.server $user
$password`
if echo $key|grep -w "true" > /dev/null ; then
exit 0
fi
exit 1
สร้างแฟ้มแบบ text ชื่อ /etc/raddb/myusers มีเนื้อหาว่า
DEFAULT Auth-Type := Accept
Exec-Program-Wait="/bin/sh /root/imap-authen.sh"
ให้แก้ไขแฟ้ม /etc/raddb/radiusd.conf
ส่วนของ modules {...} ที่บริเวณข้อความ files {...}
...
ให้เพิ่ม module ใหม่ โดยแทรกบรรทัดข้อความว่า
files myimap {
usersfile = /etc/raddb/myusers
}
ส่วนของ autorize {...} ที่บริเวณข้อความขึ้นต้นด้วย authorize {
...
แทรกเพิ่มบรรทัดข้อความเพิ่ม กลายเป็นว่า
myimap
สั่งทำงานใหม่ด้วยคำสั่งว่า service radiusd reload
แค่นี้ก็เสร็จแล้ว ทดสอบผลงานได้เลย
- หากต้องการให้ใช้ได้ดับ LDAP ด้วยให้แก้ไขแฟ้ม
/etc/raddb/radiusd.conf
เพื่อให้รองรับและเชื่อมต่อกับ LDAP server ดังนี้
ส่วนของ modules {...} ที่บริเวณข้อความ
ldap {
**** ให้แก้ไขค่าของ server , basedn ดังตัวอย่าง
server = "myldap.net"
basedn = "dc=my, dc=net"
**** ให้ comment บรรทัด access_attr เพื่อยกเลิกค่า
เนื่องจากไม่ได้ใช้รูปแบบนี้
# access_attr = "dialupAccess"
แก้ไขส่วนของ authorize {...} ที่บริเวณข้อความขึ้นต้นด้วย
authorize {
...
ให้มีการตั้งค่าเลือก ldap อยู่ด้วย
แก้ไขส่วนของ authenticate {...}
ที่บริเวณพื้นที่ขึ้นต้นด้วยข้อความว่า authenticate {
...
# Auth-Type LDAP {
#
ldap
# }
*** ให้แก้ไขด้วยการ uncomment บรรทัดข้อความเพื่อให้ระบบกำหนดวิธี
LDAP
Auth-Type LDAP {
ldap
}
*** ในส่วนของ authenticate แก้ไขเพียงแค่นี้
เสร็จแล้วให้ reload ใหม่ด้วยคำสั่ง service radiusd reload
ทดสอบใช้งานกับ user บน ldap ได้เลย
- หากต้องการตรวจสอบผู้ใช้กับฐานข้อมูลพิเศษของตนเอง
ต้องสร้างแฟ้มแบบ text เพื่อเก็บรายชื่อผู้มีสิทธิ์ใช้งาน
ตัวอย่างนี้คือแฟ้ม /root/myusers.txt มีข้อมูลคือ
root
mama
demo
รายชื่อต้องเรียงลำดับไปบรรทัดละคน
ให้ป้อนรายชื่อเข้าไปตามต้องการ
สร้างแฟ้มคำสั่ง shell script ชื่อ /root/my-authen.sh
มีเนื้อหาว่า
#!/bin/sh
valid_file="/root/myusers.txt"
key=`echo $USER_NAME | cut -d'"' -f2`
if grep -w "$key" $valid_file > /dev/null ; then
exit 0
fi
exit 1
แก้ไขแฟ้ม /etc/raddb/radiusd.conf
ให้เพิ่ม module ใหม่ โดยแทรกบรรทัดข้อความว่า
ส่วนของ modules {...} ที่บริเวณข้อความ exec {...}
ให้เพิ่ม module ใหม่ โดยแทรกบรรทัดข้อความว่า
exec my-auth {
program = "/bin/sh
/root/my-authen.sh"
wait = yes
input_pairs =
request
output_pairs = reply
packet_type =
Access-Accept
}
ส่วนของ post-auth {...} ที่บริเวณข้อความขึ้นต้นด้วย post-auth {
...
แทรกเพิ่มบรรทัดข้อความเพิ่ม
my-auth
สั่งทำงานใหม่ด้วยคำสั่งว่า service radiusd reload
แค่นี้ก็เสร็จแล้ว ทดสอบผลงานได้เลย
- radius server สามารถส่งค่าบอกเวลาที่ยังคงเหลือให้ใช้งาน
โดยส่งค่ากลับมาที่ attribute ชื่อ Session-Timeout
แต่ตัวมันเองคำนวณไม่เป็น ต้องหาวิธีอื่นในการคำนวณเวลา
แล้วส่งกลับมาให้ radius ส่งคำตอบให้อีกทอดหนึ่ง
จากข้อ 13 หากต้องการใส่ค่าเวลาที่เหลือในการใช้งาน
ตัวอย่างเช่นเหลือ 120 วินาที ให้เพิ่มบรรทัดข้อความว่า
echo "SESSION-TIMEOUT = \"120\""
ลงไปก่อนบรรทัดข้อความ exit 0 ดังตัวอย่าง
if grep -w "$key" $valid_file > /dev/null ; then
echo "SESSION-TIMEOUT = \"120\""
exit 0
fi
สั่งทำงานใหม่ด้วยคำสั่งว่า service radiusd reload
แค่นี้ก็เสร็จแล้ว PC ที่ติดต่อเข้ามาจะได้รับคำตอบกลับไป
ระบุว่าเหลือเวลาใช้งานอีกเท่าไร ขึ้นกับตัวเลขทีกำหนดส่งออกมา
จากตัวอย่างให้แก้ไขตัวเลข 120 เป็นอื่นๆตามต้องการ
- แนะนำให้ยกเลิกการกำหนดค่าการทำงานบางตัวที่ไม่ได้ใช้งาน
โดยการ comment บรรทัดข้อความในแฟ้ม /etc/raddb/radiusd.conf
ถ้าไม่ได้ใช้เป็น proxy radius ควรยกเลิก
โดยเปลี่ยนจากเดิม proxy_requests = yes
ให้เป็น proxy_requests = no
ควรยกเลิกบาง authorize ที่ไม่ได้ใช้เช่น
authorize {
# preprocess
# chap
# mschap
# suffix
# ldap ---> ระบบ ldap
# files --> ระบบ UNIX หรือแฟ้ม /etc/shadow
- การบันทึกประวัติการใช้งานของ radius โดย defualt
จะบันทึกไว้ในพื้นที่ /var/log/radius/radacct
โดยแยกเป็น directory ของแต่ละหมายเลข ip ของ radius client
แล้วยังแตกย่อยออกเป็นแฟ้มของแต่วันอีก
ซึ่งอาจไม่สะดวกต่อการวิเคราะห์ข้อมูล
เราสามารถเพิ่ม module บันทึกประวัติการใช้งานเพิ่มเติมจากของเดิม
ตัวอย่างคือ
ต้องการบันทึกไว้ใน directory ชื่อ /var/log/radius/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 ชื่อ
/root/log-radius-account.sh มีเนื้อหาว่า
#!/bin/sh
export LANG=en.US
mydir="/var/log/radius/myaccount"
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;$CLIENT_IP_ADDRESS;$1;$ACCT_UNIQUE_SESSION_ID;$ACCT_STATUS_TYPE;$ACCT_SESSION_TIME"
>> $myfile
แฟ้ม shell script จบแค่นี้ ต่อไปแก้ไขแฟ้ม
/etc/raddb/radiusd.conf
ส่วนของ modules {...} ที่บริเวณข้อความ exec {...}
ให้เพิ่ม module ใหม่ โดยแทรกบรรทัดข้อความว่า
exec my-log-account {
wait = no
program = "/bin/sh
/root/log-radius-account.sh %l"
}
ส่วนของ accounting {...} ที่บริเวณข้อความ accounting {
...
detail
ให้แทรกเพิ่มบรรทัดข้อความว่า
my-log-account
เสร็จแล้ว ให้สั่งทำงานใหม่ด้วยคำสั่งว่า service radiusd reload
- การแสดงผลรายงานจำเป็นต้องหาโปรแกรมมาต่างหาก
ขอแนะนำตัวอย่างโปรแกรมแสดงผลรายงาน
- ต้นแหล่งข้อมูลคือ http://www.tummy.com/radiusContext/
สามารถได้ดาวน์โหลดโปรแกรมได้ที่
ftp://ftp.psu.ac.th/pub/freeradius/radiusContext-1.93.tar.gz
- ให้ดาวน์โหลดมาแล้วขยายแฟ้มเก็บไว้ที่ /root
ด้วยตัวอย่างคำสั่ง
tar -C /root -zxvf radiusContext-1.93.tar.gz
- สร้าง directory สำหรับแสดงผลบนเวบ ดังตัวอย่างคือ
mkdir /var/www/html/radius-report
จะแสดงผลบนโฮมพจ http://x.x.x.x/radius-report
- ตัวอย่าง ขั้นตอนที่ใช้สำหรับประมวลผลรวมข้อมูลจาก
/var/log/radius/radacct ไปเก็บไว้เพื่อแสดงผลที่
/var/www/html/radius-report
*** ภายใน /var/log/radius/radacct จะแยกเก็บข้อมูลเป็น directory
ของ
แต่ละหมายเลข ip
ทำให้อาจยุ่งยากต่อการรวบรวมข้อมูล
/root/radiusContext-1.93/raddetail /var/log/radius/radacct/*/*
/root/radiusContext-1.93/stdreport -D
/var/www/html/radius-report
*** ต้องใช้คำสั่งเหล่านี้ทุกครั้งเพื่อปรับปรุงผลรายงาน
- ทดสอบผลรายงานได้เลยที่ http://x.x.x.x/radius-report