一、理论知识
1.FTP服务器概念
FTP是文件传输协议(File Transfer Protocol),用于在网络上进行文件传输的一套标准协议,使用客户/服务器模 式。专门用来传输文件的协议 。
2.FTP服务器工作原理
FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式。
3.FTP服务器的认证登录模式
FTP服务器允许用户以三种认证模式登录到FTP服务器上
- 匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。
- 本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,配置起 来也很简单。
- 虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出 用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的 。
4.FTP服务器协议及工作模式
FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送连接请 求,以建立数据传输链路的主机。FTP协议有下面两种工作模式
- 主动模式:FTP服务器主动向客户端发起连接请求
- 被动模式:FTP服务器等待客户端发起连接请求(FTP的默认工作模式)
5.FTP端口:20/21
FTP协议默认使用20、21号端口,其中端口 20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关FTP命令与参数。
4.常见的FTP服务器软件
- Serv-U #Windows
- FileZilla #Windows
- VsFTP #Linux
5.常见的FTP的客户端
- FileZilla
- WinScp
- FlashFTP
- SecureCRT
- CuteFTP
二、VSTFTP服务配置
FTP服务端IP地址:192.168.192.133
VSFTP主配置文件:/etc/vsftp/vsftp.conf
1.安装VSFTP服务器与客户端
#在linux下客户端安装ftp,服务器端安装vsftpd
[root@c74 ~]# yum install vsftpd -y
[root@c66 ~]# yum install ftp -y
2.关闭防火墙和selinux
[root@c74 ~]# systemctl stop firewalld
[root@c74 ~]# setenforce 0
3.认证登录模式
- 匿名开放模式配置
#开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限
#不建议在生产环境使用
- ftp服务端配置
[root@c74 ~]# vi/etc/vsftp/vsftp.conf
anon_upload_enable=YES #允许匿名用户上传
anon_mkdir_write_enable=YES #匿允许名用户建立目录
anon_other_write_enable=YES #允许匿名用户删除重命名目录
[root@c74 ~]# systemctl restart vsftpd&&systemctl enable vsftpd
- ftp客户端测试
[root@c66 ~]# ftp 192.168.192.133
Connected to 192.168.192.133 (192.168.192.133).
220 (vsFTPd 3.0.2)
Name (192.168.192.133:root): ftp #用户填ftp
331 Please specify the password.
Password: #密码为空
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd #刚进来时所处目录为服务器的 /var/ftp/
257 "/"
ftp> cd pub #切换目录至/var/ftp/ftp
250 Directory successfully changed. #切换成功
ftp> mkdir pub1.1 #创建目录
550 Create directory operation failed. #创建失败
ftp>
解决方法(两种):
第一种:将/var/ftp/pub目录的权限改为757 ,此时客户端可在/var/ftp/pub/目录下创建文
ftp服务端:
[root@c74 ~]# chmod 757 /var/ftp/pub/
[root@c74 ~]# systemctl restart vsftpd&&systemctl enable vsftpd
ftp客户端:
[root@c66 ~]# ftp 192.168.192.133
Connected to 192.168.192.133 (192.168.192.133).
220 (vsFTPd 3.0.2)
Name (192.168.192.133:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir pub1 #创建目录
257 "/pub/pub1" created
ftp> rename pub1 changepub1 #修改目录名
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir changepub1 #删除目录
250 Remove directory operation successful.
ftp>
第二种方法:将/var/ftp/pub目录的属主改为ftp用户,此时既可以创建目录,也可以修改pub/下的目录名
ftp服务器:
[root@c74 ~]# chown -Rf ftp /var/ftp/pub/
[root@c74 ~]# systemctl restart vsftpd&&systemctl enable vsftpd
ftp客户端:
[root@c66 ~]# ftp 192.168.192.133
Connected to 192.168.192.133 (192.168.192.133).
220 (vsFTPd 3.0.2)
Name (192.168.192.133:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir pub2
257 "/pub/pub2" created
ftp> rename pub2 changepub2
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir changepub2
250 Remove directory operation successful.
ftp>
- 本地用户模式配置
- ftp服务端配置:
[root@c74 ~]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
[root@c74 ~]# systemctl restart vsftpd&&systemctl enable vsftpd
- ftp客户端测试:
[root@c66 ~]# ftp 192.168.192.133
Connected to 192.168.192.133 (192.168.192.133).
220 (vsFTPd 3.0.2)
Name (192.168.192.133:root): root
530 Permission denied.
Login failed. #登录失败
ftp>
#失败原因:vsftpd服务所在目录中存放着两个用户名单ftpusers,user_list,出于安全原因,root默认不允许登录。
解决方法:
#编辑ftp服务端两个用户名单ftpusers,user_list,注释root即可。同时在新创建一个用户,便于测试。
ftp服务器:
[root@c74 ~]# vi /etc/vsftpd/ftpusers
#root
[root@c74 ~]# vi /etc/vsftpd/user_list
#root
[root@c74 ~]# systemctl restart vsftpd&&systemctl enable vsftpd
ftp客户端测试:
[c66 ~]# ftp 192.168.192.133
Connected to 192.168.192.133 (192.168.192.133).
220 (vsFTPd 3.0.2)
Name (192.168.192.133:root): root #登录服务器的管理员用户
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd #一进来就处于/root目录
257 "/root"
ftp> cd /var/ftp/pub #切换目录
250 Directory successfully changed.
ftp> mkdir 11 #在/var/ftp/pub/目录下创建目录
257 "/var/ftp/pub/11" created
ftp> rename 11 111 #修改/var/ftp/pub目录下的目录名
350 Ready for RNTO.
250 Rename successful
ftp> rmdir 111 #删除/var/ftp/pub目录下的目录
250 Remove directory operation successful.
ftp> cd /root #切换目录至/root
250 Directory successfully changed.
ftp> pwd
257 "/root"
ftp> mkdir ftpclien #在/root/目录下创建目录
257 "/root/ftpclien" created
ftp> rename ftpclien clien #修改/root目录下的目录名
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir clien #删除/root目录下的目录
250 Remove directory operation successful.
ftp>
- 新建一个用户用来测试
ftp服务器:
[root@c74 ~]# useradd user1
[root@c74 ~]# passwd user1
Changing password for user user1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@c74 ~]# systemctl restart vsftpd&&systemctl enable vsftpd
tfp客户端测试:
[root@c66 ~]# ftp 192.168.192.133
Connected to 192.168.192.133 (192.168.192.133).
220 (vsFTPd 3.0.2)
Name (192.168.192.133:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/user1"
ftp> mkdir user1dir
257 "/home/user1/user1dir" created
ftp> rename user1dir dir1
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir dir1
250 Remove directory operation successful.
ftp> cd /root
550 Failed to change directory.
#普通用户只能在自己的家目录里对目录进行操作,不能切换出家用户目录
- 虚拟用户模式配置
VsFTP高级应用,虚拟用户模式
#虚拟用户模式是这三种模式中最安全的一种认证模式,配置复杂。
- ftp服务器配置
[root@c74 ~]# vi /etc/vsftpd/vuser.list
user1 #用户名
123456 #密码
user2
123456
#db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件
#明文不安全,风险高。所以转换为密文,并将明文文件删除
[root@c74 ~]# db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db #生成密文文件
[root@c74 ~]# ll -d /etc/vsftpd/vuser.list
-rw-r--r--. 1 root root 26 Dec 3 16:45 vuser.list
[root@c74 ~]# file /etc/vsftpd/vuser.db
/etc/vsftpd/vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@c74 ~]# chmod 600 /etc/vsftpd/vuser.db
[root@c74 ~]# rm -rf /etc/vsftpd/vuser.list #删除明文文件
#创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。
#FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
[root@c74 ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@c74 ~]# ls -ld /var/ftproot/
drwx------. 2 virtual virtual 62 Dec 3 16:53 /var/ftproot/
[root@c74 ~]# chmod -Rf 755 /var/ftproot
#建立用于支持虚拟用户的PAM文件
#PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式
[root@c74 ~]# vi /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
[root@c74 ~]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=No guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
pam_service_name =vsftpd.vu
#为虚拟用户创建不同的权限
[root@c74 ~]# mkdir /etc/vsftpd/vusers_dir
[root@c74 ~]# cd /etc/vsftpd/vusers_dir
[root@c74 vusers_dir]# touch user1 vi user1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@c74 ~]# vi /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir
#用user1和user2分别进行测试,注意结果
[root@c74 ~]# systemctl restart vsftpd
tfp客户端测试:
[root@c66 ~]# ftp 192.168.192.133
Connected to 192.168.192.133 (192.168.192.133).
220 (vsFTPd 3.0.2)
Name (192.168.192.133:root): user1
331 Please specify the password.
Password:
500 OOPS: bad bool value in config file for: anon_upload_enable
Login failed.
421 Service not available, remote server has closed connection
ftp> pwd
Not connected.
ftp>
[root@c66 ~]# ftp 192.168.192.133
Connected to 192.168.192.133 (192.168.192.133).
220 (vsFTPd 3.0.2)
Name (192.168.192.133:root): user2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,192,133,80,133).
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
ftp>
#得出客户端可以登录user2,却不可以登录user1
问题
#如果加密用户不能认证,注意监控/var/log/secure日志!