FTP Server 的被動模式 – vsftpd FTP Server & Pure-FTPd FTP Server

vsftpd FTP Server 的被動模式
# vim /etc/vsftpd/vsftpd.conf
加入下面三行
pasv_enable=YES
pasv_min_port=60000
pasv_max_port=61000

重新啟動 vsftpd FTP Server
# service vsftpd restart
正在關閉 vsftpd:                                          [  確定  ]
正在啟動 vsftpd 中的 vsftpd:                              [  確定  ]
[@more@]

修改 Pure-FTPd FTP Server 設定檔
# vim /etc/pure-ftpd/pure-ftpd.conf
找到
# PassivePortRange          30000 50000
把前面的 # 刪除即可
PassivePortRange          60000 61000

重新啟動 Pure-FTPd FTP Server
# service pure-ftpd restart
正在停止 pure-ftpd:                                       [  確定  ]
正在啟動 pure-ftpd:                                       [  確定  ]

FTP Server 的被動模式 – ProFTP FTP Server

在測試 FTP Server 是否可以正常連線時,通常都是用指令模式來測試,後來在 Windows 平台上用 FileZilla / Xftp 時,才發現無法連線,測試一下,原來是 FTP Server 沒有設定成被動模式,而防火牆中也沒有開啟 FTP Server 被動模式所要用的 Port。
底下是以 FileZilla 做測試
在 FTP Server 和 iptables 防火牆沒做任何設定時

1. 使用預設模式
[@more@]
卡在 MLSD 很久

出現連線逾時,無法取得目錄列表的訊息

2. 改成主動模式

可以正常連線

3. 改成被動模式

卡在 MLSD

出現連線逾時,無法取得目錄列表的訊息

解決方式:
1. ProFTPd FTP Server 連線埠可以自訂
# vim /etc/proftpd.conf
PassivePorts                    60000   61000

重新啟動 FTP Server
# service proftpd restart
正在關閉 proftpd:                                         [  確定  ]
正在啟動 proftpd:                                         [  確定  ]

修改防火牆設定
# vim /etc/sysconfig/iptables
-A INPUT -m state –state NEW -m tcp -p tcp –dport 60000:61000 -j ACCEPT

重新啟動 iptables 防火牆
# service iptables stop
iptables:正在設定 chains 為 ACCEPT 政策:filter           [  確定  ]
iptables:正在清除防火牆規則:                             [  確定  ]
iptables:正在卸載模組:                                   [  確定  ]
# service iptables start
iptables:正在套用防火牆規則:                             [  確定  ]

檢查規則是否有產生
# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  —  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     icmp —  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  —  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:21
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpts:60000:61000
REJECT     all  —  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  —  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

這時候,應該都可以正常連線了!

ProFTPd FTP Server 使用 LDAP Server 認證

測試環境
LDAP Server IP:192.168.1.20
FTP Server:192.168.1.9

1. 安裝 proftpd proftpd-ldap 套件
# yum install proftpd proftpd-ldap –enablerepo=epel
[@more@]
2. 修改 ProFTPd FTP 設定檔
# vim /etc/proftpd.conf
SystemLog                       /var/log/proftpd/proftpd.log
PassivePorts                    60000   61000

# Use pam to authenticate (default) and be authoritative
#AuthPAMConfig                  proftpd
AuthOrder                       mod_ldap.c
#AuthOrder                      mod_auth_pam.c* mod_auth_unix.c
LoadModule mod_ldap.c
<IfModule mod_ldap.c>
LDAPServer 192.168.1.20
LDAPDNInfo “cn=Manager,dc=ldap,dc=tces.ilc.edu.tw” “123456”
##LDAPDoUIDLookups on “ou=Student,dc=ldap,dc=tces.ilc.edu.tw”
##LDAPDoGIDLookups on “ou=groups,dc=ldap,dc=tces.ilc.edu.tw”
LDAPDoAuth on “ou=Student,dc=ldap,dc=tces.ilc.edu.tw” “(&(uid=%v)(objectclass=posixAccount))”
LDAPSearchScope subtree

## Assign default IDs
LDAPDefaultUID 500
LDAPDefaultGID 500

## Create the home directory
LDAPGenerateHomedir on
LDAPGenerateHomedirPrefix /home/s0990
LDAPForceGeneratedHomedir on
CreateHome on

## Use different attribute names where necessary
#LDAPAttr uid sAMAccountName
#LDAPAttr gidNumber primaryGroupID
</IfModule>

3. 重新啟動 ProFTPd FTP Server
# service proftpd restart
Shutting down proftpd:                                     [  OK  ]
Starting proftpd:                                          [  OK  ]

在 LDAP Server 中的測試帳號 s0990999
# /usr/bin/ldapsearch -x -b “ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw” uid=s0990999
# extended LDIF
#
# LDAPv3
# base <ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=s0990135
# requesting: ALL
#

# s0990999, s0990, Student, ldap.tces.ilc.edu.tw
dn: uid=s0990999,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990999
cn:: 5Zub+gMjHlpbPpfoirPnkak=
sn:: 5Zub+gMjHlpbPpfoirPnkak=
mail: s0990999@tces.ilc.du.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword:: e2
loginShell: /sbin/nologin
uidNumber: 1322
gidNumber: 1073
homeDirectory: /home/s0990/s0990999
gecos:: 5Zub+gMjHlpbPpfoirPnkak=

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

4. 測試連線
# lftp -u s0990999 192.168.1.9
密碼:
lftp s0990999@192.168.1.9:~> ls
-rw-r–r–   1 s0990999 1073        73416 Jan  7 13:06 Pietty.reg
lftp s0990999@192.168.1.9:/>

5. 檢查使者的家目錄是否會自動建立
# ls -l /home/s0990
total 4
drwx——. 2 1322 1073 4096 Jan  7 20:53 s0990999

在 FTP Server 上也可以發現使用者的家目錄會自動建立

ProFTPd FTP Server 使用 MySQL 虛擬帳號

ProFTPd FTP Server 除了一般系統帳號之外,也支援 MySQL / LDAP 的虛擬帳號,底下是安裝及設定

安裝 MySQL
# yum install mysql mysql-server
安裝 ProFTPd FTP Server
# yum install proftpd proftpd-mysql –enablerepo=rpmforge

建立資料庫 proftpdb
# /usr/bin/mysqladmin -u root -p create proftpdb
建立虛擬群組 virtualgrp GID 501
# groupadd -g 501 virtualgrp
建立虛擬帳號 virtualuser UID 501
# useradd -g 501 -u 501 virtualuser
[@more@]
proftpd 資料庫的 ftpuser 資料表
# cat /root/users.sql
CREATE TABLE IF NOT EXISTS `ftpuser` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` varchar(32) COLLATE utf8_general_ci NOT NULL DEFAULT ”,
  `passwd` varchar(32) COLLATE utf8_general_ci NOT NULL DEFAULT ”,
  `uid` smallint(6) NOT NULL DEFAULT ‘501’,
  `gid` smallint(6) NOT NULL DEFAULT ‘501’,
  `homedir` varchar(255) COLLATE utf8_general_ci NOT NULL DEFAULT ”,
  `shell` varchar(16) COLLATE utf8_general_ci NOT NULL DEFAULT ‘/sbin/nologin’,
  PRIMARY KEY (`id`),
  UNIQUE KEY `userid` (`userid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT=’ProFTP user table’;
insert into ftpuser values (‘1′,’s0990001’,encrypt(‘123456′),’501′,’501′,’/home/virtualuser/s0990001′,’/sbin/nologin’);
insert into ftpuser values (‘2′,’s0990002’,encrypt(‘123456′),’501′,’501′,’/home/virtualuser/s0990002′,’/sbin/nologin’);

