Author Topic: radius authen testing  (Read 7086 times)

golfreeze

  • Administrator
  • Hero Member
  • *****
  • Posts: 2140
    • View Profile
    • นั่งสมาธิ สติปัฏฐานสี่ พาเที่ยววัด แนะนำวัด แจกcd ธรรมะฟรี
    • Email
radius authen testing
« on: มกราคม 23, 2011, 01:04:25 AM »
เป็นคำแนะนำติดตั้งจัดการปรับแต่ง radius server
ต้นแบบทดสอบด้วย linux ubuntu 6.06, fedora core 6,5,4 ใช้งานภายในมหาวิทยาลัยสงขลานครินทร์
*** บน ubuntu ยังทดสอบไม่สมบูรณ์

วิธีติดตั้ง radius server ด้วยโปรแกรม freeradius
*** แหล่งข้อมูลต้นฉบับ freeradius คือhttp://www.freeradius.org


ติดตั้งโปรแกรม freeradius
หากเป็น ubuntu ใช้คำสั่ง apt-get install freeradius

หากเป็น fedora ใช้คำสั่ง yum install freeradius


หากเป็น fedoara ต้องแก้ไขให้ทำงานทุกครั้งที่บูทเครื่อง
chkconfig radiusd on


สั่งให้ freeradius ทำงาน
หากเป็น ubuntu ใช้คำสั่ง /etc/init.d/freeradius start

หากเป็น fedora ใช้คำสั่ง /etc/init.d/radiusd start


ตรวจสอบว่าโปรแกรมทำงานแล้วด้วยคำสั่ง
ps ax | grep radius

หากเป็น ubuntu ได้ผลตัวอย่าง
4165 ? Ssl 0:00 /usr/sbin/freeradius

หากเป็น fedora ได้ผลตัวอย่าง
4480 ? Ssl 0:10 /usr/sbin/radiusd -y


แฟ้มที่เกี่ยวข้อง
หากเป็น ubuntu คือ

/var/log/freeradius/radius.log
/etc/freeradius/radiusd.conf
/etc/freeradius/clients.conf

หากเป็น fedora คือ

/var/log/radius/radius.log
/etc/raddb/radiusd.conf
/etc/raddb/clients.conf


เมื่อให้ radiusd ทำงานแล้ว เริ่มขั้นตอนทดสอบระบบโดยป้อนตัวอย่างคำสั่งดังนี้

radtest root password-root localhost 0 testing123
*** จากตัวอย่าง password-root คือรหัสผ่านของ root
หากเป็น fedora จะได้ผลข้อความตอบกลับดังตัวอย่าง
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 ของระบบ

ปัญหาที่ว่ามานี้ไม่เกิดกับ ubuntu เพราะ default ของระบบถูกต้องอยู่แล้ว

*** ควรทดสอบและปรับแต่งให้ถูกต้องตามหัวข้อนี้ให้เรียบร้อยก่อน จึงค่อยใช้งานจริง

หากเป็น ubuntu ข้ามตรงนี้ไปทดสอบรหัสผ่านได้เลย
หากเป็น fedora ถ้าต้องการให้ใช้กับบัญชีผู้ใช้ระบบ 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 นี้ได้
หากเป็น ubuntu ให้แก้ไขแฟ้ม /etc/freeradius/clients.conf
หากเป็น fedora ให้แก้ไขแฟ้ม /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 ใหม่
หากเป็น ubuntu ใช้คำสั่ง /etc/init.d/freeradius reload
หากเป็น fedora ใช้คำสั่ง /etc/init.d/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

ถึงขั้นตอนนี้เป็นอันเปิดใช้ระบบ radius server ได้แล้ว


ขั้นตอนการทำงานของ configuration ของ freeradius
หากเป็น ubuntu คือแฟ้ม /etc/freeradius/radiusd.conf
หากเป็น fedora คือแฟ้ม /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
ที่สั่งให้ระบบไปเปิดแฟ้ม users เพื่อทำงานต่อ
หากเป็น ubuntu คือ /etc/freeradius/users
หากเป็น fedora คือ /etc/raddb/users
ผลคือหากผ่าน module files แล้ว จะไม่สามารถไหลต่อไปให้ modules ที่เหลือถัดไปอีก
แนะนำให้เลิกใช้ module files แล้วสร้าง module ใหม่เพื่อการตรวจสอบกับแฟ้ม /etc/passwd
หากเป็น ubuntu ให้แก้ไขแฟ้ม /etc/freeradius/radiusd.conf
หากเป็น fedora ให้แก้ไขแฟ้ม /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
}

เสร็จแล้วให้สั่งทำงานใหม่
หากเป็น ubuntu ใช้คำสั่ง /etc/init.d/freeradius reload
หากเป็น fedora ใช้คำสั่ง /etc/init.d/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 ก่อนแล้ว
หากเป็น ubuntu ติดตั้งด้วยคำสั่ง
apt-get install php5 php5-imap php5-cli
แล้วแก้ไขแฟ้ม /etc/php5/cli/php.ini เพิ่มให้มีบรรทัดว่า
extension=imap.so

หากเป็น fedora ติดตั้งด้วยคำสั่ง 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 ชื่อ /root/myusers มีเนื้อหาว่า
DEFAULT Auth-Type := Accept
Exec-Program-Wait=\"/bin/sh /root/imap-authen.sh\"

หากเป็น ubuntu ให้แก้ไขแฟ้ม /etc/freeradius/radiusd.conf
หากเป็น fedora ให้แก้ไขแฟ้ม /etc/raddb/radiusd.conf
ส่วนของ modules {...} ที่บริเวณข้อความ files {...}
...
ให้เพิ่ม module ใหม่ โดยแทรกบรรทัดข้อความว่า
files myimap {
usersfile = /root/myusers
}

ส่วนของ authorize {...} ที่บริเวณข้อความขึ้นต้นด้วย authorize {
...
แทรกเพิ่มบรรทัดข้อความเพิ่ม กลายเป็นว่า
myimap

เสร็จแล้วให้สั่งทำงานใหม่
หากเป็น ubuntu ใช้คำสั่ง /etc/init.d/freeradius reload
หากเป็น fedora ใช้คำสั่ง /etc/init.d/radiusd reload
แค่นี้ก็เสร็จแล้ว ทดสอบผลงานได้เลย


ถ้าต้องการให้ใช้ได้กับ LDAP ด้วย
หากเป็น ubuntu ต้องติดตั้ง freeradius-ldap เพิ่มเติม
ด้วยคำสั่ง apt-get install freeradius-ldap
แล้วให้แก้ไขแฟ้ม /etc/freeradius/radiusd.conf

หากเป็น fedora ให้แก้ไขแฟ้ม /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 แก้ไขเพียงแค่นี้

เสร็จแล้วให้สั่งทำงานใหม่
หากเป็น ubuntu ใช้คำสั่ง /etc/init.d/freeradius reload
หากเป็น fedora ใช้คำสั่ง /etc/init.d/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

หากเป็น ubuntu แก้ไขแฟ้ม /etc/freeradius/radiusd.conf
หากเป็น fedora แก้ไขแฟ้ม /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

เสร็จแล้วให้สั่งทำงานใหม่
หากเป็น ubuntu ใช้คำสั่ง /etc/init.d/freeradius reload
หากเป็น fedora ใช้คำสั่ง /etc/init.d/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

เสร็จแล้วให้สั่งทำงานใหม่
หากเป็น ubuntu ใช้คำสั่ง /etc/init.d/freeradius reload
หากเป็น fedora ใช้คำสั่ง /etc/init.d/radiusd reload
แค่นี้ก็เสร็จแล้ว PC ที่ติดต่อเข้ามาจะได้รับคำตอบกลับไป
ระบุว่าเหลือเวลาใช้งานอีกเท่าไร ขึ้นกับตัวเลขทีกำหนดส่งออกมา
จากตัวอย่างให้แก้ไขตัวเลข 120 เป็นอื่นๆตามต้องการ


แนะนำให้ยกเลิกการกำหนดค่าการทำงานบางตัวที่ไม่ได้ใช้งาน
โดยการ comment บรรทัดข้อความในแฟ้ม
หากเป็น ubuntu คือแฟ้ม /etc/freeradius/radiusd.conf
หากเป็น fedora คือแฟ้ม /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 จะบันทึกไว้ในพื้นที่
หากเป็น ubuntu อยู่ที่ /var/log/freeradius/radacct
หากเป็น fedora อยู่ที่ /var/log/radius/radacct
โดยแยกเป็น directory ของแต่ละหมายเลข ip ของ radius client
แล้วยังแตกย่อยออกเป็นแฟ้มของแต่วันอีก ซึ่งอาจไม่สะดวกต่อการวิเคราะห์ข้อมูล
เราสามารถเพิ่ม module บันทึกประวัติการใช้งานเพิ่มเติมจากของเดิม ตัวอย่างคือ
ต้องการบันทึกไว้ใน directory ชื่อ /var/log/freeradius/myaccount หรือ /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;6
1

ให้ทำดังนี้ สร้างแฟ้มคำสั่ง shell script ชื่อ /root/log-radius-account.sh มีเนื้อหาว่า
#!/bin/sh
export LANG=en.US
###
mydir=\"/var/log/freeradius/myaccount\"
## หากเป็น fedora เปลี่ยนเป็น 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
_SES
SION_TIME\" >> $myfile

แฟ้ม shell script จบแค่นี้ ต่อไปแก้ไขแฟ้ม radiusd.conf
หากเป็น ubuntu แก้ไขแฟ้ม /etc/freeradius/radiusd.conf
หากเป็น fedora แก้ไขแฟ้ม /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

เสร็จแล้วให้สั่งทำงานใหม่
หากเป็น ubuntu ใช้คำสั่ง /etc/init.d/freeradius reload
หากเป็น fedora ใช้คำสั่ง /etc/init.d/radiusd reload

---------------------------------------------------------------------------------
ขอขอบคุณ : http://www.thaibsd.com/webboard/show.php?Category=thaibsd&No=16193