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


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

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

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

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

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

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

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

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

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

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

  5. แฟ้มที่เกี่ยวข้อง
    หากเป็น 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

  6. เมื่อให้ 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 \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 ของระบบถูกต้องอยู่แล้ว
  7. ***  ควรทดสอบและปรับแต่งให้ถูกต้องตามหัวข้อนี้ให้เรียบร้อยก่อน จึงค่อยใช้งานจริง

    หากเป็น 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 ถูกต้องตามต้องการ

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

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

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

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

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

  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

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

  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

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

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

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

    ให้ทำดังนี้ สร้างแฟ้มคำสั่ง 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_SESSION_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 
หมายเลขบันทึก: 196275เขียนเมื่อ 24 กรกฎาคม 2008 15:23 น. ()แก้ไขเมื่อ 23 มิถุนายน 2012 20:53 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (3)

"ใช้คำสั่ง apt-get install freeradius"

ใช้คำสั่งตรงไหน ของubuntu เหรอครับ มือใหม่วันนี้เอง

@porchn เปิด Terminal ขึ้นมาแล้วพิมพ์คำสั่งตามนั้นเลยครับ

สอบถาม freeradius ไม่เก็บ ประวัติ การเข้าใช้งานของuser ต้องทำงัยครับ ผมใช้ ubuntu 20 freeradius 3 daloradius ครับ

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท