一、FTP简介
文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议。它工作于网络传输协议的应用层,使用客户/服务器模式,主要是用来在服务器与客户端之间进行数据传输。FTP 其实是以 TCP 封包的模式进行服务器与客户端计算机之间的联机,当联机建立后,使用者可以在客户端端连上 FTP 服务器来进行文件的下载与上传,此外,也可以对 FTP 服务器上面的文档进行管理等。
FTP传输模式
文件传输协议(File Transfer Protocol,FTP),基于该协议FTP客户端与服务端可以实现共享文件、上传文件、下载文件。
FTP基于C/S模式,FTP客户端与服务器端有两种传输模式,分别是FTP主动模式、FTP被动模式(默认的工作模式)。主被动模式均是以FTP服务器端为参照。
FTP主动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器,FTP服务器以数据端口(20)连接到客户端指定的数据端口(N+1)。
FTP被动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,客户端提交 PASV命令,服务器会开启一个任意的端口(P >1024),并发送PORT P命令给客户端。客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
在企业实际环境中,如果FTP客户端与FTP服务端均开放防火墙,FTP需以主动模式工作,这样只需要在FTP服务器端防火墙规则中,开放20、21端口即可。
环境准备。
属性 | FTP服务端 | FTP客户端 |
节点 | wencheng-1 | windows10 |
系统 | CentOS Linux release 7.5.1804 (Minimal) | windows10 企业版 |
内核 | 3.10.0-862.el7.x86_64 | windows10 企业版2019 x64 |
IP地址 | 172.16.70.185 | 172.16.70.50 |
SELinux | setenforce 0 | disabled |
FTP服务端操作步骤
- 1.服务端安装vsftpd服务。
[root@wencheng-1 ~]# yum install -y vsftpd [root@wencheng-1 ~]# rpm -qa | grep vsftpd vsftpd-3.0.2-28.el7.x86_64 [root@wencheng-1 ~]# rpm -ql vsftpd /etc/pam.d/vsftpd # vsftpd 使用PAM模块时的配置文件,主要做认证功能 /etc/vsftpd/ftpusers # 用户登录黑名单,拒绝ftpusers列表内的用户登录vsftpd,一行一个账号 /etc/vsftpd/user_list # 默认为用户登录黑名单,拒绝user_list列表内的用户登录vsftpd,一行一个账号,这个 配置是否能够生效与 vsftpd.conf 内的参数 userlist_enable, userlist_deny 有关 /etc/vsftpd/vsftpd.conf # vsftpd 服务器的主配置文件,配置格式使用 [参数=设定值] 来设定,注意,等号两边不能有空白 /etc/vsftpd/vsftpd_conf_migrate.sh # 迁移脚本 /usr/sbin/vsftpd # vsftpd命令执行脚本文件 /var/ftp # 匿名用户访问根目录 [root@wencheng-1 ~]# systemctl start vsftpd [root@wencheng-1 ~]# ps -ef | grep vsftpd root 10988 1 0 16:20 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf root 10990 1583 0 16:21 pts/1 00:00:00 grep --color=auto vsftpd [root@wencheng-1 ~]# ps -ef | grep vsftpd root 10988 1 0 16:20 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf root 10992 1583 0 16:21 pts/1 00:00:00 grep --color=auto vsftpd [root@wencheng-1 ~]# systemctl enable vsftpd Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
注意:从现在开始,凡是涉及到服务的配置,就要考虑防火墙和SELinux的因素,很多教程和书籍上都是直接关闭防火墙和selinux,虽然这样在学习阶段可以避免干扰,但是这样非常不安全。另外凡是配置了服务,都要加入开机启动中,让其每次重启自动生效。
- 2.服务端修改配置文件/etc/vsftpd/vsftpd.conf
[root@wencheng-1 ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak [root@wencheng-1 ~]# grep -Ev "^$|#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf [root@wencheng-1 ~]# cat /etc/vsftpd/vsftpd.conf # 默认配置文件详解 # 默认匿名用户配置 anonymous_enable=YES # 开启匿名用户访问; # 默认本地用户配置 local_enable=YES # 启用本地系统用户访问; local_umask=022 # 本地用户创建文件及目录默认权限掩码; # 默认全局配置 write_enable=YES # 本地系统用户写入权限; 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服务器。
- 3.vsftpd三种认证模式
vsftpd作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到FTP服务器上:匿名开放模式、本地用户模式、虚拟用户模式。实际生产环境中虚拟用户模式用的较多。
首先要在防火墙添加ftp,20,21端口。
# firewalld 添加ftp,20,21端口 [root@wencheng-1 ~]# firewall-cmd --zone=public --add-service=ftp --permanent success [root@wencheng-1 ~]# firewall-cmd --zone=public --add-port=20/tcp --permanent success [root@wencheng-1 ~]# firewall-cmd --zone=public --add-port=21/tcp --permanent success [root@wencheng-1 ~]# firewall-cmd --zone=public --list-ports # 查看firewalld开放的端口 20/tcp 21/tcp [root@wencheng-1 ~]# firewall-cmd --get-services | grep -o ‘ftp‘ # 查看firewalld开放的协议 ftp [root@wencheng-1 ~]# systemctl restart firewalld
- 3.1 匿名开放模式:任何人都可以无需密码验证而直接登录到FTP服务器,是一种最不安全的认证模式。
[root@wencheng-1 ~]# vim /etc/vsftpd/vsftpd.conf # 全局配置 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服务器。 # 本地用户配置 local_enable=YES # 启用本地系统用户访问; local_umask=022 # 本地用户创建文件及目录默认权限掩码; local_root=/data/ftpdata # 修改本地用户登录时访问的目录路径 # 匿名用户访问配置(最大权限) anonymous_enable=YES # 开启匿名用户访问; anon_umask=022 # 匿名用户上传文件的umask值 anon_upload_enable=YES # 允许匿名用户上传文件 anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_other_write_enable=YES # 允许匿名用户修改目录名称或删除目录 anon_root=/data/ftpdata # 修改匿名用户登录时访问的目录路径 注:工作中,匿名用户只是只读访问,写的权限也没有的。 [root@wencheng-1 ~]# ls -l /data/ftpdata drwxr-xr-x. 2 root root 18 Mar 25 16:26 ftppub [root@wencheng-1 ~]# ls -ld /data/ftpdata drwxr-xr-x. 3 root root 17 Mar 25 14:53 /data/ftpdata # 修改目录权限 [root@wencheng-1 ~]# chmod o+w /data/ftpdata/ftppub # 修改目录属主 [root@wencheng-1 ~]# chown ftp /data/ftpdata/ftppub/ -R [root@wencheng-1 ~]# ls -ld /data/ftpdata/ftppub/ drwxr-xrwx. 2 ftp root 18 Mar 25 16:26 /data/ftpdata/ftppub [root@wencheng-1 ~]# systemctl restart vsftpd
3.1.1 匿名访问测试。
Win10测试访问ftp路径。
并能执行上传/下载/删除操作。
FTP服务端查看。
- 3.2 本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式。如果被黑客破解了账户信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。
a.将anonymous_enable=YES改为NO,即关闭了匿名模式,此时就不能在使用匿名模式登陆了。
b.另外前面新加的与匿名配置参数可以保留,也可以直接删除,只要总开关anonymous_enable关闭了就禁用了匿名登录。
[root@wencheng-1 ~]# vim /etc/vsftpd/vsftpd.conf # 全局配置 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 # 本地用户配置 local_enable=YES local_umask=022 local_root=/data/ftpdata # 匿名用户设置 anonymous_enable=NO # 仅修改此项为NO anon_umask=022 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES anon_root=/data/ftpdata [root@wencheng-1 ~]# systemctl restart vsftpd
3.2.1 此时已需要账号密码登录。
3.2.2 添加一个ftp用户并创建密码,用来登录ftp服务器。
[root@wencheng-1 ~]# useradd ftpuser -s /sbin/nologin [root@wencheng-1 ~]# passwd ftpuser Changing password for user ftpuser. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [root@wencheng-1 ~]# grep ftpuser /etc/passwd ftpuser:x:1000:1000::/home/ftpuser:/sbin/nologin
3.2.3 再次尝试访问ftppub目录。
- 3.3 虚拟用户模式:需要为FTP服务单独 建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在 服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。这样,即使 黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。是三种模式中最安全的一种认证模式。
Vsftpd虚拟用户企业案例配置步骤如下:
a.安装Vsftpd虚拟用户需用到的软件及认证模块:
[root@wencheng-1 ~]# yum install pam* libdb-utils libdb* --skip-broken -y
b.创建包含用户信息的文件vuser.list(文件名字任意取),文件中奇数行表示账号名,偶数行表示密码。
[root@wencheng-1 ~]# vim /etc/vsftpd/vuser.list vuser1
123456 vuser2 123456
c.生成Vsftpd虚拟用户数据库认证文件,设置权限700。
[root@wencheng-1 ~]# db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vsftpd_login.db [root@wencheng-1 ~]# chmod 700 /etc/vsftpd/vsftpd_login.db
d.配置PAM认证文件,/etc/pam.d/vsftpd行首加入如下两行。
[root@wencheng-1 ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_bak [root@wencheng-1 ~]# vim /etc/pam.d/vsftpd auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
e.所有Vsftpd虚拟用户需要映射到一个系统用户,该系统用户不需要密码,也不需要登录,主要用于虚拟用户映射使用。
[root@wencheng-1 ~]# useradd -d /data/ftpdir -s /sbin/nologin ftpvuser # /data/ftpdir 为虚拟用户默认访问目录 [root@wencheng-1 ~]# chmod -Rf /data/ftpdir/ [root@wencheng-1 ~]# ls -ld /data/ftpdir/ drwxr-xr-x. 2 ftpvuser ftpvuser 76 Mar 29 23:51 /data/ftpdir/
f.创建虚拟用户各自的配置文件
假设我们要区别对待vuser1和vuser2,只允许vuser1查看文件,而允许vuser2上传、创建、修改、查看、删除文件。这种需求在企业真实环境中是常见的。
[root@wencheng-1 ~]# mkdir -p /etc/vsftpd/vsftpd_users_conf [root@wencheng-1 ~]# cd /etc/vsftpd/vsftpd_users_conf [root@wencheng-1 vsftpd_users_conf]# touch vuser1 [root@wencheng-1 vsftpd_users_conf]# vim vuser2 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
g.修改配置文件/etc/vsftpd/vsftpd.conf。
[root@wencheng-1 ~]# vim /etc/vsftpd/vsftpd.conf # 全局配置 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 # 本地用户配置 local_enable=YES local_umask=022 #local_root=/data/ftpdata # 虚拟用户设置 anonymous_enable=NO # 禁止匿名开放模式 guest_enable=YES # 开启虚拟用户模式 guest_username=ftpvuser # 映射虚拟用户至系统用户ftpvuser allow_writeable_chroot=YES # 允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求 user_config_dir=/etc/vsftpd/vsftpd_users_conf # 设置虚拟用户配置文件所在的目录 [root@wencheng-1 ~]# systemctl restart vsftpd
测试通过Windows10客户端资源管理器访问登录。
[root@wencheng-1 ~]# echo 11 > /data/ftpdir/Vfire1 [root@wencheng-1 ~]# echo 22 > /data/ftpdir/Vfire2 [root@wencheng-1 ~]# echo 33 > /data/ftpdir/Vfire3 [root@wencheng-1 ~]# ls /data/ftpdir/ Vfire1 Vfire2 Vfire3
客户端操作步骤
测试账号:vuser1;密码:123456
无法执行删除操作。
测试账号:vuser2;密码:123456
删除成功。
至此,已实现vsftpd服务的三种认证模式。