proftpd环境部署
# proftpd介绍
Proftpd的全称是Professional FTP daemon,是针对Wu-FTP的弱项而开发的,软件在经过多年的发展之后完善了很多功能,ProFTP已经成为继Wu-FTP之后最为流行的FTP服务器软件,越来越多的站点选用它构筑安全高效的FTP站点。Proftpd软件和vsftpd一样是一个开放源代码的ftp服务器软件,但是可配置项比vsftpd要多,是目前比较流行的ftp软件,Proftpd的配置和apache的配置相似,因此该软件也十分容易配置和管理。
Proftpd和VSftpd二者区别
===== vsftpd =====
全称Very secure FTP daemon。比ProFTPD 具有更高的安全性。vsftpd使用一般身份启动服务,降低了FTP服务的PID权限,使该服务即使被入侵也无法得到有效的系统管理权限。同时vsftpd利用chroot软件来改变登录者的根目录,使登陆者只能在这个目录中活动,限制了登录者的执行权限。vsftpd通过配置vsftpd.conf文件来完成部署,设定简单,登录者仅分为anonymous和real user 两种。可以使用standalone和super daemon的方式启动。vsftpd无法控制每个目录的流量、不能控制上传和下载的比例、不能针对不同的登陆者进行不同的权限设定。
===== Proftpd=====
由于Proftpd在自身的原始码中已经包含了所需要的执行指令,不需要Linux系统本机的执行程序的支持,所以在系统安全上更为安全。配置简单且灵活,安装后只需要设定proftpd.conf一个配置文件即可,可配置性更强。可以使用stand-alone或者super daemon方式来启动ftp服务。Proftpd可以控制上下传比例,实现流量控制,针对不同的目录设定不同的权限。登录者分为anonymous和real user两种。
Proftpd比较好用的功能有以下几点:
1)目录访问权限配置灵活,配置简单。
2)能够不依赖系统用户,可以使用独立的虚拟用户系统(使用过Serv-U的朋友应该深有体会,配置非常方便,对原有系统环境影响较小)
3)对中文的支持良好,完美解决vsftpd中文引号bug。因为vsftpd在中文支持方面存在bug,对中文中一些字符的支持不是很好(比如对中文的双引号支持不是很好)。
FTP部署的背景
公司四个部门分别为运维部、开发部、销售部、行政部:
1)各部门用户访问FTP后可以看到所有目录,仅可以访问本部门的目录;
2)需要FTP日志功能;
3)FTP认证方式基于文件认证方式;
4)共享目录:/var/ftp;
# proftp安装记录
测试机器为Centos7.5,iptables和selinux均关闭
1)下载ProFTP
[root@localhost ~]# wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.6.tar.gz
[root@localhost ~]# tar -zvxf proftpd-1.3.6.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/proftpd-1.3.6/
[root@localhost proftpd-1.3.6]# ./configure --prefix=/usr/local/proftpd --sysconfdir=/etc/ --enable-nls --enable-openssl --enable-shadow
==================================================================================================================
编译参数说明(可通过"./configure --help" 查看帮助选项):
--prefix=PREFIX 指定安装路径(--prefix=/usr/local/)
--sysconfdir=DIR 指定FTP服务配置文件路径(--sysconfdir=/etc)
--localstatedir=DIR 指定运行状态的文件存放位置(默认/var/proftpd)
--with-modules=mod_ldap 指定加载功能模块
--enable-memcache 支持缓存功能
--enable-nls 支持多语言环境(如中文),安装完成后在主配置文件中需要指定字符编码(UseEncoding UTF-8 CP936)
--enable-openssl 支持TLS加密FTP服务
--enable-shadow 支持使用/etc/shadow验证用户密码
==================================================================================================================
注意需要GCC编译器
[root@localhost proftpd-1.3.6]# make
[root@localhost proftpd-1.3.6]# make install
2)添加环境变量
[root@localhost proftpd-1.3.6]# vim /etc/profile
........
PATH=$PATH:/usr/local/proftpd/bin
[root@localhost proftpd-1.3.6]# source /etc/profile
3)创建启动用户及组(该用户无法登录系统,没有宿主目录)
[root@localhost ~]# useradd proftp -s /sbin/nologin -M
4)建立共享目录
[root@localhost ~]# mkdir -p /var/ftp/运维部
[root@localhost ~]# mkdir -p /var/ftp/开发部
[root@localhost ~]# mkdir -p /var/ftp/销售部
[root@localhost ~]# mkdir -p /var/ftp/行政部
[root@localhost ~]# useradd -M -s /sbin/nologin yunwei
[root@localhost ~]# useradd -M -s /sbin/nologin kaifa
[root@localhost ~]# useradd -M -s /sbin/nologin xiaoshou
[root@localhost ~]# useradd -M -s /sbin/nologin xingzheng
[root@localhost ~]# chmod 777 /var/ftp/运维部
[root@localhost ~]# chmod 777 /var/ftp/开发部
[root@localhost ~]# chmod 777 /var/ftp/销售部
[root@localhost ~]# chmod 777 /var/ftp/行政部
================proftpd配置原文件解释==============
[root@localhost ~]# cat /etc/proftpd.conf|grep -v "#"|grep -v "^$"
ServerName "ProFTPD Default Installation" #客户端连接后显示的字符
ServerType standalone #服务启动模式
DefaultServer on
Port 21 #端口
UseIPv6 off #禁用IPv6
Umask 022 #权限掩码
MaxInstances 30 #并发进程30个(防DoS攻击)
User nobody #启动服务的用户
Group nogroup #启动服务的组
#DefaultRoot ~ #共享根目录(默认为用户家目录)
AllowOverwrite on #是否允许使用文件覆写权限
<Limit SITE_CHMOD> #权限设置
DenyAll
</Limit>
<Anonymous ~ftp>
User ftp
Group ftp
UserAlias anonymous ftp #用户别名
MaxClients 10 #最大客户端连接数
DisplayLogin welcome.msg #显示登录信息
DisplayChdir .message
<Limit WRITE> #权限设置
DenyAll
</Limit>
</Anonymous>
=================该文件格式===================
##########################################################################
# 全局设置 参数值
#
# <Directory "路径"> 指定路径相关设置,可以使用Limit语法限制目录权限
# ... ...
# ... ...
# </Directory>
#
#
#
# <anonymouse "路径"> 匿名共享路径相关设置(包括权限设置)
# </anonymouse>
#########################################################################
==============Limit权限说明================
#########################################################################
# CWD:改变所在目录 (即Change Working Directory 表示进入该目录)
# MKD/XMKD:新建目录
# RNFR/RNTO:重命名目录的(一起使用) ,即更名
# DELE:删除文件
# RMD/XRMD:删除目录 (即Remove Directory)
# RETR:下载
# STOR:上传
# LOGIN:允许登陆
# READ: 可读,包括了RETR,SITE,SIZE,STAT
# WRITE: 可写,包括包括了APPE, DELE, MKD, RMD, RNTO, STOR, XMKD, XRMD
# DIRS: 允许列出目录,包括了DUP, CWD, LIST, MDTM, NLST, PWD, RNFR, XCUP, XCWD, XPWD
# ALL:包括了READ WRITE DIRS
#######################以上权限结合动作一起使用#####################
# AllowUser:允许某个用户
# DenyUser:禁止某个用户
# AllowGroup:允许某个用户组
# DenyGroup:禁止某个用户组
# AllowAll:允许所有用户
# DenyAll:禁止所有用户
#########################################################################
5)修改/etc/proftpd.conf文件,部分内容为添加内容
[root@localhost ~]# cat /etc/proftpd.conf
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer on
UseEncoding UTF-8 CP936 #支持的编码格式(中文)
Port 21
AllowRetrieveRestart on #允许断点继传(上传)
AllowStoreRestart on #允许断点继传(下载)
UseIPv6 off
Umask 022
RootLogin off #禁止root登录ftp
MaxInstances 30
SystemLog /var/log/proftp.log #产生独立的日志文件. (如果想指定自己的日志格式可以结合(ExtendLog,LogFormat)两个选项设置)
TransferLog /var/log/proftp.log #记录用户下载的日志信息
User proftp #设置启动用户为proftp
Group proftp #设置启动组为proftp
DefaultRoot /var/ftp #指定共享根目录为/var/ftp
AllowOverwrite on
#<Anonymous ~ftp> #该部分全部#注释,取消匿名访问功能
# User ftp
# Group ftp
# UserAlias anonymous ftp
# MaxClients 10
# DisplayLogin welcome.msg
# DisplayChdir .message
# <Limit WRITE>
# DenyAll
# </Limit>
#</Anonymous>
#以下内容为设置权限,为手动添加内容
#所有用户可以看到所有部门的文件夹,仅可以访问自己部门的目录
RequireValidShell off #用户登录是否需要shell(对虚拟用户很重要)
AuthUserFile /usr/local/proftpd/ftpd.passwd #通过文件认证用户登录,需要ftpasswd命令创建该文件
<Directory "/var/ftp/*">
<Limit CWD READ> #允许所有人可以查看根目录
AllowAll
</Limit>
</Directory>
<Directory "/var/ftp/运维部">
<Limit CWD MKD RNFR READ WRITE STOR RETR>
DenyAll #拒绝所有人往该目录下执行Limit后的操作指令
</Limit>
<Limit DELE>
DenyAll #禁止任何人在该目录下删除文件
</Limit>
<Limit CWD MKD RNFR READ WRITE STOR RETR>
AllowUser yunwei #仅允许yunwei用户可以执行Limit后的所有指令
</Limit>
</Directory>
<Directory "/var/ftp/开发部">
<Limit CWD MKD RNFR READ WRITE STOR RETR>
DenyAll
</Limit>
<Limit DELE>
DenyAll
</Limit>
<Limit CWD MKD RNFR READ WRITE STOR RETR>
AllowUser kaifa
</Limit>
</Directory>
<Directory "/var/ftp/行政部">
<Limit CWD MKD RNFR READ WRITE STOR RETR>
DenyAll
</Limit>
<Limit DELE>
DenyAll
</Limit>
<Limit CWD MKD RNFR READ WRITE STOR RETR>
AllowUser xingzheng
</Limit>
</Directory>
<Directory "/var/ftp/销售部">
<Limit CWD MKD RNFR READ WRITE STOR RETR>
DenyAll
</Limit>
<Limit DELE>
DenyAll
</Limit>
<Limit CWD MKD RNFR READ WRITE STOR RETR>
AllowUser xiaoshou
</Limit>
</Directory>
6)用ftpasswd命令建立虚拟账号(下面命令也可以直接用于修改用户密码)
ftpasswd命令格式说明 (该命令可以创建用户文件、组文件,默认创建的用户文件为ftpd.passwd):
--passwd 创建密码文件,即AuthUserFile指定的文件
--group 创建组文件
--name 指定创建的用户名
--uid 指定用户虚拟UID
--gid 指定虚拟GID
--home 指定用户家目录
--shell 指定用户Shell
--file 指定创建的文件名
[root@localhost ~]# ftpasswd --passwd --file=/usr/local/proftpd/ftpd.passwd --name=yunwei --uid=1000 --home=/home/nohome --shell=/bin/false
ftpasswd: using alternate file: /usr/local/proftpd/ftpd.passwd
ftpasswd: --passwd: missing --gid argument: default gid set to uid
ftpasswd: creating passwd entry for user yunwei
ftpasswd: /bin/false is not among the valid system shells. Use of
ftpasswd: "RequireValidShell off" may be required, and the PAM
ftpasswd: module configuration may need to be adjusted.
Password:
Re-type password:
ftpasswd: entry created
用户认证文件创建后的权限是440
[root@localhost ~]# ll /usr/local/proftpd/ftpd.passwd
-r--r-----. 1 root root 77 Jul 12 10:59 /usr/local/proftpd/ftpd.passwd
[root@localhost ~]# cat /usr/local/proftpd/ftpd.passwd
yunwei:$1$UEKjLwfY$FXV4SHlLeAOGEc2wrZa.M/:1000:1000::/home/nohome:/bin/false
7)启动FTP服务
检查配置文件是否正常
[root@localhost ~]# /usr/local/proftpd/sbin/proftpd -t6
Checking syntax of configuration file
Syntax check complete.
[root@localhost ~]# /usr/local/proftpd/sbin/proftpd
[root@localhost ~]# ps -ef|grep proftpd
proftp 13438 1 0 11:01 ? 00:00:00 proftpd: (accepting connections)
root 13440 13349 0 11:01 pts/2 00:00:00 grep --color=auto proftpd
[root@localhost ~]# lsof -i:21
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
proftpd 13438 proftp 0u IPv4 2066796 0t0 TCP *:ftp (LISTEN)
这里仅以用户为实验环境,还可以实现组功能,这里就不做过多介绍了!
=====================================================================================
如果配置组功能,则创建虚拟账号组的命令如下
# ftpasswd --group --file=/usr/local/proftpd/ftpd.group --name=admin --gid=99
# ftpasswd --group --name=admin --gid=99 --member=ftpadmin
=====================================================================================
8)ProFtpd启动脚本
[root@localhost ~]# mkdir /usr/local/proftpd/etc
[root@localhost ~]# ln -s /etc/proftpd.conf /usr/local/proftpd/etc/
[root@localhost ~]# ll /usr/local/proftpd/etc/
total 0
lrwxrwxrwx. 1 root root 17 Jul 12 11:21 proftpd.conf -> /etc/proftpd.conf
[root@localhost ~]# cat /etc/rc.d/init.d/proftpd
#!/bin/bash
#
# chkconfig: 2345 85 15
# description: ProFTPd is an FTP server
# processname: proftpd
# Author: jingyihome
# E-mail: webmaster@zhanghaijun.com
# Website: https://www.zhanghaijun.com
# ProFTPd Settings
PROFTPD="/usr/local/proftpd/sbin/proftpd"
PROCONF="/usr/local/proftpd/etc/proftpd.conf"
PROPID="/usr/local/proftpd/var/proftpd.pid"
RETVAL=0
prog="ProFTPd"
start() {
echo -n $"Starting $prog... "
$PROFTPD -c $PROCONF
if [ "$?" = 0 ] ; then
echo " done"
else
echo " failed"
fi
}
stop() {
echo -n $"Stopping $prog... "
if [ ! -e $PROPID ]; then
echo -n $"$prog is not running."
exit 1
fi
kill `cat $PROPID`
if [ "$?" = 0 ] ; then
echo " done"
else
echo " failed"
fi
}
restart(){
echo $"Restarting $prog..."
$0 stop
sleep 2
$0 start
}
status(){
if [ -e $PROPID ]; then
echo $"$prog is running."
else
echo $"$prog is not running."
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
esac
授予执行权限
[root@localhost ~]# chmod 755 /etc/rc.d/init.d/proftpd
[root@localhost ~]# ll /etc/rc.d/init.d/proftpd
-rwxr-xr-x. 1 root root 1370 Jul 12 11:20 /etc/rc.d/init.d/proftpd
[root@localhost ~]# ll /etc/init.d/proftpd
-rwxr-xr-x. 1 root root 1370 Jul 12 11:20 /etc/init.d/proftpd
测试proftpd脚本启停
[root@localhost ~]# /etc/init.d/proftpd stop
Stopping ProFTPd... done
[root@localhost ~]# lsof -i:21
[root@localhost ~]#
[root@localhost ~]# /etc/init.d/proftpd start
Starting ProFTPd... done
[root@localhost ~]# lsof -i:21
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
proftpd 13503 proftp 0u IPv4 2066913 0t0 TCP *:ftp (LISTEN)
9)如果连接FTP时速度慢,可以在proftpd配置文件proftpd.conf中加入以下内容:
# Slow logins
# This is probably caused by a firewall or DNS timeout. By default ProFTPD will try to do both DNS and ident lookups against the
# incoming connection. If these are blocked or excessively delayed a slower than normal login will result. To turn off DNS and ident
# use:
UseReverseDNS off
IdentLookups off
##########################################################
参考配置
ServerName "ProFTPD Default Installation"
ServerType standalone
DefaultServer on
Port 21000
UseIPv6 off
Umask 022
MaxInstances 30
User root
Group root
PassivePorts 60000 60002
DefaultRoot /data/wordpress/workspace
AllowOverwrite on
AuthUserFile /usr/local/proftpd/ftpd.passwd
<Directory "/data/wordpress/workspace/app">
<Limit CWD MKD RNFR READ WRITE STOR RETR>
</Limit>
</Directory>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
参考链接
CentOS下Proftpd环境部署并使用虚拟用户登录 - 运维笔记 - 散尽浮华 - 博客园 (opens new window)