การติดตั้ง radius server ด้วยโปรแกรม freeradius


การติดตั้ง radius server ด้วยโปรแกรม freeradius

การติดตั้ง radius server ด้วยโปรแกรม freeradius

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

  1. ติดตั้งโปรแกรม freeradius ด้วยคำสั่ง
    yum install freeradius

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

  3. สั่งให้ทำงานด้วยคำสั่งว่า
    service  radiusd  start
    Starting RADIUS server:                                     [  OK  ]

  4. ตรวจสอบว่าโปรแกรมทำงานแล้วด้วยคำสั่ง
    service  radiusd  status
    ได้ผลออกมาดังตัวอย่าง
    radiusd (pid 19180) is running...

  5. แฟ้มที่เกี่ยวข้อง
    • /var/log/radius/radius.log
    • /etc/raddb/radiusd.conf
    • /etc/raddb/clients.conf

  6. เมื่อให้ 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 ของระบบ

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

    หากต้องการให้ใช้กับบัญชีผู้ใช้ระบบ 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 ถูกต้องตามต้องการ

  8. หากต้องการให้ 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 ได้แล้ว

  9. ขั้นตอนการทำงานของ 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 {...}

  10. *** แนะนำให้ทำขั้นตอนนี้ด้วย เลิกใช้ 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 แสดงว่าถูกต้องตามต้องการแล้ว

  11. หากต้องการตรวจสอบผู้ใช้กับ 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
    แค่นี้ก็เสร็จแล้ว ทดสอบผลงานได้เลย

  12. หากต้องการให้ใช้ได้ดับ 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 ได้เลย

  13. หากต้องการตรวจสอบผู้ใช้กับฐานข้อมูลพิเศษของตนเอง

    ต้องสร้างแฟ้มแบบ 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
    แค่นี้ก็เสร็จแล้ว ทดสอบผลงานได้เลย

  14. 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 เป็นอื่นๆตามต้องการ

  15. แนะนำให้ยกเลิกการกำหนดค่าการทำงานบางตัวที่ไม่ได้ใช้งาน
    โดยการ 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

  16. การบันทึกประวัติการใช้งานของ 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

  17. การแสดงผลรายงานจำเป็นต้องหาโปรแกรมมาต่างหาก
    ขอแนะนำตัวอย่างโปรแกรมแสดงผลรายงาน
    • ต้นแหล่งข้อมูลคือ 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
หมายเลขบันทึก: 107639เขียนเมื่อ 30 มิถุนายน 2007 17:20 น. ()แก้ไขเมื่อ 23 มิถุนายน 2012 13:14 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (1)
พอดีทำบริการ Radius Server พร้อมระบบจัดการ เลยมาแนะนำคับ http://www.easyzonecorp.net - Radius Server and Billing Module
พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท