以普通用户身份启动pure-ftpd服务端
以普通用户身份启动pure-ftpd服务端
Pureftp的优点包括 :
- 高性能,适用于大容量数据传输。
- 安全性强,通过SSL/TLS加密和身份验证机制保证文件传输安全。
- 易用性高,具有直观的用户界面。
- 灵活性强,支持多种文件存储方式。
- 没有漏洞,便于维护
基于Centos 9的pureftp的RPM包在EPEL仓库上。RPM版本不支持以普通用户启动后台进程。
因此从源码编译时,使用--with-nonroot
参数,以便以普通用户启动(同时不便以root用户启动)
下面以pureftp 1.0.52
为例
前置任务 :
- 安装
EPEL
仓库源
1.编译源码
从https://github.com/jedisct1/pure-ftpd/
下载源码
tar -zvxf pure-ftpd-1.0.52.tar.gz
cd pure-ftpd-1.0.52./autogen.sh./configure \
--prefix=/usr/bin/pure-ftpd-1.0.52 --sysconfdir=/etc/pure-ftpd \
--with-everything --with-tls \
--with-ldap --with-mysql --with-pgsql \
--with-nonroot --with-puredbmake install# 清理编译结果
make uninstall
2.查看版本
pure-ftpd --help
我已经打包为RPM : pure-ftpd-1.0.52-1.el9.x86_64.rpm
下载地址是 : https://github.com/mosaicwang/myrpm/releases/download/pure-ftpd-1.0.52/pure-ftpd-1.0.52-1.el9.x86_64.rpm
3.安装
使用打包好的RPM文件安装:
dnf install ./pure-ftpd-1.0.52-1.el9.x86_64.rpm -y
输出如下 :
=====================================================================================================================================Package Architecture Version Repository Size
=====================================================================================================================================
Installing:pure-ftpd x86_64 1.0.52-1.el9 @commandline 261 k
Installing dependencies:libsodium x86_64 1.0.18-8.el9 epel 161 kmariadb-connector-c-config noarch 3.2.6-1.el9 appstream 11 kmysql-common x86_64 8.0.41-2.el9 appstream 73 kmysql-libs x86_64 8.0.41-2.el9 CRB 1.2 Mperl-AutoLoader noarch 5.74-481.el9 baseos 21 kperl-B x86_64 1.80-481.el9 baseos 180 kperl-Carp noarch 1.50-460.el9 baseos 30 kperl-Class-Struct noarch 0.66-481.el9 baseos 22 kperl-Data-Dumper x86_64 2.174-462.el9 baseos 56 kperl-Digest noarch 1.19-4.el9 baseos 26 kperl-Digest-MD5 x86_64 2.58-4.el9 baseos 37 kperl-Encode x86_64 4:3.08-462.el9 baseos 1.7 Mperl-Errno x86_64 1.30-481.el9 baseos 14 kperl-Exporter noarch 5.74-461.el9 baseos 32 kperl-Fcntl x86_64 1.13-481.el9 baseos 20 kperl-File-Basename noarch 2.85-481.el9 baseos 17 kperl-File-Path noarch 2.18-4.el9 baseos 36 kperl-File-Temp noarch 1:0.231.100-4.el9 baseos 60 kperl-File-stat noarch 1.09-481.el9 baseos 17 kperl-FileHandle noarch 2.03-481.el9 baseos 15 kperl-Getopt-Long noarch 1:2.52-4.el9 baseos 61 kperl-Getopt-Std noarch 1.12-481.el9 baseos 15 kperl-HTTP-Tiny noarch 0.076-462.el9 baseos 54 kperl-IO x86_64 1.43-481.el9 baseos 88 kperl-IO-Socket-IP noarch 0.41-5.el9 baseos 43 kperl-IO-Socket-SSL noarch 2.073-2.el9 baseos 217 kperl-IPC-Open3 noarch 1.21-481.el9 baseos 22 kperl-MIME-Base64 x86_64 3.16-4.el9 baseos 31 kperl-Mozilla-CA noarch 20200520-6.el9 baseos 13 kperl-Net-SSLeay x86_64 1.94-1.el9 baseos 414 kperl-POSIX x86_64 1.94-481.el9 baseos 96 kperl-PathTools x86_64 3.78-461.el9 baseos 88 kperl-Pod-Escapes noarch 1:1.07-460.el9 baseos 21 kperl-Pod-Perldoc noarch 3.28.01-461.el9 baseos 87 kperl-Pod-Simple noarch 1:3.42-4.el9 baseos 225 kperl-Pod-Usage noarch 4:2.01-4.el9 baseos 41 kperl-Scalar-List-Utils x86_64 4:1.56-462.el9 baseos 71 kperl-SelectSaver noarch 1.02-481.el9 baseos 11 kperl-Socket x86_64 4:2.031-4.el9 baseos 56 kperl-Storable x86_64 1:3.21-460.el9 baseos 96 kperl-Symbol noarch 1.08-481.el9 baseos 14 kperl-Term-ANSIColor noarch 5.01-461.el9 baseos 49 kperl-Term-Cap noarch 1.17-460.el9 baseos 23 kperl-Text-ParseWords noarch 3.30-460.el9 baseos 17 kperl-Text-Tabs+Wrap noarch 2013.0523-460.el9 baseos 24 kperl-Time-Local noarch 2:1.300-7.el9 baseos 34 kperl-URI noarch 5.09-3.el9 baseos 121 kperl-base noarch 2.27-481.el9 baseos 16 kperl-constant noarch 1.33-461.el9 baseos 24 kperl-if noarch 0.60.800-481.el9 baseos 14 kperl-interpreter x86_64 4:5.32.1-481.el9 baseos 71 kperl-libnet noarch 3.13-4.el9 baseos 130 kperl-libs x86_64 4:5.32.1-481.el9 baseos 2.2 Mperl-mro x86_64 1.23-481.el9 baseos 28 kperl-overload noarch 1.31-481.el9 baseos 45 kperl-overloading noarch 0.02-481.el9 baseos 12 kperl-parent noarch 1:0.238-460.el9 baseos 15 kperl-podlators noarch 1:4.14-460.el9 baseos 114 kperl-subs noarch 1.03-481.el9 baseos 11 kperl-vars noarch 1.05-481.el9 baseos 13 k
Installing weak dependencies:perl-NDBM_File x86_64 1.15-481.el9 appstream 22 k
安装完成后 : :
pure-ftpd
安装到/usr/bin/pure-ftpd-1.0.52
目录下,可执行文件在bin
和sbin
子目录中- 创建了新的操作系统用户
pure-ftpd
,此用户设置为禁止登录 - 系统服务文件 :
pure-ftpd-non-root.service
- PAM文件 :
/etc/pam.d/pure-ftpd
.由于普通用户无法读取/etc/shadow
,因此此文件暂时没什么用处 - 配置文件 :
/etc/pure-ftpd/pure-ftpd.conf
4.安装过程修改了~/.bashrc
,新增了环境变量,因此执行如下命令,使环境变量生效
source ~/.bashrc
说明 :
- 新增了环境变量
PURE_PASSWDFILE
和PURE_DBFILE
- 将pure-ftpd的bin和sbin目录增加到
PATH
中
5.开放防火墙
# 因为普通用户无法启用<1024的端口号,因此使用2121作为FTP的端口号
firewall-cmd --permanent --add-port=2121/tcp# 如下端口号段为passive模式下的端口段
firewall-cmd --permanent --add-port=40000-40100/tcp
firewall-cmd --reload
6.修改配置文件 : /etc/pure-ftpd/pure-ftpd.conf
- 设置监听端口为2121 :
Bind 0.0.0.0,2121
- 取消PIDFile的注释,且将PID文件放到
/home/pure-ftpd
目录 :PIDFile /home/pure-ftpd/pure-ftpd.pid
- 取消
PassivePortRange
的注释,且设置端口范围是40000-40100
:PassivePortRange 40000 40100
- 设置
noanonymous
为yes,则禁止匿名登陆 :NoAnonymous yes
- (可选)设置
MaxDiskUsage
为85,即磁盘空闲低于85%,则不允许上载 - 设置
AltLog
为stats:/home/pure-ftpd/log/pureftpd.log
.注意:日志文件的路径必须是绝对路径 - 设置puredb为 :
PureDB /etc/pure-ftpd/pureftpd.pdb
- 取消CreateHomeDir的注释 :
CreateHomeDir yes
- 显示详细日志 :
VerboseLog yes
6.1 创建日志文件的目录
mkdir -p /home/pure-ftpd/log
chown pure-ftpd -R /home/pure-ftpd/log
7.启动pure-ftpd服务 :
systemctl start pure-ftpd-non-root
说明 :
- 使用
ps -ef|grep pure
可以看到此进程是以pure-ftpd
用户启动的
8.创建虚拟用户
mkdir -p $HOME/temp# 虚拟用户user1的密码存放在文本文件中,这样方便用命令创建用户
cat >$HOME/temp/user1-pwd.txt <<EOF
hello
hello
EOF# 创建虚拟用户 : user1 ,密码为hello(密码存放在$HOME/temp/user1-pwd.txt中)
pure-pw useradd user1 -c "User1 " \
-u pure-ftpd \
-d /storage/pure-ftpd-root/user1 -m <$HOME/temp/user1-pwd.txt
命令参数说明 :
useradd user1
: 新增虚拟用户user1
-c "User1"
: 为虚拟用户user1设置全名(full name)。此选项为可选-u pure-ftpd
: 指定虚拟用户映射的操作系统账号-d /storage/pure-ftpd-root/user1
: 指定虚拟用户user1
的HOME
目录-m
: 生成/更新二进制数据库文件/etc/pure-ftpd/pureftpd.pdb
命令执行成功后,在/etc/pure-ftpd
目录下得到pureftpd.passwd
文件。此文件为文本格式
9.查看创建的虚拟用户user1
pure-pw show user1
输出如下 :
Login : user1
Password : $argon2id$v=19$m=8192,t=255,p=1$ZUIxc5SjhAAUEDDRob2TIQ$WaLzK11Ec+TYHe6XM14qp6MZq7vTrN95CSHDzawZWFs
UID : 1000 (pure-ftpd)
GID : 1000 (pure-ftpd)
Directory : /storage/pure-ftpd-root/user1/./
Full name : User1
Download bandwidth : 0 Kb (unlimited)
Upload bandwidth : 0 Kb (unlimited)
Max files : 0 (unlimited)
Max size : 0 Mb (unlimited)
Ratio : 0:0 (unlimited:unlimited)
Allowed local IPs :
Denied local IPs :
Allowed client IPs :
Denied client IPs :
Time restrictions : 0000-0000 (unlimited)
Max sim sessions : 0 (unlimited)
11.设置密码文件的权限为644
chmod 644 /etc/pure-ftpd/pureftpd.p*
说明 :
- 缺省属性是600,导致普通用户无法读取此文件
12.为虚拟用户创建HOME目录
mkdir -p /storage/pure-ftpd-root
chown -R pure-ftpd /storage/pure-ftpd-root
chmod o+rX -R /storage
说明 :
/storage/pure-ftpd-root
是虚拟用户的根目录。配置文件启用了自动创建HOME目录
13.用客户端验证
# 安装FTP客户端软件
dnf install -y ftp# 连接到本机的2121端口
ftp -p localhost 2121
命令参数说明:
-p
: 以passive模式连接服务端
输出如下 :
Trying ::1...
ftp: connect to address ::1Connection refused
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
220---------- Welcome to Pure-FTPd ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 15:23. Server port: 2121.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (localhost:root): user1 # 输入虚拟用户的用户名user1
331 User user1 OK. Password required
Password: # 输入user1的密码hello
230 OK. Current directory is / # 成功登陆
Remote system type is UNIX.
Using binary mode to transfer files.
13.1测试上载
ftp>put anaconda-ks.cfg
输出如下 :
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (127,0,0,1,156,92)
150 Accepted data connection
226-File successfully transferred # 上载成功
226 0.032 seconds (measured here), 36.40 Kbytes per second
1177 bytes sent in 0.0311 secs (37.79 Kbytes/sec)
13.2查看HOME目录
ftp> ls
输出如下 :
227 Entering Passive Mode (127,0,0,1,156,111)
150 Accepted data connection
drwxr-x--- 2 1000 0 29 Apr 9 14:57 .
drwxr-x--- 2 1000 0 29 Apr 9 14:57 ..
-rw-r--r-- 1 1000 pure-ftpd 1177 Apr 9 14:57 anaconda-ks.cfg
226-Options: -a -l
226 3 matches total
说明 :
- 在HOME目录下(即
/storage/pure-ftpd-root/user1
)能看到上载的anaconda-ks.cfg
14.设置服务为开机启动
systemctl enable pure-ftpd-non-root
15.常见问题 :
问题一:登录FTP服务端报错为421 Login authentication failed
Q:则说明编译时没有--with-puredb
选项,即不支持虚拟用户
问题二:登录FTP服务端报错为530 Login authentication failed
Q : 由于编译时使用了--with-noroot
参数,因此不建议以root用户启动进程。解决方法是:将配置文件/etc/pure-ftpd/pure-ftpd.conf
中的MinUID
设置为0,然后重启pure-ftpd-non-root.service
服务
问题三:以root启动pure-ftpd.service
,然后登录FTP服务端报错为I cann't trust Your
Q : 将配置文件/etc/pure-ftpd/pure-ftpd.conf
中的MinUID
设置为0,然后重启pure-ftpd.service
服务