請使用LDAP單一帳號登入

建置支援LDAP認證的FTP SERVER(vsftp on centos 7)

臺中市立外埔國民中學 資訊組長 郭特全 20151012修正

 

1.安裝 centos 7 (略)。

2.為避免干擾,先暫時關閉 SELINUX 和防火牆功能。

  編輯  /etc/selinux/config 這個檔案,將

  SELINUX=enforce

  修改成:

  SELINUX=disabled

  並註記掉(前面加#號就是宣告本行為註解)以下這行:

  #SELINUXTYPE=targeted

  存檔後離開,下次開機後就生效。

  檢查selinux狀態的指令:

  sestatus

  關閉防火牆:

  裝完系統之後預設是開啟的,所以要先關閉,執行以下指令:

  systemctl stop firewalld

  然後讓系統開機時不啟動防火牆,執行以下指令:

  systemctl disable firewalld

  第一次執行會看到以下兩行:

  rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
  rm '/etc/systemd/system/basic.target.wants/firewalld.service'

  設定完之後重開機,執行指令:

  reboot

  系統重開之後將不會執行selinux與防火牆功能。

3.當然要安裝 vsftpd

  # yum -y install vsftpd

4.安裝LDAP認證模組。

  # yum -y install nss-pam-ldapd.x86_64

5.設定LDAP認證模組連結參數。

    方法一:

     # authconfig-tui

2015101201

 

2015101202

 

     方法二:

     # vi /etc/nslcd.conf

  注意3個地方

  uri ldap://163.17.***.***

  base dc=***,dc=***

  ssl no

  重啟 vsftpd

  # systemctl restart vsftpd.service

6.本校FTP啟用匿名登入(系統預設匿名登入資料夾 /var/ftp/pub),作為繳交作業用途。vsftpd 所有重要的設定參數在 /etc/vsftpd/vsftpd.conf

  重要的設定值如下:

  anonymous_enable=YES

  local_enable=YES

  write_enable=YES

  local_umask=022

  anon_upload_enable=YES

  anon_mkdir_write_enable=YES

  chroot_local_user=YES

  pam_service_name=vsftpd
  userlist_enable=YES
  tcp_wrappers=YES

  pasv_enable=YES
  pasv_min_port=0
  pasv_max_port=0

  allow_writeable_chroot=YES
  anon_umask=022

 7.據搜尋到的資料,在 centos 5.8 的 vsftp, 當使用者初次LDAP認證登入時,會自動建立使用者家目錄,但在 centos 6 和 centos 7 卻不行,網路上是有人提供解決方法,但經實測無效。

  山不轉路轉,因為自己會一些PHP,改用PHP達成任務,並提供更進階功能,故需安裝 php 和 php-ldap ,提供 php 執行環境和 LDAP 連結函式。

  # yum -y install php php-ldap

 8.自行撰寫PHP程式如下:

  產生教職員LDAP帳號的FTP家目錄(tea_mkdir.php)

   <?php

     //以下4項資訊依 LDAP server 實際狀況填寫
     $IP="***.***.***.***:389" ;
     $tea_dn="ou=***,dc=***,dc=***" ;
     $rootdn="cn=***,dc=***,dc=***" ;
     $rootpw="***" ;

     $ds=ldap_connect("$IP");
     ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

     if (ldap_bind($ds,$rootdn ,$rootpw))
       {
          $result = ldap_search($ds, $tea_dn,"(cn=*)", array('cn'));
          $entry = ldap_get_entries($ds, $result);
          for ($i=0 ; $i < count($entry) ; $i++)
             {
                $target_dir = "/home/users/".$entry[$i]['cn'][0] ;
                if (!is_dir($target_dir))
                  {
                     mkdir($target_dir, 0777);
                     chown($target_dir, $entry[$i]['cn'][0]);
                     chgrp($target_dir, "teacher");
                  }
             }
      }

   ?>

   產生學生LDAP帳號的FTP家目錄(stu_mkdir.php)

   <?php

    //以下4項資訊依 LDAP server 實際狀況填寫
          $IP="***.***.***.***:389" ;
    $stu_dn="ou=***,dc=***,dc=***" ;
          $rootdn="cn=***,dc=***,dc=***" ;
    $rootpw="***" ;

    $ds=ldap_connect("$IP");
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

    if (ldap_bind($ds,$rootdn ,$rootpw))
      {
         $result = ldap_search($ds, $stu_dn,"(cn=*)", array('cn'));
         $entry = ldap_get_entries($ds, $result);
         for ($i=0 ; $i < count($entry) ; $i++)
            {
              $target_dir = "/home/users/".$entry[$i]['cn'][0] ;
              if (!is_dir($target_dir))
                {
                   mkdir($target_dir, 0777);
                   chown($target_dir, $entry[$i]['cn'][0]);
                   chgrp($target_dir, "student");
                }
            }
      }

  ?>

    刪除非在職教職員和非在學學生的FTP家目錄(del_dir.php)

  <?php

    function deleteDirectory($dir) {
        if (!file_exists($dir)) return true;
        if (!is_dir($dir) || is_link($dir)) return unlink($dir);
        foreach (scandir($dir) as $item) {
        if ($item == '.' || $item == '..') continue;
          if (!deleteDirectory($dir . "/" . $item)) {
             chmod($dir . "/" . $item, 0777);
             if (!deleteDirectory($dir . "/" . $item)) return false;
             };
           }
         return rmdir($dir);
        }

          //以下5項資訊依 LDAP server 實際狀況填寫
          $IP="***.***.***.***:389" ;

          $tea_dn="ou=***,dc=***,dc=***" ;
    $stu_dn="ou=***,dc=***,dc=***" ;
          $rootdn="cn=***,dc=***,dc=***" ;
    $rootpw="***" ;

       

    $ds=ldap_connect("$IP");
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

    if (ldap_bind($ds,$rootdn ,$rootpw))
      {
         $tea_result = ldap_search($ds, $tea_dn,"(cn=*)", array('cn'));
         $tea_entry = ldap_get_entries($ds, $tea_result);
         $stu_result = ldap_search($ds, $stu_dn,"(cn=*)", array('cn'));
         $stu_entry = ldap_get_entries($ds, $stu_result);

      }

 

    for ($i=0 ; $i < count($tea_entry) ; $i++)
       {
          $entry[] = $tea_entry[$i]['cn'][0] ;
       }
    for ($j=0 ; $j < count($stu_entry) ; $j++)
       {
          $entry[] = $stu_entry[$j]['cn'][0] ;
       }

    $dirs_files = glob("/home/users/*");
    foreach ($dirs_files as $values)
      {
         if (is_dir($values))
           {
              if (!in_array(substr($values,12), $entry))
                {
                   deleteDirectory($values) ;
                }
           }
      }


  ?>

   另外在匿名登入部分,新增2程式用來刪除學生胡亂新增的目錄和檔案,及刪除過時限的檔案。

  del_anony_dir.php

  <?php

    function deleteDirectory($dir) {
         if (!file_exists($dir)) return true;
         if (!is_dir($dir) || is_link($dir)) return unlink($dir);
         foreach (scandir($dir) as $item) {
         if ($item == '.' || $item == '..') continue;
         if (!deleteDirectory($dir . "/" . $item)) {
           chmod($dir . "/" . $item, 0777);
           if (!deleteDirectory($dir . "/" . $item)) return false;
            };
           }
         return rmdir($dir);
       }

    $exclude[0] = "***老師專區" ;
    $exclude[1] = "***老師專區" ;
    $dirs_files = glob("/var/ftp/pub/*");
    foreach ($dirs_files as $values)
       {
          if (is_dir($values))
            {
               if (!in_array(substr($values,13), $exclude))
                 {
                    deleteDirectory($values) ;
                 }
            } else if (is_file($values))
                     {
                        unlink($values) ;
                     }
       }

    ?>

  del_anony_expire.php

 <?php
   date_default_timezone_set('Asia/Taipei');

   function deleteDirectory($dir) { 
        if (!file_exists($dir)) return true;
        if (!is_dir($dir) || is_link($dir)) return unlink($dir);
        foreach (scandir($dir) as $item) {
        if ($item == '.' || $item == '..') continue;
          if (!deleteDirectory($dir . "/" . $item)) {
            chmod($dir . "/" . $item, 0777);
          if (!deleteDirectory($dir . "/" . $item)) return false;
            };
          }
        return rmdir($dir);
       }

   //檔案或目錄保存天數 $period
   $period = 180 ;
   $d1 = strtotime(date("Y-m-d")) ;

   $dirs_files = glob("/var/ftp/pub/***老師專區/*") ;
   foreach ($dirs_files as $values)
      {
          $filedate = date("Y-m-d", filemtime($values)) ;
          $d2 = strtotime($filedate) ;
          $Days = round(($d1-$d2)/3600/24) ;
          if ($Days > $period)
            {
              if (is_dir($values))
                {
                   deleteDirectory($values) ;
                } else if (is_file($values))
                         {
                            unlink($values) ;
                         }
            }
      }

   $dirs_files = glob("/var/ftp/pub/***老師專區/*") ;
   foreach ($dirs_files as $values)
      {
         $filedate = date("Y-m-d", filemtime($values)) ;
         $d2 = strtotime($filedate) ;
         $Days = round(($d1-$d2)/3600/24) ;
         if ($Days > $period)
           {
             if (is_dir($values))
               {
                  deleteDirectory($values) ;
               } else if (is_file($values))
                        {
                          unlink($values) ;
                        }
           }
      }

  ?>

   將上列的PHP程式寫入排程執行

  # vi /etc/crontab

  10 * * * * root php /root/stu_mkdir.php
  15 * * * * root php /root/tea_mkdir.php
  20 1 1 * * root php /root/del_dir.php
  25 * * * * root php /root/del_anony_dir.php
  30 5 * * * root php /root/del_anony_expire.php

9.因本校學生FTP目錄,同時也是學生個人網站根目錄,故需安裝 apache 。

     # yum -y install httpd

  更改 apache 的預設目錄

  # vi /etc/httpd/conf/httpd.conf

     找到 DocumentRoot “/var/www/html” 這一段 #apache的根目錄
  把/var/www/html 這個目錄改為 /home/users (視各校情況)
  再找到 #定義 apache /var/www/html 這個區域

 

   把 /var/www/html 改成 /home/users (視各校情況)
  重啟 httpd
  # systemctl restart httpd.service

 

反霸凌、性侵害、性騷擾投訴信箱 :

No_Bully@wpjh.tc.edu.tw

受理本校學生、師長、家長,媒體及

民眾申訴或諮詢有關暴力霸凌、詐騙案件。

投訴專線 : (04)26833721 分機 222

本市反霸凌申訴專線電話為0800-580-995

教育部反霸凌專線:0800-200-885

學校資訊

電話:04-2683-3721

【處室分機】

傳真:04-2683-3759

網路電話:070-910-5330

校址:

43857 臺中市外埔區大同里外埔路999號

【位置圖】

GPS資訊

北緯:(24.332599)

東經:(120.649367)

網站維護 : 外埔國中資訊組 (04)26833721 #231

Friday the 3rd. PointLink.