本章向读者介绍企业vsftpd服务器实战、匿名用户访问、系统用户访问及虚拟用户实战等。
文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件、上传文件、下载文件。 FTP基于TCP协议生成一个虚拟的连接,主要用于控制FTP连接信息,同时再生成一个单独的TCP连接用于FTP数据传输。用户可以通过客户端向FTP服务器端上传、下载、删除文件,FTP服务器端可以同时提供给多人共享使用。
FTP服务是Client/Server(简称C/S)模式,基于FTP协议实现FTP文件对外共享及传输的软件称之为FTP服务器源端,客户端程序基于FTP协议,则称之为FTP客户端,FTP客户端可以向FTP服务器上传、下载文件。
FTP基于C/S模式,FTP客户端与服务器端有两种传输模式,分别是FTP主动模式、FTP被动模式,主被动模式均是以FTP服务器端为参照。主被动模式如图(a)、(b)所示,主被动模式详细区别如下:
在企业实际环境中,如果FTP客户端与FTP服务端均开放防火墙,FTP需以主动模式工作,这样只需要在FTP服务器端防火墙规则中,开放20、21端口即可。关于防火墙配置后面章节会讲解。
图1-1(a) FTP主动模式
图1-1(b) FTP被动模式
vsftpd服务器端安装有两种方法,一是基于YUM方式安装,而是基于源码编译安装,最终实现效果完全一致,本文采用yum安装vsftpd,步骤如下:
在命令行执行如下命令
# yum install vsftpd* -y
图1-2 yum安装vsftpd
# rpm -ql vsftpd|more
图1-3 检查vsftpd安装后的配置文件路径
# systemctl restart vsftpd.service
图1-4 启动vsftpd服务
# ps -ef |grep vsftpd
图1-5 查看vsftp进程
anonymous_enable=YES 开启匿名用户访问; local_enable=YES 启用本地系统用户访问; write_enable=YES 本地系统用户写入权限; local_umask=022 本地用户创建文件及目录默认权限掩码; dirmessage_enable=YES 打印目录显示信息,通常用于用户第一次访问目录时,信息提示; xferlog_enable=YES 启用上传/下载日志记录; connect_from_port_20=YES FTP使用20端口进行数据传输; xferlog_std_format=YES 日志文件将根据xferlog的标准格式写入; listen=NO vsftpd不以独立的服务启动,通过xinetd服务管理,建议改成YES; listen_ipv6=YES 启用IPV6监听; pam_service_name=vsftpd 登录FTP服务器,依据/etc/pam.d/vsftpd中内容进行认证; userlist_enable=YES vsftpd.user_list和ftpusers配置文件里用户禁止访问FTP; tcp_wrappers=YES 设置vsftpd与tcp wrapper结合进行主机的访问控制,vsftpd服务器检查/etc/hosts.allow 和/etc/hosts.deny中的设置,来决定请求连接的主机,是否允许访问该FTP服务器。
ftp://192.168.1.181
图1-6 匿名用户访问FTP默认目录
FTP主被动模式,默认为主动模式,设置为被动模式使用端口方法如下:
pasv_enable=YES pasv_min_port=60000 pasv_max_port=60100
目前主流的FTP服务器软件包括:vsftpd、ProFTPD、PureFTPd、Wuftpd、Server-U FTP、 FileZilla Server等软件,其中Unix/Linux使用较为广泛的FTP服务器软件为vsftpd 。
非常安全的FTP服务进程(Very Secure FTP daemon,vsftpd),vsftpd在Unix/Linux发行版中最主流的FTP服务器程序,优点小巧轻快,安全易用、稳定高效、满足企业跨部门、多用户的使用(1000用户)等。
vsftpd基于GPL开源协议发布,在中小企业中得到广泛的应用,vsftpd可以快速上手,基于vsftpd虚拟用户方式,访问验证更加安全。vsftpd还可以基于MYSQL数据库做安全验证,多重安全防护。
windows和Linux系统默认都自带有ftp命令程序,可以连接到FTP服务器进行交互式的上传,下载通信。除此以外,还有大量的图形化FTP客户端工具。
windows中常用FTP客户端软件包括CuteFTP、FlashFXP、LeapFTP、Filezilla等。
vsftpd默认以匿名用户访问,匿名用户默认访问的FTP服务器路径为:/var/ftp/pub,匿名用户只有查看权限,无法创建、删除、修改。如需关闭FTP匿名用户访问,需修改配置文件/etc/vsftpd/vsftpd.conf,将anonymous_enable=YES修改为anonymous_enable=NO,重启vsftpd服务即可。
1、设置允许匿名用户能够上传、下载、删除文件
如果允许匿名用户能够上传、下载、删除文件,需在/etc/vsftpd/vsftpd.conf配置文件中加入如下:
anon_upload_enable=YES 允许匿名用户上传文件; anon_mkdir_write_enable=YES 允许匿名用户创建目录;
匿名用户完整vsftpd.conf配置文件如下:
anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 anon_upload_enable=YES anon_mkdir_write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
2、修改目录权限
由于默认vsftpd匿名用户有两种:anonymous、ftp,所以匿名用户如果需要上传文件、删除及修改等权限,需要ftp用户对/var/ftp/pub目录有写入权限,使用如下chown和chmod任意一种即可,设置命令如下:
方法一:
# chown -R ftp /var/ftp/pub
方法二:
# chmod o+w /var/ftp/pub
图1-6 (a)更改/var/ftp/pub目录属主
图1-6(b)更改/var/ftp/pub目录写入权限
如上vsftpd.conf配置文件配置完毕,同时权限设置完
4、重启vsftpd服务
# systemctl restart vsftpd.service
5、通过Windows客户端访问,能够上传文件、删除文件、创建目录等操作,如图1-7所示:
图1-7 匿名用户访问上传文件
vsftpd匿名用户设置完毕,匿名用户,任何人都可以查看FTP服务器的文件、目录,甚至可以修改、删除,此方案不适合存放私密文件在FTP服务器,如何保证文件或者目录专属拥有者呢,vsftpd系统用户可以实现该需求。
实现vsftpd系统用户方式验证,只需在Linux系统中创建多个用户即可,创建用户使用useradd,同时给用户设置密码,即可通过用户和密码登录FTP,进行文件上传、下载、删除等操作。vsftpd系统用户实现方法步骤如下:
1、Linux系统中创建系统用户superman1、superman2,分别设置密码为123456:
# useradd superman1
# useradd superman2
# echo 123456|passwd --stdin superman1
# echo 123456|passwd --stdin superman2
图1-8 创建用户并设置密码
2、修改vsftpd.conf配置文件如下:
anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
3、重启vsftpd服务
# systemctl restart vsftpd.service
4、通过Windows资源客户端验证,使用superman1、superman2用户登录FTP服务器,即可上传文件、删除文件、下载文件,superman1、superman2系统用户上传文件的家目录在/home/superman1、/home/superman2下,如图1-9(a)、1-9(b)所示:
图1-9(a) superman1用户登录FTP服务器
图1-9(b) superman1登录FTP服务器上传文件
注意:当允许虚拟用户登录时,就不能实现实体用户登录!!两者不共存!
如果基于vsftpd系统用户访问FTP服务器,系统用户越多越不利于管理,而且不利于系统安全管理,鉴于此,为了能更加的安全使用vsftpd,需使用vsftpd虚拟用户方式。
vsftpd虚拟用户原理:虚拟用户就是没有实际的真实系统用户,而是通过映射到其中一个真实用户以及设置相应的权限来实现访问验证,虚拟用户不能登录Linux系统,从而让系统更加的安全可靠。
vsftpd虚拟用户企业案例配置步骤如下:
1、安装vsftpd虚拟用户需用到的软件及认证模块;
# yum install pam* libdb-utils libdb* --skip-broken -y
图1-10 安装vsftpd虚拟用户需用到的软件及认证模块
2、创建虚拟用户临时文件/etc/vsftpd/ftpusers.txt,新建虚拟用户和密码,其中superman001、superman002为虚拟用户名,123456为密码,如果有多个用户,依次格式填写即可;
# echo “superman001
123456
superman002
123456” > /etc/vsftpd/ftpusers.txt
图1-11 创建虚拟用户临时文件
3、生成vsftpd虚拟用户数据库认证文件,设置权限700;
# db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/vsftpd_login.db
# chmod 700 /etc/vsftpd/vsftpd_login.db
图1-12 生成vsftpd虚拟用户数据库认证文件
4、配置PAM认证文件,/etc/pam.d/vsftpd文件配置成如下两行;
# echo “auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login” > /etc/pam.d/vsftpd
图1-13 配置PAM认证文件
5、所有vsftpd虚拟用户需要映射到一个系统用户,该系统用户不需要密码,也不需要登录,主要用于虚拟用户映射使用,创建命令如下;
# useradd -s /sbin/nologin ftpuser
图1-14 创建虚拟用户需要映射到的一个系统用户
6、完整vsftpd.conf配置文件如下;
#global config Vsftpd anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES chroot_local_user=YES listen=NO listen_ipv6=YES userlist_enable=YES tcp_wrappers=YES #config virtual user FTP pam_service_name=vsftpd guest_enable=YES guest_username=ftpuser user_config_dir=/etc/vsftpd/vsftpd_user_conf virtual_use_local_privs=YES allow_writeable_chroot=YES
如上vsftpd虚拟用户配置文件参数详解:
#config virtual user FTP pam_service_name=vsftpd 虚拟用户启用pam认证; guest_enable=YES 启用虚拟用户; guest_username=ftpuser 映射虚拟用户至系统用户ftpuser; user_config_dir=/etc/vsftpd/vsftpd_user_conf 设置虚拟用户配置文件所在的目录; virtual_use_local_privs=YES 虚拟用户使用与本地用户相同的权限; allow_writeable_chroot=YES 所有的用户都将拥有chroot权限。
7、至此,所有虚拟用户共同基于/home/ftpuser主目录实现文件上传与下载,可以在/etc/vsftpd/vsftpd_user_conf目录创建虚拟用户各自的配置文件,创建虚拟用户配置文件主目录;
# mkdir -p /etc/vsftpd/vsftpd_user_conf
图1-15 创建虚拟用户配置文件主目录
8、如下分别为虚拟用户superman001、superman002用户创建配置文件;
为superman001用户创建配置文件,同时创建私有的虚拟目录,配置如下:
# echo “local_root=/home/ftpuser/superman001
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES” > /etc/vsftpd/vsftpd_user_conf/superman001
图1-16 为superman001用户创建配置文件,同时创建私有的虚拟目录
为superman002用户创建配置文件,同时创建私有的虚拟目录,配置如下:
# echo “local_root=/home/ftpuser/superman002
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES” > /etc/vsftpd/vsftpd_user_conf/superman002
图1-17 为superman002用户创建配置文件,同时创建私有的虚拟目录
虚拟用户配置文件内容详解:
local_root=/home/ftpuser/superman002 superman002虚拟用户配置文件路径; write_enable=YES 允许登陆用户有写权限; anon_world_readable_only=YES 允许匿名用户下载,然后读取文件; anon_upload_enable=YES 允许匿名用户上传文件权限,只有在write_enable=YES时该参数才生效; anon_mkdir_write_enable=YES 允许匿名用户创建目录,只有在write_enable=YES时该参数才生效; anon_other_write_enable=YES 允许匿名用户其他权限,例如删除、重命名等。
9、创建虚拟用户各自虚拟目录;
# mkdir -p /home/ftpuser/{superman001,superman002}
# chown -R ftpuser:ftpuser /home/ftpuser
图1-18 创建虚拟用户各自虚拟目录
10、重启vsftpd服务;
# systemctl restart vsftpd.service
图1-19 启动vsftpd服务
11、通过Windows客户端资源管理器登录vsftpd服务端,测试结果如图1-20(a)、1-20(b)所示:
图1-20(a) superman001虚拟用户登录FTP服务器
图1-20(b) superman001虚拟用户上传下载文件