FTP介绍及原理
创建文件默认权限为666
创建目录默认权限为777
#通过umask值设定,因为操作系统默认umask值为002 每次创建文件或目录是都应减去umask值
FTP是明文传输
FTP文件传输协议 是典型的C/S结构的应用层协议,需要有服务器端的软件,客户端软件分为两个部分共同实现文件传输功能
FTP服务器默认使用TCP协议的20,21 端口与客户端进行通信。20端口用于建立数据连接,并传输数据,21端口用户建立控制连接 并传输FTP控制命令
FTP登入过程是使用明文进行登入的
FTP连接及传输模式(两种)
主动模式: 服务端从20端口主动向客户端发起连接
默认采用了主动模式,服务端主动发起数据连接,服务器开启21端口等待客户端连接,如果服务器通过21端口接收到客户端的请求,服务端就会验证用户名和密码,如果用户名和密码不符合直接拒绝,如果验证成功,可以上传下载数据了,客户端就会随机开启一个1024以上的端口,然后在端口中传带一个PORT命令,通过PORT(携带随机端口号)告知服务器,我打开了某个端口,服务器接收PORT协议后,查看,就会开启 本机的20端口,向客户端的随机端口发送数据
被动模式:服务端在指定范围内某个端口被动等待客户端连接
客户端同样连接21端口,验证用户名密码,登入失败就会拒绝 ,登入成功就会客户端开机PASV命令 通过PASV命令告诉服务采用被动模式连接,服务器端会开启一个随机端口(1024)以上,不采用20端口进行传输数据,然后服务端将随机端口号告诉客户端,客户端就会使用本地的随机端口向服务端传输数据
常见的FTP服务程序
windows: IIS Serv-U
linux: wu-ftpd proftpf vsftp
服务的安装
挂载光盘,进入光盘中的rpm软件中
[root@web Packages]# rpm -ivh vsftpd-3.0.2-22.el7.x86_64.rpm
相关文件
#主配置文件
/etc/vsftpd/vsftpd.conf
#用户控制列表文件
/etc/vsftpd/ftpusers #禁止用户登入
/etc/vsftpd/user_list #可以通过修改主配置文件更改为白名单
注:如果一个用户同时存在两个文件中,黑名单的用户生效,黑名单优先级高
FTP相关用户
匿名用户:anonymous或ftp
本地用户:使用linux系统用户和密码
虚拟用户:管理员自定义的模拟用户
配置文件详解
注:配置文件字段前后不允许有空格或注释
默认配置文件
anon_umask=022 #匿名用户上传默认umask中
anonymous_enable=YES #运行匿名用户登入
anon_upload_enable=YES #运行匿名用户登入
local_enable=YES #允许本地用户登入
write_enable=YES #允许本地用户上传
local_umask=022 #本地用户上传umask值
dirmessage_enable=YES #用户进入目录时,显示message文件中信息,提示信息
message_file=.message #指定信息文件
xferlog_enable=YES #激活记录日志
connect_from_port_20=YES #主动默认数据传输接口
xferlog_std_format=YES #使用标准的ftp日志格式
ftpd_banner #登入欢迎信息
listen=YES #允许被监听
listen_ipv6=YES
pam_service_name=vsftpd #设置PAM外挂模式提供认证服务所使用的配置文件名即/etc/pam.d/vsftpd文件
userlist_enable=YES #用户登入限制
tcp_wrappers=YES #是否使用tcp_wrappers作为主机访问控制方式
常用的全局配置
listen_addres=192.168.201.221 #设置监听的IP地址
listen_port=21 #设置监听FTP服务的端口号
download_enable=YES #是否允许下载文件
max_clients=0 #限制并发客户连接数(限制几百)
max_per_ip=0 #限制同一IP地址的并发连接数(2-3之间)
被动模式
pasv_enable=YES #开启被动模式
pasv_min_port=24500 #被动默认最小端口
pasv_max_port=24600 #被动默认最大端口 (端口信息大于10000)
常用安全配置
accept_timeout=60 #被动模式,连接超时时间
connect_timeout=60 #主动默认,连接超时时间
idle_session_timeout=600 #600秒没有任何操作就端口断开连接
data_connection_timeout=500 #资料传输时,超过500秒没有完成,就断开传输
客户端使用
windiws cmd
ftp 192.168.201.221 登入
get 下载文件
mget 批量下载文件
put 上传文件
mput 批量上传文件
exit退出
注:登入的时的目录将会是你上传或下载文件的默认路径
文件夹不能下载只能下载文件夹中文件,不支持断链从传
可是使用tcpdump抓包工具抓取数据包中的内容
[root@node2 lm]# tcpdump -i ens33 -nnX port 21
-I 指定网卡名称
-nnX 拆解为16进制文件
port 指定监听端口号
第二种
win + e
ftp://192.168.201.221
第三种第三方工具
flashFXP winscp
可以随意查看文件所有文件
匿名用户访问
匿名用户的基本配置(如有其它需求自行百度)
anon_umask=022 #匿名用户上传默认umask中
anonymous_enable=YES #运行匿名用户登入
anon_upload_enable=YES #运行匿名用户登创建文件
anon_mkdir_write_enable=YES #允许匿名用户建立目录
注意事项
匿名用户默认位置是
/var/ftp 应修改该文件的权限属主属组等
如果允许上传 需要服务权限和系统目录 权限同时允许
vsftp服务的伪用户是ftp
低版本的ftp服务如果将目录属主修改为ftp会报错
处于安全应设置对应的目录下的子目录上传权限
本地用户访问
清除匿名用户的配置
注:本地登入就是使用系统用户登入FTP,不仅可以登入FTP还可以登入到系统当中
缺点:用户密码容易暴露 可以切换到任意目录随意下载目录下的文件
解决在所有目录随意下载文件可以将用户限制到自己的家目录
登入到FTP默认会登入到用户所在的家目录(可更改)
本地用户的基本配置,一下三句就可以登入到FTP
local_enable=YES #允许本地用户登入
write_enable=YES #允许本地用户上传
local_umask=022 #本地用户上传umask值
需求1:修改FTP的访问根目录(默认访问时自己的家目录,)
local_root=/var/ftp #设置本地用户的FTP根目录(注意目录权限,和)
因为访问FTP需要两次权限的限制,
FTP的权限 #那有多个用户怎么办?
linux系统的权限 可以添加一个组 将所登入的用户加入相应的组即可,修改文件夹的数组即可
注:次目录是针对所有的用户,也就是说所有用户都将访问这个目录,
需求2:限制最大的传输速率,
local_mac_rate=0 #限制最大传输速率(字节/s)
需求3:使用本地访问的时候用户可以随意切换到其他目录,安全性降低,如何将用户限制到自己的家目录中?
chroot_local_user=YES #开启用户家目录限制(只有此行,吧所有用户限制到用户主目录中)
#如果想让 李四 随意切换到其他目录并下载文件?
chroot_list_enable=YES #相当于开启用户随意切换目录
chroot_list_file=/etc/vsftp/chroot_list #指定随意切换用户文件路径
#注:如果chroot_list是控制用户可以不可随意切换目录的并不是,用户控制列表文件
需求4:如果需要不希望lisi用户登入到FTP中怎么办?
应为用户控制文件默认 两个文件都是黑名单
修改/etc/vsftp/user_list 将lisi 用户添加进即可
userlist_enable=YES #开启用户访问控制 如果=NO 及没有白黑名单
userlist_deny =YES
注:控制user_list是否为黑名单,YES是黑名单 NO是白名单 (默认YES)
userlist_file=/etc/vsftp/user_list
#写入/etc/vsftp/user_List文件中的用户不能访问ftp服务器,没有写入的用户可
如果userlist_dent=NO 文件就是白名单写入的用户可以访问,没有写不可以访问
注意:禁止root用户登入到系统
虚拟用户访问
需要将之前配置取消以防冲突
因为本地用户使用的系统用户登入的,相对于linux系统来说不安全,
虚拟用户创建的是与linux系统用户完全不相关的用户,只能登入到FTP不能登入到linux系统中,模拟用户
虚拟用户可以单独制定配置 指定自己的家目录,指定文件权限,更加灵活
配置虚拟用户访问
1.添加虚拟用户口令文件 (文件名自定义)
此文件跟linux系统用户没关系
[root@node2 ~]# vim /etc/vsftpd/vuser.txt
内容格式为 用户名 第一行用户名
密码 第二行密码
2.生成虚拟用户口令认证文件
需要安装此软件包 libdb-utils-5.3.21-24.el7.x86_64 生成db_load命令
db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db使用此命令生将保存的文件转变成认证数据文件文件
3.编辑VSFTP的PAM认证文件
因为linux内核2.6以后引入了pam认证为了防止,暴力破解linux系统用户密码文件
修改/etc/pam.d/vsftp文件将其他注释添加如下:
[root@node2 vsftpd]# vim /etc/pam.d/vsftpd
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vuser
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vuser
#注此时就算不注释,让系统用户登入FTP,系统用户也不会登入到FTP中 因为在PAM文件中将本地用户已经注释掉了
如果将local_enable=YES 改为NO虚拟用户也不可以登入到系统当中,因为虚拟用户需要映射到本地用户
4.建立本地映射用户并设置宿主目录
[root@node2 /]# useradd -d /home/vuser -s /sbin/nologin vuser此用户不需要登入到系统,只是映射用户
用户名必须和下一步配置文件中一致
修改文件目录权限
[root@node2 ~]# chmod 755 /home/vuser/
默认是700
5.修改配置文件
[root@node2 ~]# vim /etc/vsftpd/vsftpd.conf
#虚拟用户配置如下
guest_enable=YES:启用虚拟用户
guest_username=liu:设置虚拟用户对应的系统用户(前几步不是创建过新用户吗,这里就写哪个新用户的名称)
pam_service_name=vsftpd.vu:认证方式改为vsftpd.vu刚好对应你创建的虚拟用户的PAM认证文件
注:此文件可以vsftpd 和 vsftod.xu两个文件可以同时存在(可以使用系统用户登入不可以使用虚拟用户登入,主要看其配置文件指向那个文件)
local_enable=YES:允许本地用户登陆,(虚拟用户有对应的本地用户,所有要允许本地用户登陆)
local_umask=077(本地用户的权限掩码,注:虚拟用户都有自己所对应的本地用户,因此给本地用户设置权限,相当与给虚拟用户设置了权限)
chroot_local_user=YES:把账户锁定在根目录内,不能切换到其他目录(包括虚拟用户,这是为了安全才设置的)
virtual_use_local_privs=YES:同步,意思为虚拟用户的权限相等与自己所对应的本地用户的权限,必须配置
注:这里配置完后虚拟用户就配置完成了,使用user文件中你所创建的虚拟用户登陆即可,验证方式和本地用户一样
注:设置虚拟账户是这个“allow_writeable_chroot=YES”字段必须添加,因为这个字段影响本地用户,所有同时影响了虚拟用户(会导致虚拟用户无法登陆),且如果设置中有“userlist_deny=NO”条目必须删除,
6.重启,并测试
[root@node2 ~]# systemctl restart vsftpd
此时虚拟用户可以登入 查看 不能下载 默认上传文件的位置是宿主用户的家目录
虚拟用户的权限使用的是匿名用户权限进行管理
注:如果使用了local_root=/data 指向那个默认目录,默认指向虚拟用户映射的家目录
7.修改虚拟用户权限
anonymous_enable=NO #g关闭匿名用户登入 安全(不影响虚拟用户登入)
anon_upload_enable=YES #
anon_mkdir_wirite_enable=YES
anon_other_write_enable=YES #允许匿名用户上传其他类型文件
给虚拟用户设定权限,允许所有虚拟用户上传(如果还是上传不成功,查看ftp家目录权限)
8.单独定义虚拟用户权限
为每个虚拟用户建立自己的配置文件,单独定义权限
将上面的匿名用户的相关的权限,注释掉即可
修改配置文件 添加下列
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir
注:指定保存虚拟用户配置文件的目录,在这个目录下建立与虚拟用户名相同的配置文件
[root@node2 vusers_dir]# vim lisi
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/tmp/lisi
#给lisi指定独立的上传目录(注意tmp/lisi的权限)