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

  1. $ yum -y install gcc pam-devel openssl*
  2. $ wget https://github.com/jedisct1/pure-ftpd/releases/download/1.0.49/pure-ftpd-1.0.49.tar.gz
  3. $ tar zxf pure-ftpd-1.0.49.tar.gz -C /tmp/ && cd /tmp/pure-ftpd-1.0.49/
  4. $ ./configure \
  5. --prefix=/opt/pureftpd \
  6. --with-shadow \
  7. --with-pam \
  8. --with-welcomemsg \
  9. --with-uploadscript \
  10. --with-cookie \
  11. --with-virtualchroot \
  12. --with-virtualhosts \
  13. --with-diraliases \
  14. --with-quotas \
  15. --with-puredb \
  16. --with-sysquotas \
  17. --with-tls \
  18. --with-ratios \
  19. --with-ftpwho \
  20. --with-throttling \
  21. --with-language=simplified-chinese
  22. make
  23. 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,用真实的证书好处就是在客户端登录时,不会提示如下信息:

PureFtpd部署FTP服务器 - 图1

我这里自己配置真实的证书,大概是这样的:

PureFtpd部署FTP服务器 - 图2

配置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工具进行验证,编辑站点信息如下:
PureFtpd部署FTP服务器 - 图3

如果你的证书是自己做的,那么第一次连接,会提示如下信息(点击“是”即可):
PureFtpd部署FTP服务器 - 图4

登录后,即可进行上传下载。

注:如果你在连接时选择的加密方式为“不加密”,那么会得到以下错误:

PureFtpd部署FTP服务器 - 图5

解决办法就是将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文件。成功登录的截图如下:

PureFtpd部署FTP服务器 - 图6

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.88192.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,以及在做什么(上传/下载/空闲),和占用的带宽是多少。如下:

PureFtpd部署FTP服务器 - 图7

“ D/L”表示客户端正在下载,“ U/L”表示客户端正在上传。

以下所有选项都可以增加-v选项,输出详细信息。
可以增加-s选项,输出shell脚本易于分析的格式,但对用户不太友好,如下:

PureFtpd部署FTP服务器 - 图8

也可以使用-w选项,输出html的格式,一般需要重定向到文件中,然后下载到本地,使用浏览器打开,如下:

$ pure-ftpwho -w > ftp_info.html
$ sz ftp_info.html

下载到本地后,浏览器打开如下:

PureFtpd部署FTP服务器 - 图9