proftpd 資料庫的 ftpgroup 資料表
# cat /root/groups.sql
CREATE TABLE IF NOT EXISTS `ftpgroup` (
  `groupname` varchar(16) COLLATE utf8_general_ci NOT NULL,
  `gid` smallint(6) NOT NULL DEFAULT ‘5500’,
  `members` varchar(16) COLLATE utf8_general_ci NOT NULL,
  KEY `groupname` (`groupname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT=’ProFTP group table’;
insert into ftpgroup values (‘virtualgrp’,’501′,’s0990001′);
insert into ftpgroup values (‘virtualgrp’,’501′,’s0990002′);

匯入資料表 ftpuser
# /usr/bin/mysql -u root -p proftpdb < /root/users.sql
匯入資料表 ftpgroup
# /usr/bin/mysql -u root -p proftpdb < /root/groups.sql
指定 proftpdb 的管理 proftpd 密碼是 proftpdpass
# /usr/bin/mysql -u root -p -e “GRANT ALL PRIVILEGES ON proftpdb.* TO ‘proftpd’@’localhost’ IDENTIFIED BY ‘proftpdpass’;”

修改 ProFTPd FTP Server 設定檔 /etc/proftpd.conf
# vim /etc/proftpd.conf

AuthOrder                       mod_sql.c

<IfModule mod_dso.c>
   LoadModule mod_sql.c
   LoadModule mod_sql_mysql.c
#   LoadModule mod_sql_postgres.c
</IfModule>

  <IfModule mod_sql.c>

    # We need our “default” connection to the userdb database
    SQLConnectInfo proftpdb@localhost proftpd proftpdpass
    SQLBackend mysql
    SQLAuthTypes Backend Plaintext Crypt

    SQLAuthenticate on
    SQLMinUserUID 500
    SQLMinUserGID 500
    RequireValidShell off
    CreateHome on

    # Point mod_sql at our users/groups tables
    SQLUserInfo ftpuser userid passwd uid gid homedir shell
    SQLGroupInfo ftpgroup groupname gid members

  </IfModule>

測試設定檔語法是否正確
# proftpd -t
Checking syntax of configuration file
Syntax check complete.

重新啟動 ProFTPd FTP Server
# service proftpd restart
正在關閉 proftpd:                                         [  確定  ]
正在啟動 proftpd:                                         [  確定  ]

進行測試
# lftp -u s0990001 192.168.1.20
密碼:
lftp s0990001@192.168.1.20:~> ls
lftp s0990001@192.168.1.20:/>

在 Log 檔也可以看到相關記錄
# tail -f /var/log/proftpd/proftpd.log
Jan 04 13:35:15 . proftpd[3875] 192.168.1.20 (192.168.1.20[192.168.1.20]): FTP session opened.
Jan 04 05:35:15 . proftpd[3875] 192.168.1.20 (192.168.1.20[192.168.1.20]): Preparing to chroot to directory ‘/home/virtualuser/s0990001’
Jan 04 05:35:15 . proftpd[3875] 192.168.1.20 (192.168.1.20[192.168.1.20]): USER s0990001: Login successful.
Jan 04 05:35:25 . proftpd[3875] 192.168.1.20 (192.168.1.20[192.168.1.20]): FTP session closed.

虛擬使用者的目錄也會自行建立
# ls -ld /home/virtualuser/*
drwx—— 2 virtualuser virtualgrp 4096 2014-01-04 13:33 /home/virtualuser/s0990001
drwx—— 2 virtualuser virtualgrp 4096 2014-01-04 13:35 /home/virtualuser/s0990002

在 CentOS 6.x 安裝 ProFTPd FTP Server

在 CentOS 6.x 上安裝 ProFTPd FTP Server
# yum install proftpd proftpd-ldap proftpd-mysql –enablerepo=epel

啟動 ProFTPd FTP Server
# service proftpd start

設定開機時啟動 ProFTPd FTP Server
# chkconfig –level 3 proftpd on

連線測試
# lftp -u test 192.168.1.20
密碼:
lftp test@192.168.1.20:~> ls
ls: 登入錯誤: 530 Login incorrect.

在 /var/log/proftpd/proftpd.log 中找到登入錯誤的記錄
# grep test /var/log/proftpd/proftpd.log
Jan 03 16:17:39 . proftpd[2441] 192.168.1.9 (192.168.1.20[192.168.1.20]): USER test (Login failed): Incorrect password.

但明明密碼是對的,而且改用 vsFTPd FTP Server 就可以正常登入
# service proftpd stop
正在關閉 proftpd:                                         [  確定  ]
# service vsftpd start
正在啟動 vsftpd 中的 vsftpd:                              [  確定  ]
# lftp -u test 192.168.1.20
密碼:
lftp test@192.168.1.20:~> ls -l
-rw-r–r–    1 0        0             358 Jan 03 08:10 groups.sql
-rw-r–r–    1 0        0             563 Jan 03 08:10 users.sql
[@more@]後來在 CentOS 6.x 如何安裝 Proftpd | Vixual 找到了解決的方式
檢查 /var/log/secure 發現有錯誤的訊息
# grep proftpd /var/log/secure | tail -2
Jan  3 16:10:42  proftpd: PAM unable to dlopen(/lib64/security/pam_stack.so): /lib64/security/pam_stack.so: cannot open shared object file: No such file or directory
Jan  3 16:10:42  proftpd: PAM adding faulty module: /lib64/security/pam_stack.so

解決方式:
先備份原檔
# cp /etc/pam.d/proftpd /etc/pam.d/proftpd_$(date +%F)

修改 /etc/pam.d/proftpd
# vim /etc/pam.d/proftpd

#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
auth       required     pam_stack.so service=system-auth
auth       required     pam_shells.so
account    required     pam_stack.so service=system-auth
session    required     pam_stack.so service=system-auth
改成
#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
auth       required     pam_shells.so
account    include      password-auth
session    required     pam_loginuid.so

重新啟動 ProFTPd FTP Server
# service proftpd restart

使用者可以正常登入了!
# lftp -u test 192.168.1.20
密碼:
lftp t0880001@192.168.1.20:~> ls -l
drwx——   2 test teacher      4096 Jan  3 08:10 .
drwx——   2 test teacher      4096 Jan  3 08:10 ..
-rw-r–r–   1 test teacher        18 Jul 18 13:19 .bash_logout
-rw-r–r–   1 test teacher       176 Jul 18 13:19 .bash_profile
-rw-r–r–   1 test teacher       124 Jul 18 13:19 .bashrc
-rw-r–r–   1 root     root          358 Jan  3 08:10 groups.sql
-rw-r–r–   1 root     root          563 Jan  3 08:10 users.sql

Pure-FTPd WebUI


Pure-FTPd WebUI 是一套能利用網頁來管理 PureFTPd FTP Server 和 MySQL Server 虛擬帳號的工具。
Pure-FTPd WebUI 官方網站:http://pure-ftpd-webui.org/
切換目錄
# cd /var/www/html
安裝 git 套件
# yum install git
下載 Pure-FTPd WebUI
# git clone git://github.com/mazay/pure-ftpd-webui.git
Initialized empty Git repository in /var/www/html/pure-ftpd-webui/.git/
remote: Reusing existing pack: 554, done.
Receiving objects: 100% (554/554), 846.22 KiB | 325 KiB/s, done.
remote: Total 554 (delta 0), reused 0 (delta 0)
Resolving deltas: 100% (314/314), done.
[@more@]改變目錄的使用者和群組
# chown -R apache:apache /var/www/html/pure-ftpd-webui

建立資料庫 pureftpdb
# /usr/bin/mysqladmin -u root -p create pureftpdb
設定 pureftpd 擁有 pureftpdb 完整權限及設定密碼
# /usr/bin/mysql -u root -p -e “GRANT ALL PRIVILEGES ON pureftpdb.* TO ‘pureftpd’@’localhost’ IDENTIFIED BY ‘pureftpdpass’;”
檢查是否有設定完成
# /usr/bin/mysql -u root -p -e “SHOW GRANTS FOR pureftpd@localhost;”
Enter password:
+—————————————————————————————————————–+
| Grants for pureftpd@localhost                                                                                   |
+—————————————————————————————————————–+
| GRANT USAGE ON *.* TO ‘pureftpd’@’localhost’ IDENTIFIED BY PASSWORD ‘*F78AF3FDFBCD19918F457A682B481EF35DBF6806’ |
| GRANT ALL PRIVILEGES ON `pureftpdb`.* TO ‘pureftpd’@’localhost’                                                 |
+—————————————————————————————————————–+

匯入 sql 資料表
# /usr/bin/mysql -u root -p pureftpdb < pure-ftpd-webui/INSTALL/pure-ftpd-webui_users-table_0.0.9.sql
# /usr/bin/mysql -u root -p pureftpdb < pure-ftpd-webui/INSTALL/pure-ftpd_users-table_0.0.9.sql

設定管理者 admin / adminpass
# /usr/bin/mysql -u root -p pureftpdb -e “INSERT INTO userlist (user,pass) VALUES (‘admin’,md5(‘adminpass’));”

設定網頁目錄
# vim /etc/httpd/conf.d/pure-ftpd-webui.conf

Alias /pure-ftpd-webui /var/www/html/pure-ftpd-webui <Directory /var/www/html/pure-ftpd-webui> Options +FollowSymLinks AllowOverride None order allow,deny allow from all AddType application/x-httpd-php .php <IfModule mod_php5.c> php_flag magic_quotes_gpc On php_flag short_open_tag On php_flag register_globals On php_flag register_argc_argv On php_flag track_vars On # this setting is necessary for some locales php_value mbstring.func_overload 0 php_value include_path . </IfModule> DirectoryIndex index.php </Directory>

重新啟動瀏覽器
# service httpd restart

打開網頁瀏覽器
http://Server'IP/
pure-ftpd-webui




 

Pure-FTPd FTP Server 使用 LDAP Server 認證

開啟 PureFTPd FTP Server 的 LDAP  設定
# vim /etc/pure-ftpd/pure-ftpd.conf
# LDAP configuration file (see README.LDAP)
LDAPConfigFile                /etc/pure-ftpd/pureftpd-ldap.conf

修改 /etc/pure-ftpd/pureftpd-ldap.conf 設定
# vim /etc/pure-ftpd/pureftpd-ldap.conf
# Optional : name of the LDAP server. Default : localhost
# LDAP Server IP
LDAPServer 192.168.154.167

# Optional : server port. Default : 389
# LDAP Server 連線 Port
LDAPPort   389

# Mandatory : the base DN to search accounts from. No default.
LDAPBaseDN ou=Student,dc=ldap,dc=tces.ilc.edu.tw

# Optional : who we should bind the server as.
#            Default : binds anonymously or binds as FTP users
LDAPBindDN cn=Manager,dc=ldap,dc=tces.ilc.edu.tw

# Password if we don’t bind anonymously
# This configuration file should be only readable by root
# LDAP 管理者密碼
LDAPBindPW 123456

重新啟動 PureFTPd FTP Server
# service pure-ftpd restart
正在停止 pure-ftpd:                                       [  確定  ]
正在啟動 pure-ftpd:                                       [  確定  ]
[@more@]
要測試的帳號 s0990499 和 s0990999
# cat s0990t.ldif
dn: uid=s0990499,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990499
cn: 四忠01蔡中火
sn: 四忠01蔡中火
mail: s0990499@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}xecUVfAyOlao7udDzLccUvf4fHOonjzN
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990499
gecos: 四忠01蔡中火

dn: uid=s0990999,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990999
cn: 四忠02陳大水
sn: 四忠02陳大水
mail: s0990999@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990999
gecos: 四忠02陳大水

匯入 LDAP 資料
# service slapd stop
# /usr/sbin/slapadd -l s0990t.ldif
# chown -R ldap:ldap /var/lib/ldap
# service slapd start

搜尋 LDAP 資料庫是否有加入的資料
# ldapsearch -x -b “ou=Student,dc=ldap,dc=tces.ilc.edu.tw” uid=s0990999 | php /root/utf8ldif.php

# extended LDIF
#
# LDAPv3
# base <ou=Student,dc=ldap,dc=tces.ilc.edu.tw> with scope subtree
# filter: uid=s0990999
# requesting: ALL
#

# s0990999, s0990, Student, ldap.tces.ilc.edu.tw
dn: uid=s0990999,ou=s0990,ou=Student,dc=ldap,dc=tces.ilc.edu.tw
uid: s0990999
cn: 四忠02陳大水
sn: 四忠02陳大水
mail: s0990999@tces.ilc.edu.tw
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}WqVy40LfOfoRV1KBwlJFPpfGNgnkIbtr
loginShell: /sbin/nologin
uidNumber: 500
gidNumber: 500
homeDirectory: /home/s0990/s0990999
gecos: 四忠02陳大水

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

建立使用者虛擬目錄
# vim mkuserdir.awk
# 建立使用者目錄
{print “mkdir -p /home/”$6″/”$4 }
# 更改檔案目錄的所屬擁有者及群組
{print “chown -R  500:500  /home/”$6″/”$4″ ” }

測試
# awk -f mkuserdir.awk 102_class41.lst
mkdir -p /home/s0990/s0990499
chown -R  500:500  /home/s0990/s0990499
mkdir -p /home/s0990/s0990999
chown -R  500:500  /home/s0990/s0990999

使用方式
# awk -f mkuserdir.awk 102_class41.lst  | sh

測試
# lftp -u s0990999 localhost
密碼:
lftp s0990999@localhost:~> ls -l
drwxr-xr-x    2 500        virtualgrp       4096 Jan  2 10:58 .
drwxr-xr-x    2 500        virtualgrp       4096 Jan  2 10:58 ..
lftp s0990999@localhost:/>

如果系統有使用 SELinux,要記得把家目錄的功能打開
# setsebool -P ftp_home_dir 1
# setsebool -P allow_ftpd_full_access=1

建立大批 PureFTPd FTP Server 的 MySQL 帳號

利用 awk 的功能方便可以大批產生 PureFTPd FTP Server 的 MySQL 帳號的 MySQL 語法和自動建立使用者目錄及改變目錄群組及擁有者的語法。

虛擬使用者的 UID 500
# grep virtualuser /etc/passwd
virtualuser:x:500:500::/home/virtualuser:/sbin/nologin

虛擬群組的 GID 500
# grep virtualgrp /etc/group
virtualgrp:x:500:

虛擬使用者的帳號及密碼資料
# cat 102_class41.lst
四忠 01 蔡中火 s0990499 123456 s0990
四忠 02 陳大水 s0990999 234567 s0990
[@more@]建立 MySQL 虛擬使用者的 SQL 資料
# vim mksql.awk
# 帳號密碼檔格式
# 四忠 01 蔡中火 s0990499 123456 s0990
{print “insert into users values (‘”$4″‘,'”$5″‘,’500′,’500’,’/home/”$6″/”$4″‘);”

測試
# awk -f mksql.awk 102_class41.lst > 102_class41.sql
insert into users values (‘s0990499′,’123456′,’500′,’500′,’/home/s0990/s0990499’);
insert into users values (‘s0990999′,’234567′,’500′,’500′,’/home/s0990/s0990999’);

使用方式
# /usr/bin/mysql -u root -p pure-ftpd < 102_class41.sql

建立使用者虛擬目錄
# vim mkuserdir.awk
# 建立使用者目錄
{print “mkdir -p /home/”$6″/”$4 }
# 更改檔案目錄的所屬擁有者及群組
{print “chown -R  500:500  /home/”$6″/”$4″ ” }

測試
# awk -f mkuserdir.awk 102_class41.lst
mkdir -p /home/s0990/s0990499
chown -R  500:500  /home/s0990/s0990499
mkdir -p /home/s0990/s0990999
chown -R  500:500  /home/s0990/s0990999

使用方式
# awk -f mkuserdir.awk 102_class41.lst  | sh

驗證目錄是否有建立
# ls -l /home/s0990/
drwxr-xr-x. 2 virtualuser virtualgrp 4096 2014-01-02 10:58 s0990499/
drwxr-xr-x. 2 virtualuser virtualgrp 4096 2014-01-02 10:58 s0990999/

Pure-FTPd FTP Server 使用 MySQL 虛擬帳號

Pure-FTPd FTP Server 也可以搭配 MySQL 的虛擬帳號來登入
首先安裝 MySQL Server
# yum install mysql mysql-server

啟動 MySQL Server
# service mysqld start

設定 MySQL Server
# /usr/bin/mysql_secure_installation[@more@]設定 Pure-FTPd FTP Server
# vim /etc/pure-ftpd/pure-ftpd.conf
# MySQL configuration file (see README.MySQL)
MySQLConfigFile               /etc/pure-ftpd/pureftpd-mysql.conf

設定 Pure-FTPd FTP Server 的 MySQL 設定檔
# vim /etc/pure-ftpd/pureftpd-mysql.conf
# Optional : define the location of mysql.sock if the server runs on this host.
# MySQL Socket 檔路徑
MYSQLSocket     /var/lib/mysql/mysql.sock

# Mandatory : user to bind the server as.
# MySQL 管理者
MYSQLUser       root

# Mandatory : user password. You must have a password.
# MySQL 管理者密碼
MYSQLPassword   rootpw

# Mandatory : database to open.
# Pure-FTPd 要用的資料庫檔名
MYSQLDatabase   pureftpd

# Mandatory : how passwords are stored
# Valid values are : “cleartext”, “crypt”, “md5” and “password”
# (“password” = MySQL password() function)
# You can also use “any” to try “crypt”, “md5” *and* “password”
# 密碼編碼的方式,可以使用 cleartext 明碼 / md5 使用 MD5 編碼加密  / crypt 用 DES 編碼加密 / password MySQL 的編碼加密
MYSQLCrypt      cleartext

# Query to execute in order to fetch the password
# 虛擬帳號符合 User 欄位時,選取登入者的密碼欄位
MYSQLGetPW      SELECT Password FROM users WHERE User=’L’

# Query to execute in order to fetch the system user name or uid
# 當虛擬帳號符合 User 欄位時,選取登入者的使用者 ID
MYSQLGetUID     SELECT Uid FROM users WHERE User=’L’

# Optional : default UID – if set this overrides MYSQLGetUID

#MYSQLDefaultUID 500

# Query to execute in order to fetch the system user group or gid
# 當虛擬帳號符合 User 欄位時,選取登入者的群組 ID
MYSQLGetGID     SELECT Gid FROM users WHERE User=’L’

# Optional : default GID – if set this overrides MYSQLGetGID
# 內定的群組 GID
#MYSQLDefaultGID 500

# Query to execute in order to fetch the home directory
# 當虛擬帳號符合 User 欄位時,選取登入者的家目錄
MYSQLGetDir     SELECT Dir FROM users WHERE User=’L’

重新啟動 Pure-FTPd FTP Server
# /etc/init.d/pure-ftpd restart

建立資料庫
# vim  /root/pureftpd.sql
CREATE TABLE users (
  User VARCHAR(16) BINARY NOT NULL,
  Password VARCHAR(64) BINARY NOT NULL,
  Uid INT(11) NOT NULL default ‘-1’,
  Gid INT(11) NOT NULL default ‘-1’,
  Dir VARCHAR(128) BINARY NOT NULL,
  PRIMARY KEY  (User)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert into users values (‘u0910001′,’abCxyZ’,’500′,’500′,’/home/virtualuser/u0910001′);
insert into users values (‘u0910002′,’QazXsw’,’500′,’500′,’/home/virtualuser/u0910002′);

# /usr/bin/mysqladmin -u root -p create pureftpd
# /usr/bin/mysql -u root -p pureftpd < /root/pureftpd.sql

測試
# mkdir -p /home/virtualuser/{u0910001,u0910002}
# chown -R virtualuser:virtualgrp /home/virtualuser/{u0910001,u0910002}

# lftp -u u0910001 192.168.154.167
密碼:
lftp u0910001@192.168.154.167:~> ls -l
drwxr-xr-x    2 500        virtualgrp       4096 Jan  2 10:17 .
drwxr-xr-x    2 500        virtualgrp       4096 Jan  2 10:17 ..
lftp u0910001@192.168.154.167:/>

如果系統有使用 SELinux,要記得把家目錄的功能打開
# setsebool -P ftp_home_dir 1
# setsebool -P allow_ftpd_full_access=1

更複雜的設定
CREATE DATABASE pure-ftpd;
CREATE TABLE `users` (
`id` int(32) unsigned NOT NULL auto_increment,
`User` varchar(16) NOT NULL default ”,
`Password` varchar(64) NOT NULL default ”,
`Uid` varchar(11) NOT NULL default ‘-1’,
`Gid` varchar(11) NOT NULL default ‘-1’,
`Dir` varchar(128) NOT NULL default ”,
`QuotaSize` smallint(5) NOT NULL default ‘0’,
`QuotaFiles` int(11) NOT NULL default ‘0’,
`ULBandwidth` smallint(5) NOT NULL default ‘0’,
`DLBandwidth` smallint(5) NOT NULL default ‘0’,
`ULRatio` smallint(6) NOT NULL default ‘0’,
`DLRatio` smallint(6) NOT NULL default ‘0’,
`comment` tinytext NOT NULL,
`ipaccess` varchar(15) NOT NULL default ‘*’,
`status` enum(‘0′,’1’) NOT NULL default ‘0’,
`create_date` datetime NOT NULL default ‘0000-00-00 00:00:00’,
`modify_date` datetime NOT NULL default ‘0000-00-00 00:00:00’,
PRIMARY KEY (`id`,`User`),
UNIQUE KEY `User` (`User`)
) TYPE=MyISAM AUTO_INCREMENT=5 ;

Pure-FTPd FTP Server 使用虛擬帳號登入

修改 /etc/pure-ftpd/pure-ftpd.conf 設定檔
# vim /etc/pure-ftpd/pure-ftpd.conf
# PureDB user database (see README.Virtual-Users)
PureDB /etc/pure-ftpd/pureftpd.pdb
# Automatically create home directories if they are missing
CreateHomeDir yes

重新啟動 Pure-FTPd FTP Server
# /etc/init.d/pure-ftpd restart
Stopping pure-ftpd:                                        [  OK  ]
Starting pure-ftpd:                                        [  OK  ]
[@more@]
新增虛擬群組及使用者
# groupadd virtualgrp
# useradd -d /home/virtualuser -g virtualgrp -s /sbin/nologin virtualuser

新增 s0990001 使用者,並設定 s0990001 使用者的密碼
# /usr/bin/pure-pw useradd s0990001 -u virtualuser -d /home/virtualuser/s0990001
Password:
Enter it again:

密碼檔位置
# ls -l /etc/pure-ftpd/pureftpd.passwd
-rw——-. 1 root root 95 Jan 1 23:41 /etc/pure-ftpd/pureftpd.passwd

建立認證資料庫
建立認證資料庫 /etc/pure-ftpd/pureftpd.pdb
# /usr/bin/pure-pw mkdb

上面二個步驟,也可以用下面的指令一行完成
# /usr/bin/pure-pw useradd s0990001 -u virtualuser -d /home/virtualuser/s0990001 -m

如果系統沒有自動建立使用者的家目錄,必須要手動建立
# mkdir /home/virtualuser/s0990001
# chown -R virtualuser:virtualgrp /home/virtualuser/s0990001

如果系統有使用 SELinux,要記得把家目錄的功能打開
# setsebool -P ftp_home_dir 1
# setsebool -P allow_ftpd_full_access=1

# 修改 s0990001 這一個使用者,下載最大頻寬 50kb,只能在 0800-1600 連線,ip 連線範圍 192.168.250.0/24,140.111.74.0/24
# /usr/bin/pure-pw usermod s0990001 -t 50 -z 0800-1600 -r 192.168.250.0/24,140.111.74.0/24 -m

也可以在建立使用者時就先限定
# /usr/bin/pure-pw useradd s0990001 -u virtualuser -d /home/virtualuser/s0990001 -t 50 -z 0800-1600 -r 192.168.250.0/24,140.111.74.0/24 -m

# 顯示 s0990001 使用者的狀況
# /usr/bin/pure-pw show s0990001

# 修改 s0990001 使用者的密碼
# /usr/bin/pure-pw passwd s0990001 -m

# 刪除 s0990001 使用者
# /usr/bin/pure-pw userdel s0990001 -m

# 列出所有的虛擬帳號使用者
# /usr/bin/pure-pw list

更詳細的 pure-pw 用法
# /usr/bin/pure-pw –help

Usage :

pure-pw useradd <login> [-f <passwd file>] -u <uid> [-g <gid>]
-D/-d <home directory> [-c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client ip>/<mask>] [-R <deny client ip>/<mask>]
[-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m]

pure-pw usermod <login> -f <passwd file> -u <uid> [-g <gid>]
-D/-d <home directory> -[c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client ip>/<mask>] [-R <deny client ip>/<mask>]
[-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m]

pure-pw userdel <login> [-f <passwd file>] [-m]

pure-pw passwd <login> [-f <passwd file>] [-m]

pure-pw show <login> [-f <passwd file>]

pure-pw mkdb [<puredb database file> [-f <passwd file>]]

pure-pw list [-f <passwd file>]

-d <home directory> : chroot user (recommended)
-D <home directory> : don’t chroot user
-<option> ” : set this option to unlimited
-m : also update the /etc/pure-ftpd/pureftpd.pdb database
For a 1:10 ratio, use -q 1 -Q 10
To allow access only between 9 am and 6 pm, use -z 0900-1800

參數說明:
-t :限制下載頻寬
-T :限制上傳頻寬
-q :限制上傳比率
-Q :限制下載比率
-r :限定能連線的 IP 範圍(遠端)
-R :限制不能連線的 IP 範圍(遠端)
-n :限定最多的檔案數
-N :限制檔案的大小
-z :限制連線的時間
-i :限制本地端的 IP 可以連線範圍
-I :限制本地端的 IP 不可以連線的範圍