ติดตั้ง packetfence บน ubuntu

จาก Wiki Opensource

บันทึกนี้ปรับปรุงล่าสุดเมื่อ 24-07-2551

ดูแลโดย WIPAT


  • ต้นฉบับทดสอบกับ ubuntu 6.06.2 และ packetfence 1.6.2
  • ต้นฉบับ packetfence อยู่ที่ http://www.packetfence.org


  1. ติดตั้งชุดเครื่องมือ ด้วยคำสั่ง sudo apt-get install build-essential libssl0.9.7 nmap

  2. ติดตั้ง mysql server ด้วยคำสั่ง sudo apt-get install mysql-server
    แล้วอย่าลืมตั้ง password ของ mysql server ด้วยคำสั่งตัวอย่าง
    mysqladmin -u root password "mysqldroot"

  3. ติดตั้ง apache และ php ด้วยคำสั่ง
    sudo apt-get install apache2 libapache2-mod-proxy-html libapache2-mod-auth-plain
    sudo apt-get install libapache2-mod-php5 php-pear php5-mysql php5-gd

    แก้ไขแฟ้ม /etc/php5/apache2/php5.ini ให้ timezone ถูกต้อง
    ตั้งค่าตัวแปรว่า date.timezone = Asia/Bangkok

    ให้หยุดการทำงานของ apache ด้วยคำสั่ง sudo /etc/init.d/apache2 stop
    และตั้งค่าไม่ให้ apache ทำงานทุกครั้งที่ boot ด้วยคำสั่ง sudo update-rc.d -f apache2 remove

  4. ติดตั้ง perl ด้วยคำสั่ง
    sudo apt-get install perl-suid libterm-readkey-perl libconfig-inifiles-perl libnet-netmask-perl libparse-recdescent-perl libnet-rawip-perl libtimedate-perl libwww-perl

  5. ติดตั้ง IPTables::IPv4 ให้ดาวน์โหลดแฟ้มจาก ftp://ftp.psu.ac.th/pub/packetfence/IPTables-IPv4-0.98.tar.gz
    ด้วยคำสั่ง wget ftp://ftp.psu.ac.th/pub/packetfence/IPTables-IPv4-0.98.tar.gz
    แตกแฟ้มด้วยคำสั่ง tar -zxvf IPTables-IPv4-0.98.tar.gz  -C /tmp
    เข้าไปทำงานต่อด้วยคำสั่ง
    cd /tmp/IPTables-IPv4-0.98
    sudo perl Makefile.PL
    sudo make
    sudo make test
    sudo make install

  6. ติดตั้ง packetfence ให้ดาวน์โหลดแฟ้ม ftp://ftp.psu.ac.th/pub/packetfence/packetfence-1.6.2.tar.gz
    ด้วยคำสั่ง wget ftp://ftp.psu.ac.th/pub/packetfence/packetfence-1.6.2.tar.gz
    แล้วแตกแฟ้มออกมาด้วยคำสั่ง sudo tar -zxvf packetfence-1.6.2.tar.gz -C /usr/local
    จะได้ packetfence อยู่ที่ /usr/local/pf
    เข้าไปทำงานต่อด้วยคำสั่ง cd /usr/local/pf
    สั่งให้ iptables ทำงานด้วยคำสั่ง sudo modprobe ip_tables
    แล้วสั่งชุดตั้งทำงานด้วยคำสั่ง sudo ./installer.pl ได้ข้อความประมาณว่า

    PacketFence has not been tested on your system would you like to continue? [y|n]
    ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    Please enter the full path to your RPM updater: ให้กด Enter ได้ข้อความประมาณว่า

    DISCLAIMER
    By your use of this software, you recognize and agree that this software is
    provided 'as is' without warranty of any kind. The authors do not make any
    warranties, expressed or implied, including but not limited to implied
    warranties of merchantability and fitness for any particular purpose, with
    respect to this software. In no event shall the authors be liable for any
    incidental, consequential, or other damages whatsoever (including without
    limitation, damages for loss of critical data, loss of profits, interruption
    of business, etc) arising out of the use or inability to use this software.

    Sorry for the legalese...do you agree? [y|n]  ให้ป้อน y แล้วกด Enter

    PacketFence prefers to run as user 'pf' - can I create it? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    Creating account
    Locking account
    Password changed.
    Do you plan on using Nessus to scan client systems? [y|n] ให้ป้อน n แล้วกด Enter ได้ข้อความประมาณว่า

    PacketFence requires a MySQL server as a backend. Would you like to install it locally? [y|n]
    ให้ป้อน n แล้วกด Enter ได้ข้อความประมาณว่า
    Host [localhost]: ให้กด Enter ได้ข้อความประมาณว่า
    Port [3306]: ให้กด Enter ได้ข้อความประมาณว่า
    Database [pf]: ให้กด Enter ได้ข้อความประมาณว่า
    PF needs to set the MySQL administrator password - is that ok? (answer 'Y' only if this is a new MySQL install) [y|n]
    ให้ป้อน n แล้วกด Enter ได้ข้อความประมาณว่า

    Current Password: ให้ป้อนรหัสผ่านของ mysql server เข้าไป ในตัวอย่างนี้คือ mysqld root แล้วกด Enter ได้ข้อความประมาณว่า

    PF needs to create the PF database - is that ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    Loading schema
    PF needs to create a database user to access the PF database - is that ok? [y|n]
    ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    Can I use 'pf' as the username? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    Password: ให้ป้อนตั้งรหัสผ่านสำหรับ pf เข้าไป ตัวอย่างนี้ตั้งว่า 123456 แล้วกด Enter ได้ข้อความประมาณว่า
    Confirm: เป็นการทวนรหัสผ่าน ให้ป้อนรหัสผ่านเดิมซ้ำ ตัวอย่างนี้คือ 123456 แล้วกด Enter ได้ข้อความประมาณว่า

    ** NOTE: AFTER RUNNING THE CONFIGURATOR, BE SURE TO CHECK THAT /usr/local/pf/conf/pf.conf
    REFLECTS YOUR MYSQL CONFIGURATION:
    - HOST: localhost
    - PORT: 3306
    - USER: pf
    - PASS: 123456
    - DB : pf
    Can't exec "rpm": No such file or directory at ./installer.pl line 382, <STDIN> line 16.
    Use of uninitialized value in pattern match (m//) at ./installer.pl line 382, <STDIN> line 16.
    sh: rpm: command not found
    PF needs several Perl modules to function properly. May I download and install them? [y|n]
    ให้ป้อน n แล้วกด Enter ได้ข้อความประมาณว่า

    Setting permissions
    Chowning /usr/local/pf pf:pf
    Chowning /usr/local/pf/bin/pfcmd root:root and setting SGID bits
    .......
    Would you like me to create an account for the web administrative interface?
    ** NOTE: this will overwrite any existing accounts ** [y|n]
    ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    Username [admin]: ให้กด Enter ได้ข้อความประมาณว่า

    New password: ให้ป้อนตั้งรหัสผ่านสำหรับ admin เข้าไป ตัวอย่างนี้ตั้งว่า 123456 แล้วกด Enter ได้ข้อความประมาณว่า

    Re-type new password: เป็นการทวนรหัสผ่าน ให้ป้อนรหัสผ่านเดิมซ้ำ ตัวอย่างนี้คือ 123456 แล้วกด Enter ได้ข้อความประมาณว่า

    Adding password for user admin
    Installation is complete
    ** Please run cd /usr/local/pf && ./configurator.pl before starting PacketFence **

    เป็นอันว่าเสร็จขั้นตอนติดตั้ง packetfence


  7. ต่อไปสร้าง ssl certificate ดังนี้
    cd /tmp
    openssl req -new > packetfence.csr ได้ข้อความประมาณว่า
    Generating a 1024 bit RSA private key
    ..................................++++++
    .........................++++++
    writing new private key to 'privkey.pem'
    Enter PEM pass phrase: ให้ป้อน key ตัวอย่างนี้ป้อนว่า 1234 แล้วกด Enter ได้ข้อความประมาณว่า

    Verifying - Enter PEM pass phrase: เป็นการทวนรหัสผ่าน ให้ป้อนรหัสผ่านเดิมซ้ำ ตัวอย่างนี้คือ 1234 แล้วกด Enter ได้ข้อความประมาณว่า
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]: ให้กด Enter ได้ข้อความประมาณว่า

    State or Province Name (full name) [Some-State]: ให้ป้อนเครื่องหมายจุด . แล้วกด Enter ได้ข้อความประมาณว่า

    Locality Name (eg, city) []: ให้ป้อนเครื่องหมายจุด . แล้วกด Enter ได้ข้อความประมาณว่า

    Organization Name (eg, company) [Internet Widgits Pty Ltd]: ให้ป้อนเครื่องหมายจุด . แล้วกด Enter ได้ข้อความประมาณว่า

    Common Name (eg, YOUR name) []: ให้ป้อนเครื่องหมายจุด . แล้วกด Enter ได้ข้อความประมาณว่า

    Email Address []: ให้ป้อนเครื่องหมายจุด . แล้วกด Enter ได้ข้อความประมาณว่า

    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []: ให้กด Enter ได้ข้อความประมาณว่า

    An optional company name []: ให้กด Enter

    แล้วต่อด้วยคำสั่ง openssl rsa -in privkey.pem -out server.key ได้ข้อความประมาณว่า
    Enter pass phrase for privkey.pem: ให้ป้อน key ที่ใช้ ตัวอย่างนี้ป้อนว่า 1234 แล้วกด Enter ได้ข้อความประมาณว่า

    writing RSA key แสดงว่าถูกต้องใช้ได้แล้ว

    ต่อด้วยคำสั่ง openssl x509 -in packetfence.csr -out server.crt -req -signkey server.key -days 365
    sudo mv server.crt /usr/local/pf/conf/ssl/
    sudo mv server.key /usr/local/pf/conf/ssl/
    rm -f packetfence.csr privkey.pem

  8. ต่อไปสร้างต้นแบบแฟ้ม /usr/local/pf/conf/pf.conf ดังนี้
    cd /usr/local/pf
    sudo ./configurator.pl ได้ข้อความประมาณว่า
    Checking existing configuration...
    No existing configuration found
    Would you like to use a template configuration or custom [t|c] ให้ป้อน t แล้วกด Enter ได้ข้อความประมาณว่า

    Which template would you like:
    1) Test mode
    2) Registration
    3) Detection
    4) Registration & Detection
    5) Registration, Detection & Scanning
    6) Session-based Authentication
    Answer: [1|2|3|4|5]: [1|2|3|4|5|6]
    ให้ป้อน 2 แล้วกด Enter ได้ข้อความประมาณว่า

    Setting option dhcpdetector to template value enabled
    Setting option mode to template value passive
    Setting option isolation to template value disabled
    Setting option testing to template value enabled
    Setting option detection to template value enabled
    Setting option registration to template value disabled
    Setting option auth to template value local
    Setting option skip_mode to template value window
    Setting option skip_window to template value 2w
    Setting option aup to template value disabled
    Setting option skip_reminder to template value 1d
    Loading Template: Warning PacketFence is going LIVE - WEAPONS HOT

    ** NOTE: The configuration can be a bit tedious. If you get bored, you can always just edit /usr/local/pf/conf/pf.conf directly **

    GENERAL CONFIGURATION
    Domain (default: <NONE> [?]): ให้กด Enter ได้ข้อความประมาณว่า
    <NONE> - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    Hostname (default: yourhostname [?]): ให้กด Enter ได้ข้อความประมาณว่า
    yourhostname - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    DNS Servers (comma delimited) (default: 192.100.77.5 [?]): ให้กด Enter ได้ข้อความประมาณว่า
    192.100.77.5 - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    DHCP Servers (comma delimited) (default: 127.0.0.1 [?]): ให้กด Enter ได้ข้อความประมาณว่า
    127.0.0.1 - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    What is my management interface? (default: eth0) [eth0|?]: ให้กด Enter ได้ข้อความประมาณว่า
    eth0 - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    What is its IP address? (default: 10.0.0.3 [?]): ให้กด Enter ได้ข้อความประมาณว่า
    10.0.0.3 - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    What is its mask? (default: 255.255.255.0 [?]): ให้กด Enter ได้ข้อความประมาณว่า
    255.255.255.0 - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    What is my gateway? (default: 10.0.0.1 [?]): ให้กด Enter ได้ข้อความประมาณว่า
    10.0.0.1 - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    TRAPPING CONFIGURATION
    ALERTING CONFIGURATION
    Where would you like notifications of traps, rogue DHCP servers, and other sundry goods sent? (default: pf@localhost [?]):
    ให้กด Enter ได้ข้อความประมาณว่า
    pf@localhost - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    What should I use as my SMTP relay server? (default: localhost [?]): ให้กด Enter ได้ข้อความประมาณว่า
    localhost - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    DATABASE CONFIGURATION
    Where is my database server? (default: localhost [?]): ให้กด Enter ได้ข้อความประมาณว่า
    localhost - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    What port is is listening on? (default: 3306 [?]): ให้กด Enter ได้ข้อความประมาณว่า
    3306 - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    What database should I use? (default: pf [?]): ให้กด Enter ได้ข้อความประมาณว่า
    pf - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    What account should I use? (default: pf [?]): ให้กด Enter ได้ข้อความประมาณว่า
    pf - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    What password should I use? (default: packet [?]): ให้ป้อนรหัสผ่าน database ของ pf
    ในตัวอย่างนี้ให้ป้อน 123456 แล้วกด Enter ได้ข้อความประมาณว่า
    123456 - ok? [y|n] ให้ป้อน y แล้วกด Enter ได้ข้อความประมาณว่า

    Please review conf/pf.conf to correct any errors or change pathing to daemons
    After starting PF, use bin/pfcmd or the web interface (https://ubuntu.:1443) to administer the system
    Committing settings...
    Enjoy!
    เป็นอันได้ต้นแบบ configuration ของ pf แล้วหากใส่ข้อมูลผิดพลาด
    ขอแนะนำให้ลบแฟ้มข้อมูล /usr/local/pf/conf/pf.conf ทิ้ง แลัวสั่ง sudo ./configurator.pl ใหม่

  9. ปรับแต่งแฟ้ม /usr/local/pf/conf/pf.conf ให้เป็นดังนี้
    แก้ไขบรรทัดจากเดิม domain= เป็น domain=3
    แก้ไขบรรทัดจากเดิ hostname=yourhostname เป็น hostname=10.0.0
    *** ต้องแก้ไขพิเศษ เพราะใช้ ip 10.0.0.3
    เติมต่อจากบรรทัดสุดท้ายว่า
    [services]
    httpd=/usr/sbin/apache2


  10. สร้าง directory เพิ่มเติมด้วยคำสั่ง sudo mkdir -p /usr/lib/apache2/logs
    แล้วปรับแต่งแฟ้ม /usr/local/pf/conf/templates/httpd.conf ให้มีดังนี้

    เพิ่มบรรทัดว่า ServerRoot /usr/lib/apache2

    แล้วไปที่ประมาณบรรทัดที่ 80 ให้แก้ไขจากเดิม
    <IfModule !sapi_apache2.c>
    #LoadModule php5_module modules/libphp5.so
    LoadModule php4_module modules/libphp4.so
    </IfModule> กลายเป็น
    <IfModule !sapi_apache2.c>
    LoadModule php5_module modules/libphp5.so
    #LoadModule php4_module modules/libphp4.so
    </IfModule>

  11. สั่งให้ packetfence ทำงานด้วยคำสั่ง
    sudo modprobe ip_tables
    sudo /usr/local/pf/bin/pfcmd control pf start  ได้ข้อความประมาณว่า
    Checking configuration sanity...
    service|command
    config files|start
    iptables|start
    httpd|start
    pfmon|start
    แสดงว่าใช้งานได้แล้ว ให้ลองใช้ browser เข้าไปที่ https://10.0.0.3:1443
    แล้ว login เข้าไปด้วย username และ password ของ admin

  12. สั่งให้ packetfence หยุดทำงานด้วยคำสั่ง sudo /usr/local/pf/bin/pfcmd control pf stop

  13. ตัวอย่างคำสั่ง
    ดู network card ที่มีตรวจสอบเจอทั้งหมด /usr/local/pf/bin/pfcmd node view all
    ขึ้นทะเบียน /usr/local/pf/bin/pfcmd node edit 00:11:5b:5e:1c:57 status="reg",pid=1
    ยกเลิกการขึ้นทะเบียน /usr/local/pf/bin/pfcmd node edit 00:11:5b:5e:1c:57 status="unreg"

  14. การให้ authen กับ radius ต้องทำดังนี้  ให้ติดตั้ง mod_auth_radius ก่อน
    ดาวน์โหลด mod_auth_radius  จาก ftp://ftp.psu.ac.th/pub/freeradius/mod_auth_radius-1.5.7.tar
    ด้วยคำสั่ง wget ftp://ftp.psu.ac.th/pub/freeradius/mod_auth_radius-1.5.7.tar
    แตกแฟ้มด้วยคำสั่ง tar -xf mod_auth_radius-1.5.7.tar  -C /tmp
    เข้าไปทำงานต่อด้วยคำสั่ง
    cd /tmp/mod_auth_radius-1.5.7
    sudo apxs -i -a -c mod_auth_radius-2.0.c

    แล้วแก้ไขแฟ้ม /usr/local/pf/conf/templates/httpd.conf
    ไปที่ประมาณบรรทัด 262 ต่อจากบรรทัดข้อความว่า
    <IfModule !mod_auth.c>
      LoadModule auth_module modules/mod_auth.so
    </IfModule>
    ให้เพิ่มบรรทัดข้อความว่า
    <IfModule !mod_auth_radius-2.0.c>
      LoadModule radius_auth_module modules/mod_auth_radius-2.0.so
    </IfModule>

    ต่อไปให้แก้ไขแฟ้ม /usr/local/pf/conf/templates/radius.conf เป็นประมาณตัวอย่างว่า
    <IfModule mod_auth_radius-2.0.c>
    AddRadiusAuth localhost testing123 10
    <Location "/cgi-bin/register-radius.cgi">
      AuthType Basic
      AuthName "RADIUS"
      AuthAuthoritative off
      AuthRadiusAuthoritative on
      require valid-user
    </Location>
    </IfModule>
    สั่งให้ packetfence หยุดทำงานด้วยคำสั่ง sudo /usr/local/pf/bin/pfcmd control pf stop
    แล้วสั่งให้ packetfence ทำงานใหม่ด้วยคำสั่ง sudo /usr/local/pf/bin/pfcmd control pf start

  15. ---ทดสอบ patch สำหรับ arp mode บน packetfence 1.8.7
    แก้ไขแฟ้ม /usr/local/pf/sbin/pfmon

    ไปประมาณบรรทัดที่ 455 ระหว่างข้อความว่า
            $newflag = 1 if ( !$violations{$mac} );
        }
    ..... แทรกข้อความเพิ่มที่นี่
        # update the violations hash for other threads
        {
     
    บรรทัดข้อความที่ต้องแทรกเพิ่มคือ
      # This will be a violation (event) someday
      #
      if (isenabled($Config{'trapping'}{'registration'})) {
        my @unregistered = nodes_active_unregistered();

        # Add unregistered to violation array
        #
        my $maxsize = $Config{'registration'}{'queuesize'} || 0;
        my $total=0;
        for my $row (@unregistered) {
            my $mac = $row->{'mac'};
            my $ip = $row->{'ip'};
            if (reggable_ip($ip) && trappable_ip($ip) && trappable_mac($mac) &&
    !$new_violations{$mac}){
              $logger->info("adding unreged $mac ($ip) to violations",8);
              push @violators, $row;
              $new_violations{$mac}=$ip;
              $newflag=1 if (!$violations{$mac});
              last if ($maxsize>0 && $total++ == $maxsize);
            }
        }
      }

    แล้วไปประมาณบรรทัดที่ 700 ใต้ข้อความว่า
           if ( isenabled( $Config{'arp'}{'cleanshutdown'} ) ) {
                my @violators = violation_view_all_active();
    ... แทรกข้อความเพิ่มที่นี่
                foreach my $violator (@violators) {
                    freemac( $violator->{'mac'} );
          
    บรรทัดข้อความที่ต้องแทรกเพิ่มคือ
          if (isenabled($Config{'trapping'}{'registration'})) {
            my @unregistered = nodes_active_unregistered();
            push @violators, @unregistered;
          }