系统:CentOS 5.7 64bit
原有环境:LNMP.org v0.7
proftpd版本:1.3.4a
web管理:proftpd-admin 1.2
一. ProFTPd 的安装
1. 下载proftpd源码包并解压:
http://proftpd.org/
tar zxf proftpd-1.3.4a.tar.gz
cd proftpd-1.3.4a
2. 添加proftpd将使用的目录、用户和组
mkdir -p /home/ftpdir
groupadd ftpgroup -g 10001
useradd ftpuser -G ftpgroup -d /home/ftpdir
chown -R ftpuser.ftpgroup /home/ftpdir
3. 编译安装proftpd
./configure –prefix=/opt/proftpd –with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql –with-includes=/usr/local/mysql/include/mysql/ –with-libraries=/usr/local/mysql/lib/mysql/ –enable-openssl
#指定安装目录,编译进的模块,mysql的lib位置
make && make install
ln -s /opt/proftpd/sbin/* /usr/sbin/
ln -s /opt/proftpd/sbin/* /usr/local/sbin/
ln -s /opt/proftpd/bin/* /usr/bin/
ln -s /opt/proftpd/bin/* /usr/local/bin/
#等同于设定环境变量加入/opt/proftpd/sbin、bin
4. 添加proftpd服务项并开机启动
cp contrib/dist/rpm/proftpd.init.d /etc/init.d/proftpd
chmod a+x /etc/init.d/proftpd
chkconfig –level 2345 on
二. Web 管理界面的安装配置
1. 下载 proftpd_admin
http://sourceforge.net/projects/proftpd-adm/files/proFTPd%20Administrator/
2. 解压,移动至web目录
tar zvxf proftpd_admin_v1.2.tar.gz
mv proftpd_admin_v1.2 /home/wwwroot/proftpd
cd /home/wwwroot/proftpd
3. 写入 proftpd_admin 的初始库信息
mysql -uroot -p
4. 配置 proftpd_admin 的 mysql 用户权限
mysql -uroot -p
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON proftpd_admin.*
TO proftpd@localhost
IDENTIFIED BY ’123456′;
5. 修改 proftpd_admin 提供的参考配置文件
mv /opt/proftpd/etc/proftpd.conf /opt/proftpd/etc/proftpd.conf.bak
cp /home/wwwroot/proftpd/misc/sample_config/proftpd_quota.conf /opt/proftpd/etc/proftpd.conf
#此配置文件是支持配额quota的
vim /opt/proftpd/etc/proftd.conf
DisplayFirstChdir 改为 DisplayChdir
User proftpd #FTP运行使用的用户
Group proftpd #FTP运行使用的用户组
SQLAuthTypes Backend 下添加:
SQLMinID 500 #建议的限制最小用户ID(为/etc/passwd中的UID)
SQLDefaultUID 666 #默认用户ID
SQLDefaultGID 666 #默认组ID
修改mysql连接信息:
SQLConnectInfo proftpd_admin@localhost proftpd 123456
6. 进入web管理界面进行后续配置
a) 更改web管理界面文件夹的用户组为web server的运行用户
chown -R www:www /home/wwwroot/proftpd
b) 启动 proftpd
service proftpd start
c) Configure *注意! 该web管理目录强烈建议设置ACL或作密码保护!
- Database 注意重新核对一下mysql的连接信息
- ProFTPd
- Sections
- Filepaths
- Extensions
如果有Quota的需要的话将Quota Enable。
三. proftpd.conf 中规则的简单应用
proftpd.conf 即主配置文件末尾可以添加类似apache的策略。
例:
#“~”:对用户的登录目录进行下列策略规定
AllowOverwrite on
HideNoAccess off
#允许覆盖、显示一切文件
AllowAll
1. 限制用户的细化权限
AllowOverwrite on
HideNoAccess on
#无权限文件/目录予以隐藏
DenyAll
#禁止删除文件、目录但允许重命名
2. 限制上传/下载文件大小
(中略)
MaxstoreFilesize 2 Gb
#限制上传文件大小
MaxretrieveFileSize 2 Gb
#限制下载文件
3. 限制上传文件类型
(中略)
PathAllowFilter \.jpg$
#限制上传允许文件类型,正则表达式
PathDenyFilter \.jpg$
#限制上传禁止文件类型,正则表达式
事实上这个规则是非常灵活的,可参阅本笔记附录和网上其他参考资料。
四. 添加删除FTP虚拟用户、组
1. 此处的用户、组mysql数据库中,并非直接操作系统的/etc/passwd、/etc/group,具有较高的自由度和安全性。
2. /home/wwwroot/proftpd/misc/user_script 下的 create_user.sh 和 delete_user.sh 脚本可以自定义添加、删除用户时的附加操作,比较灵活。
3. 修改 create_user.sh 和 delete_user.sh
create_user.sh:
在echo -e “\tE-mail:\t\t” $Email下加入:
mkdir -p $HOMEDIR
chmod 777 $HOMEDIR
delete_user.sh:
在echo -e “\tE-mail:\t\t” $Email下加入:
rm -rf $HOMEDIR
4. 实际操作简易图解
a) 添加用户
* 注意!
如果是添加单独的FTP用户,绝对不要设置FTP的根目录=用户的家目录!
为了权限、数据安全考虑,非匿名用户必须设置一个单独的目录!
b) 删除用户
删除用户之后,由于delete_user.sh的脚本的执行,/home/ftpdir/testftp 目录被直接删除了。
可见,用户的删除必须反复确认无误再行删除,以避免造成不必要的重大损失。
为了保险起见,可以考虑在delete_user.sh中编写脚本,将欲删除的文件转移到类似“回收站”的一个专用文件夹下再行删除,具体方式如下:
mkdir -p /home/ftpdir/other/recycle
#作为回收站存在。但内容需要定期清理,可设置为cron任务,每月自动清空一次。
vim /home/wwwroot/proftpd/misc/user_script/delete_user.sh
将原先的 rm -rf $HOMEDIR 改为:
mv $HOMEDIR /home/ftpdir/other/recycle/
即可。
五. 用户配额(Quota)的设置
在Extension中将Quota启用之后,Configure 会多出此配置项:
所有设置一目了然,可以根据用户组进行基于文件容量、上传下载总流量的各种限制,十分方便。
值得一提的是 limit type 中的 soft/hard 区别:
soft: 当上传完一个文件,发现限额已满时,并不会删除最后上传的文件,但再上传新文件将被阻止;
hard: 当上传完一个文件,发现限额已满时,会自动将最后上传的文件删除。
六. 附录
1. proftpd 的 log 路径,定义于主conf
TransferLog /var/log/proftpd.xferlog
ExtendedLog /var/log/proftpd.access_log WRITE,READ write
ExtendedLog /var/log/proftpd.auth_log AUTH auth
ExtendedLog /var/log/proftpd.paranoid_log ALL default
SQLLogFile /var/log/proftpd.mysql
QuotaLog /var/log/proftpd.quota
2. ProFTPd 配置文件格式模型
#全局设置
设置项目1 参数1
设置项目2 参数2
#某个目录的设置
…
#关于匿名用户的设置
…
访问策略
3. Limit 权限列表
CMD:Change Working Directory 改变目录
MKD:MaKe Directory 建立目录的权限
RNFR: ReName FRom 更改目录名的权限
DELE:DELEte 删除文件的权限
RMD:ReMove Directory 删除目录的权限
RETR:RETRieve 从服务端下载到客户端的权限
STOR:STORe 从客户端上传到服务端的权限
READ:可读的权限,不包括列目录的权限,相当于RETR,STAT等
WRITE:写文件或者目录的权限,包括MKD和RMD
DIRS:是否允许列目录,相当于LIST,NLST等权限,还是比较实用的
ALL:所有权限
LOGIN:是否允许登陆的权限
4. Limit 中的访问策略
AllowUser 针对某个用户允许的Limit
DenyUser 针对某个用户禁止的Limit
AllowGroup 针对某个用户组允许的Limit
DenyGroup 针对某个用户组禁止的Limit
AllowAll 针对所有用户组允许的Limit
DenyAll 针对所有用户禁止的Limit
* 注意:上述策略受系统中本目录权限制约,故建议直接将目录权限设定为777。
5. 单用户/组限速
TransferRate STOR|RETR 速度(Kbytes/s) user|group SOMENAME
6. 一个匿名+user/pass认证的配置示例
User ftp #指定用户的组和名称
Group nogroup
UserAlias anonymous ftp #使得ftp和匿名用户都能登陆
DirFakeUser on ftp
DirFakeGroup on ftp
RequireValidShell off
MaxClients 50 #该用户的最大连接数
DisplayLogin welcome.msg #显示欢迎信息,需要注意把msg文件放到登陆后的主目录
DisplayFirstChdir .message
MaxClientsPerHost 3 #限制每个主机最大连接数
#这里是对目录进行设置,即不允许写
DenyAll
#对上传目录的设置,我们有一个incoming文件夹需要允许别人上传
Umask 022 022
#不允许下载
DenyAll
#允许上传和新建目录
AllowAll
7. * 所谓“匿名”用户同样可以在mysql中生成,并在主conf中定义规则。
七. 小结
1. 与 Serv-U、GeneFTPd 等FTP Server相比,ProFTPd 历史同样足够悠久,经历了时间考验,且完全开源、免费;
2. ProFTPd 的功能十分强大,可以实现几乎所有现有需求。对于用户、目录的权限控制较具体,类apache的配置格式也易于学习和掌握;
3. proftpd_admin 的web界面统计功能比较实用,可以细化到具体用户、具体行为、流量、容量甚至系统状态等;
4. Quota 即用户配额功能与 mysql 结合很易操控,但是如使用域认证方式就并不太容易细化了。不过,就目前应用方向来说,匿名+少部分用户使用user/pass认证,足够满足当前需求。