概述
1、FTP概述
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP是C/S系统,FTP协议由FTP服务器和FTP客户端两个部分组成。
默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。
2、VSFTP概述
VSFTP是一个基于GPL许可发布的、使用在类Unix系统上的FTP服务器软件,它的全称是Very Secure FTP ,从此名称可以看出来,编制者的初衷是代码的安全。
vsftp安装配置
安装
1、安装vsftp包
- 红帽系安装vsftpd
[root@localhost ~]# yum install vsftpd
- debian系安装vsftpd
[root@localhost ~]# apt-get install vsftpd
2、Redhat的vsftp Server相关文件/目录
/etc/vsftpd/vsftpd.conf
:主配置文件/usr/sbin/vsftpd
:vsftpd的主程序/etc/rc.d/init.d/vsftpd
:sys V风格系统的vsftpd启动脚本/etc/pam.d/vsftpd
:PAM认证文件/etc/vsftpd/user_list
:禁止或允许使用vsftpd的用户列表文件。当/etc/vsftpd/vsftpd.conf
文件中userlist_deny=YES
时这个文件中指定的用户不能访问FTP服务器(也是默认的缺省情况),当userlist_deny=NO
时,则仅允许该文件中指定的用户访问FTP服务器。且use_list
文件路径可在vsftpd.conf文件中指定(即也可以是其他文件名)。/var/ftp
:匿名用户主目录;注:本地用户主目录为自己家目录/var/ftp/pub
:匿名用户的下载目录,此目录需赋权根chmod 1777 pub(1为特殊权限,使上载后无法删除)
vsftpd基本配置
vsftpd的大多数配置都可以通过编辑/etc/vsftpd.conf文件实现. 这个文件自身有大量注释说明, 所以这一章节只就一些重要的配置予以说明. 如果要了解所有的选顶和文档, 请使用man vsftpd.conf。
/etc/vsftpd.conf文件的设定几乎都采用【参数=设定值】的格式,注意等号两边没有空格。
1、运行方式
- stand alone
独立运行,最普遍的运行方式,vsftpd.conf中配置listen=NO
- super daemon
- 修改vsftpd.conf
listen=YES
- 这里若不改成YES,会出现下列错误
500 OOPS: could not bind listening IPv4 socket
- 修改vsftpd.conf
-
安装配置xinetd
$ sudo yum install xinetd $ sudo vi /etc/xinetd.conf service ftp { socket_type = stream wait = no user = root server = /usr/sbin/vsftpd log_on_success += DURATION USERID log_on_failure += USERID nice = 10 disable = no }
-
停止vsftpd,启动xinetd
sudo service vsftpd stop
sudo service xinetd start
-
查看端口
$ sudo netstat -npltu | grep 21
2、本地账号登录设置
-
/etc/vsftpd/ftpusers文件
该文件内的用户一律禁止ftp连接,默认列表包括了root, nobody等。需要禁止某个用户,添加进来便是。此文件是由PAM模块的 /etc/pam.d/vsftpd 指定的# cat /etc/pam.d/vsftpd #%PAM-1.0 session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth
-
/etc/vsftpd/user_list 文件
vsftpd自订的列表,跟/etc/ftpusers类似,具体文件名和路径是由用户自己指定的;redhat设计为/etc/vsftpd/user_list
。- 开放所有,限制指定用户
在vsftpd.conf文件配置如下字段:
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
- user_list文件列表中的用户是禁止登录的用户
- 限制所有,开放指定用户
可以反过来,限制一切用户登录,只允许列表文件中的用户,用 userlist,这样:
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
- user_list文件列表中的用户是允许登录的用户
- 开放所有,限制指定用户
3、匿名用户设置
ftp 和 anonymous用户被vsftpd识别为匿名用户登录。
-
/etc/vsftpd/vsftpd.conf
文件配置# 是否允许匿名登录,下面的配置只有此配置为YES时才生效,默认值:YES anonymous_enable=YES # 是否允许匿名用户上传文件,须将全局的write_enable=YES。默认值:NO anon_upload_enable=YES # 是否允许匿名用户在某些特定的位置创建新的目录,在write_enable值为YES是生效,并且匿名ftp用户必须对父目录具有写入权限。默认值:NO anon_mkdir_write_enable=YES # 是否允许匿名用户具有除写、上传并创建目录以外的权限,如删除和重命名,默认值:NO anon_other_write_enable=YES # 匿名用户的掩码,含义:如umask是022,这时创建一个权限为666的文件,文件的实际权限为666-022=644) anon_umask=022 # 仅在ssl_enable值为YES是生效。是否允许匿名用户使用安全的SSL连接。默认值:NO allow_anon_ssl=YES # 启用后,只允许匿名用户下载可读的文件。 默认值:是 anon_world_readable_only=YES
-
匿名用户家目录:
/var/ftp
- 其实与 ftp 这个账号的家目录有关,比如:
CentOS [root@luci etc]# cat /etc/passwd|grep ftp ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin Ubuntu [dream@Mint ~]$ cat /etc/passwd|grep ftp ftp:x:125:118:ftp daemon,,,:/srv/ftp:/bin/false
-
匿名用户家目录的权限设置
vsftpd对此 ftp 根目录,有两点特殊要求;该用户所有者必须是root,该目录的权限对其他不能为 w; -
匿名用户不能离开自己的根目录进而浏览其他目录
4、虚拟用户设置
vsftp安全设置
1、Chroot限制:
限制用户活动的目录,配置之前登录显示的路径为用户在系统中的家目录,比如是/home/test ,改之后则是 /。
这里归类了三种策略
-
限制所有
- 修改vsftpd.conf文件如下配置
chroot_local_user=YES
- 重启vsftp
$ sudo service vsftpd restart
- 修改vsftpd.conf文件如下配置
-
开放所有,限制指定用户
- 修改vsftpd.conf文件如下配置
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
- 创建做chroot限制的用户列表
$ sudo vi /etc/vsftpd/chroot_list
注意:一行一个用户名 - 重启vsftp
$ sudo service vsftpd restart
- 修改vsftpd.conf文件如下配置
-
限制所有,开放指定用户
上面的规则是限制/etc/vsftpd/chroot_list
中的用户,反过来限制所有用户,只解禁/etc/vsftpd/chroot_list
的用户chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list
2、主机访问 — tcp_wrappers配置
stand alone模式下提供基于主机的访问控制的配置
前提是在vsftpd.conf中设定tcp_wrappers=YES
-
tcp_wrappers使用/etc/hosts.allow和/etc/hosts.deny两个配置文件实现访问控制,hosts.allow是一个许可表,hosts.deny是一个拒绝表 在hosts.allow中也可以使用DENY,所以通常可以只使用hosts.allow来实现访问控制。 对vsftpd而言,书写hosts.allow有三种语法形式
1: vsftpd:主机表 (设置允许访问的主机表) 2: vsftpd:主机表:DENY (设置拒绝访问的主机表) 3: vsftpd:主机表:setenv VSFTPD_LOAD_CONF 配置文件名 (对指定的主机使用另外的配置)
-
setenv VSFTPD_LOAD_CONF的值为指定的配置文件名,意图是让vsftpd守护进程读取新的配置项来覆盖主配置文件中的项,实现特定待遇 这有一个小例子来说明tcp_wrappers
- 功能:
- 拒绝192.168.2.0/24访问
- 对192.168.1.0/24内的所有主机不作连接限制和最大传输速率限制
- 对其他主机的访问限制为:每ip连接数为1,最大传输速率为10kb/s (在主配置文件中设置就好了)
- 然后编辑
# sudo vi /etc/hosts.allow vsftpd:192.168.2.0/24: DENY (阻止192.168.2.0子网的访问) vsftpd:192.168.1.0/24 (允许192.168.1.0子网的访问) vsftpd:192.168.1.0/24: setenv VSFTPD_LOAD_CONF /etc/xxx.conf (对192.168.1.0/24指定专有配置文件xxx.conf,xxx可以自己指定文件名,需要建立)
- 然后建立xxx.conf文件,并编辑。
- 功能:
3、其他
- 限制连接数
可以为本地用户设定数据传输数率, 最大客户端数以及每个IP的连接数目, 在/etc/vsftpd.conf添加如下行:
local_max_rate=1000000
// 最大数据传输速率(单位:字节每秒)
max_clients=50
// 同时在线的最大客户端数目
max_per_ip=2
// 每个IP允许的连接数
报错排除
1、错误1
- ERROR:如果连接服务器时获得错误信息:
500 OOPS: cap_set_proc
- 解决方法:你需要在/etc/rc.conf的 MODULES= 一行添加capability
2、错误2
- ERROR:升级到2.1.0版本后, 连接服务器时可能会出现如下错误:
500 OOPS: could not bind listening IPv4 socket
- 解决方法:
- 在先前的版本中, 将下述行注释掉就足够了:
# Use this to use vsftpd in standalone mode, otherwise it runs through (x)inetd
# listen=YES
- 但在新版本以及未来的版本中, 必须显示的指定守护程序启动方式:
# Use this to use vsftpd in standalone mode, otherwise it runs through (x)inetd
listen=NO
- 在先前的版本中, 将下述行注释掉就足够了:
3、错误3
- ERROR:开启chroot后报500 OOPS: vsftpd: refusing to run with writable root inside chroot()
- 原因:为了避免一个安全漏洞,从 vsftpd 2.3.5 开始,chroot启用后的ftp根目录必须不可写
- 解决方法:
- 去掉有chroot限制的ftp用户根目录的写权限:
chmod a-w /xxx/xxx
这样的话,我们会想到没有w权限,别人不能上传文件等操作啊,要这有个毛用..... 好吧,我们在ftp用户的根目录建立一个文件夹,让它具有w权限 - 还可以在vsftpd.conf 中添加allow_writeable_chroot=YES来解决这个问题,但就相对没那么安全了
- 去掉有chroot限制的ftp用户根目录的写权限: