date: 2021-12-07title: PureFtpd部署FTP服务器 #标题
tags: PureFtpd #标签
categories: linux大杂烩 # 分类
记录下PureFtpd部署过程,以及使用pureftp的虚拟用户的配置过程。参考官方文档。
PureFtpd可以结合MySQL/pgsql/LDAP进行身份验证,但是部署及维护都稍微麻烦些,而且需要安装数据库等,所以我个人不太推荐使用此方式。
推荐使用基于pureftp的虚拟用户进行配置,功能强大,简单快捷,方便维护(Pure-ftp的遵旨就是尽一切可能简单些)。
FTP相关协议有三种,各种协议的区别和介绍,建议阅读一文详解 FTP、FTPS 与 SFTP 的原理。
注:如果后续不方便使用 root 用户维护pureftp,可以先使用 root 用户将程序部署好并启动,然后将程序部署目录通过setfacl命令赋予普通用户读写执行的权限,即可使用普通系统用户创建ftp登录用户,另外,创建ftp登录用户时,指定的登录目录,一般只要有相应的权限,无需我们手动创建,当用户第一次登录时,会自动创建相应目录。
此博文经过多次验证,配置文件已经优化过,完全可以用在生产环境。
安装pure-ftpd
编译pure-ftp
$ yum -y install gcc pam-devel openssl*
$ wget https://github.com/jedisct1/pure-ftpd/releases/download/1.0.49/pure-ftpd-1.0.49.tar.gz
$ tar zxf pure-ftpd-1.0.49.tar.gz -C /tmp/ && cd /tmp/pure-ftpd-1.0.49/
$ ./configure \
--prefix=/opt/pureftpd \
--with-shadow \
--with-pam \
--with-welcomemsg \
--with-uploadscript \
--with-cookie \
--with-virtualchroot \
--with-virtualhosts \
--with-diraliases \
--with-quotas \
--with-puredb \
--with-sysquotas \
--with-tls \
--with-ratios \
--with-ftpwho \
--with-throttling \
--with-language=simplified-chinese
make
make install
配置环境变量
$ cat >> /etc/profile << EOF
PATH=/opt/pureftpd/bin:/opt/pureftpd/sbin:\$PATH
EOF
source /etc/profile
配置基于pure-ftp的虚拟用户
生成证书
这里生成证书,主要是为了开启TLS加密传输,提高安全性。
$ mkdir -p /opt/pureftpd/etc/ssl
$ openssl req -x509 -nodes -days 7200 -newkey rsa:2048 -keyout /opt/pureftpd/etc/ssl/pure-ftpd.pem -out /opt/pureftpd/etc/ssl/pure-ftpd.pem
# 执行后,根据提示信息依次输入国家、城市等信息,也可以直接回车。
$ chmod 600 /opt/pureftpd/etc/ssl/pure-ftpd.pem
注:如果你们公司有现成的ssl证书,(如果是cer证书,可以在这个网站转换成pem格式的),然后将其粘贴到 /opt/pureftpd/etc/ssl/pure-ftpd.pem
路径中,然后自行配置域名解析,用域名登录ftp,用真实的证书好处就是在客户端登录时,不会提示如下信息:
我这里自己配置真实的证书,大概是这样的:
配置pureftp
$ cd /opt/pureftpd/etc
mv pure-ftpd.conf{,.default}
$ cat > pure-ftpd.conf << EOF
ChrootEveryone yes
Bind 192.168.20.10,21
TLS 2
CertFile /opt/pureftpd/etc/ssl/pure-ftpd.pem
BrokenClientsCompatibility no
MaxClientsNumber 500
Daemonize yes
MaxClientsPerIP 8
VerboseLog yes
CreateHomeDir yes
DisplayDotFiles yes
AnonymousOnly no
NoAnonymous yes
SyslogFacility ftp
DontResolve yes
MaxIdleTime 10
PassivePortRange 30000 50000
PureDB /opt/pureftpd/etc/pureftpd.pdb
PIDFile /var/run/pure-ftpd.pid
LimitRecursion 10000 80
AnonymousCanCreateDirs no
#MaxLoad 4
AntiWarez yes
Umask 133:022
MinUID 5900
AllowUserFXP no
AllowAnonymousFXP no
ProhibitDotFilesWrite no
ProhibitDotFilesRead no
AutoRename no
NoRename no
AnonymousCantUpload yes
MaxDiskUsage 98
CreateHomeDir yes
CustomerProof yes
KeepAllFiles no
EOF
关于上述配置说明,请参考: pureftp配置说明。
配置pure-ftp日志
此步骤为可选配置,根据实际情况来即可。
$ vim /etc/rsyslog.conf # 修改此文件
# 找到:
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 改为:
*.info;mail.none;authpriv.none;cron.none;ftp.none /var/log/messages
# 最后一行添加如下:
ftp.info -/var/log/pureftpd.log
# 重启rsyslog生效
$ systemctl restart rsyslog
创建虚拟用户
需要创建系统上用户和组,因为创建虚拟用户需要指定系统上的用户
# 创建系统用户
groupadd -g 6001 vgroup
useradd -M -g 6001 -u 6001 vuser -s /sbin/nologin
# 创建目录
$ mkdir /data/ftp/xiaoxiao -p && chown 6001.6001 /data/ftp/ -R
# 创建虚拟用户
pure-pw useradd xiaoxiao -u vuser -g vgroup -d /data/ftp/xiaoxiao -m
pure-pw mkdb
启动pureftp验证
# 启动
$ pure-ftpd /opt/pureftpd/etc/pure-ftpd.conf
# 确定端口在监听
$ ss -lnput | grep 21
tcp LISTEN 0 65 *:21 *:* users:(("pure-ftpd",pid=44231,fd=4))
tcp LISTEN 0 65 :::21 :::* users:(("pure-ftpd",pid=44231,fd=5))
# 停止(可将-x选项替换为-9,强制停止)
$ pkill -x pure-ftpd
至此,基于pure-ftp的虚拟用户就配置完成了。
登录测试
windows用户登录
我这里使用winscp工具进行验证,编辑站点信息如下:
如果你的证书是自己做的,那么第一次连接,会提示如下信息(点击“是”即可):
登录后,即可进行上传下载。
注:如果你在连接时选择的加密方式为“不加密”,那么会得到以下错误:
解决办法就是将pure-ftpd.conf
文件中的TLS
值改为1
(值为1
表示接受明文和加密会话,值为2
表示拒绝不使用TLS安全机制的连接,包括匿名会话),然后重启pure-ftp,再次登录即可。
linux终端登录
# 登录指令
$ lftp xiaoxiao:123.com@192.168.20.10
注意:默认你自己做的证书,不经过任何配置,登录后执行命令,你大概率会得到以下错误:
lftp xiaoxiao@192.168.20.10:~> ls
ls: 严重错误: Certificate verification: Not trusted
# 或者这样的
Fatal error: Certificate verification: Not trusted
如果你确定它的真正期望的站点(无中间人攻击!),你可以通过在lftp的提示符下输入以下命令temporaryly禁用证书验证:
lftp > set ssl:verify-certificate no
上述只是暂时生效,要永久设置此为lftp的,可以将它添加到你的/etc/lftp.conf或在你的home目录~/.lfptrc文件。成功登录的截图如下:
pure-ftp维护指令
pure-pw(ftp虚拟用户管理)
参考:官方文档。
虚拟用户是一种存储用户列表的简单机制,其内容格式和/etc/passwd
类似,但其中保存的不是系统用户,而是ftp的虚拟用户。虚拟用户文件可以存储单独的配额、比率、带宽等,系统用户无法执行此操作。
数千个虚拟用户都可以共享同一个系统用户,只要他们的配置文件中都是chroot,他们都可以有自己的主目录。
使用虚拟用户功能前,需要先创建一个系统用户,当然,可以使用系统上现有的账户(不能是root),但不建议这样,最好是为ftp创建单独的系统用户。如下:
# 创建系统用户
$ groupadd -g 6001 vgroup
$ useradd -M -g 6001 -u 6001 vuser -s /sbin/nologin
# 创建目录
$ mkdir /data/ftp/xiaoxiao -p && chown 6001.6001 /data/ftp/ -R
然后,可以使用pure-pw
命令对虚拟用户进行所有维护命令。也可以根据需要手动编辑文件。存储虚拟用户的文件每个用户只有一行,每一行具有以下语法(某些字段也可以为空):
<帐户>:<密码>:<uid>:<gid>:<gecos>:<主目录>:<上传带宽>:<下载带宽>:
<上传比例>:<下载比例>:<最大数量连接数>:<文件配额>:<大小配额>:
<授权的本地IP>:<拒绝本地IP>:<授权客户端IP>:<拒绝的客户端IP>:<时间限制>
创建虚拟用户
# 最好自行查看下帮助信息
$ pure-pw --help
添加新虚拟用户的语法如下:
pure-pw useradd <login> [-f <passwd文件>] -u <uid> [-g <gid>]
-D / -d <主目录> [-c <gecos>]
[-t <下载带宽>] [-T <上传带宽>]
[-n <最大文件数>] [-N <最大兆字节>]
[-q <上传比率>] [-Q <下载比率>]
[-r <允许客户端IP> / <掩码>] [-R <拒绝客户端IP> / <掩码>]
[-i <允许本地IP> / <掩码>] [-I <拒绝本地IP> / <掩码>]
[-y <最大并发会话数>]
[-C <最大并发登录尝试次数>]
[-M <要用于密码哈希的总内存(以MB为单位)>]
[-z <hhmm>-<hhmm>] [-m]
如下是创建user1,对应的主目录是/data/ftp/user1
,映射的是uid/gid均为6001的用户/组,只允许从192.168.20.88
或192.168.20.89
这两个IP,在每天6:00——18:00登录到ftp,并且最多可上传三个文件,最多可用磁盘空间为1G:
$ pure-pw useradd user1 -u 6001 -g 6001 -d /data/ftp/user1 -n 3 -N 1024 -r 192.168.20.88/32,192.168.20.89 -z 0600-1800 -m
# 根据提示输入两次密码
Password:
Enter it again:
# -m选项是通用选项,表示更新用户文件列表时同时更新pureftpd.pdb数据库,
# 对用户文件进行操作时,同时必须增加此选项,或者执行以下命令:
$ pure-pw mkdb
# 查看用户列表文件
$ cat /opt/pureftpd/etc/pureftpd.passwd # 此文件一般在 $FTP_HOME/etc/pureftpd.passwd
xiaoxiao:$6$Gghs6GxibB4kdTP0$smQYWZYNix6v0zNWtb0KQZpj/ONWTkrJuosuGuqFgAYtJM3qO2H.ESUMfXeAKQLT3JQwpLBs9FdwjhuVcV66G1:6001:6001::/data/ftp/xiaoxiao/./::::::::::::
user1:$6$7Yevxj21nwBn.g/0$BFbmpmJPQGnxmmIrZn3xyO.JwneXQSRkaz/AR2AD1NMpao/gHz8dCoYVvDYcMImI0jiOohZvNM3le5zBpj2eA.:6001:6001::/data/ftp/user1/./::::::3:1073741824:::192.168.20.88/32,192.168.20.89::600-1800
# ftp的数据库文件位置如下(为二进制文件,不要查看其内容):
$ ll /opt/pureftpd/etc/pureftpd.pdb
-rw------- 1 root root 2655 9月 14 07:16 /opt/pureftpd/etc/pureftpd.pdb
现在即可自行登录测试,查看策略是否满足我们的需求。
如果为虚拟用户设置了配额,那么在用户的chroot目录下,会有以下一个文件:
$ cat /data/ftp/user1/.ftpquota
3 21099719
# 保存的是已经存储的文件数和字节数大小,此数值是动态变化的。
修改虚拟用户信息
若后期我们需要修改虚拟用户的配额等情况,那么可以使用如下指令,其选项参数和创建虚拟用户的完全一致:
$ pure-pw usermod <选项> -m
# 若要禁用某个属性,则直接修改为空值即可,如下
# 要禁用文件配额,使用pure-pw usermod user1 -n''
删除虚拟用户
# 删除user1用户
$ pure-pw userdel user1 -m
更改虚拟用户密码
# 更改user1用户的密码
pure-pw passwd user1 -m
查看用户信息
$ pure-pw show user1 # 查看user1的属性信息
Login : user1
Password : $6$7Yevxj21nwBn.g/0$BFbmpmJPQGnxmmIrZn3xyO.JwneXQSRkaz/AR2AD1NMpao/gHz8dCoYVvDYcMImI0jiOohZvNM3le5zBpj2eA.
UID : 6001 (vuser)
GID : 6001 (vgroup)
Directory : /data/ftp/user1/./
Full name :
Download bandwidth : 0 Kb (unlimited)
Upload bandwidth : 0 Kb (unlimited)
Max files : 3 (enabled)
Max size : 1024 Mb (enabled)
Ratio : 0:0 (unlimited:unlimited)
Allowed local IPs :
Denied local IPs :
Allowed client IPs : 192.168.20.88/32,192.168.20.89
Denied client IPs :
Time restrictions : 0600-1800 (enabled)
Max sim sessions : 0 (unlimited)
# 主目录末尾的“ /./”表示该用户将被chroot。
pure-ftpwho
pure-ftpwho命令可以查看当前有哪些用户通过哪个IP在使用ftp,以及在做什么(上传/下载/空闲),和占用的带宽是多少。如下:
“ D/L”表示客户端正在下载,“ U/L”表示客户端正在上传。
以下所有选项都可以增加-v选项,输出详细信息。
可以增加-s
选项,输出shell脚本易于分析的格式,但对用户不太友好,如下:
也可以使用-w
选项,输出html的格式,一般需要重定向到文件中,然后下载到本地,使用浏览器打开,如下:
$ pure-ftpwho -w > ftp_info.html
$ sz ftp_info.html
下载到本地后,浏览器打开如下: