一、FTP简介
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通 过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。
默认情况下FTP 协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与FTP使用的传输模式有关,如果采用主动模式,那么数据传输端口就是20;如果采用被动模式,则具体最终使用哪个端口要服务器端和客户端协商决定。
核心:而FTP会建立两个连接,将命令(21)与数据(20)分开传输,正是因为这样,提高了传输效率。
同大多数Internet服务一样,FTP也是一个C/S。用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。依照 FTP 协议提供服务,进行文件传送的计算机就是 FTP服务器;而连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。用户要连上FTP 服务器,就要用到 FTP 的客户端软件,Windows常用的 FTP 客户程序是FileZilla!Linux一般使用的服务器端是vsftpd,而客户端是lftp!
二、FTP的实践
1)服务器端环境的搭建
(1)vsftpd的开机自启
yum install -y vsftpd.x86_64
systemctl start vsftpd
systemctl status vsftpd
systemctl enable vsftpd
(2)将ftp服务加到防火墙的策略上
systemctl status firewalld.service
firewall-cmd --permanent --add-service=ftp
firewall-cmd --list-all
systemctl reload firewalld.service
firewall-cmd --list-all
补充: firewall-config进行图形配置!
(3)关闭selinux,以免对ftp服务产生影响,重启才生效
vim /etc/sysconfig/selinux #是个软连接文件
reboot
(4)测试selinux的状态-->getenforce
2)客户端的配置
lftp ip #没有安装客户端的软件
yum install -y lftp #安装
lftp ip #进行简单的测试,或者通过ftp://ip/ -->到/var/ftp 即ftp的默认发布目录
ls #表示登陆成功
3)相关的说明
3.1)FTP不同等级的用户身份
(1) 本地用户 -->local------>ftp服务器上真实存在的(id user可以查询的)
(2) 匿名用户 -->anonymous-->游客 身份(vsftpd在触发进程的时候,默认是以系统的ftp作为用户身份)
(3) 虚拟用户 -->guest------>id user(不可查询到)
思考:虚拟用户原因-->只想让其具备FTP的功能,最大限度的保障安全!
3.2)客户端登陆FTP服务器的一些状态码的含义
(1)500 -->一般是文件系统的权限过大,主要是登陆的用户对ftp发布目录(不一定是默认的)具有w的权限,认为不安全!
(2)530 -->用户认证失败(可以登陆,但是口令不匹配)
(3)550 -->Permission denied,服务本身的功能没有开启(一般是实际条件达到了,但是ftp尚未开启功能,等于是限制了此功能)
(4)553 -->本地系统文件权限过小(一般是ftp相应的功能开启,但是实际条件达不到)-->put上传文件!
说明:通过状态码准确的定位错误点!
3.3)配置文件以及配置的形式
/etc/vsftod/vsftpd.conf
#功能参数=值
4)从用户需求来谈配置文件
把握:通过man 5 vsftpd.cong的帮助文档,了解ftp帮我们做了什么?
了解:由于开放匿名用户部分功能不安全,所以对匿名用户的权限是进行细化的,各个功能模块是相互独立的!
四、匿名用户
默认开放的功能:可以登陆,能下载可以下载文件,默认的身份是ftp,umask的权限是077,默认不限制速率,发布目录是/var/ftp
需求1:匿名用户登陆
anonymous_enable=YES #默认值(去记忆)
需求2:匿名用户的上传
(1)改变ftp服务器针对匿名用户的发布目录下的pub目录的权限
chmod 775 /var/ftp/pub -->如果改成777,则匿名用户"直接"有w的权限会出现500
chgrp ftp /var/ftp/pub -->改变此目录所属用户组,ftp用户具有w的权限
(2)配置文件中的修改
write_enable=YES #默认开启
anon_upload_enable=YES #默认NO,是不开启的(记忆-->匿名_上传_能码),如果不开启出现550的提示!
需求3:改变匿名用户上传文件的权限和用户属性
(1)前提是能上传,再来谈上传文件权限和用户属性的问题
anno_umask=077 #默认umask是077,可以自定义!
需求4:匿名用户的下载
(1)用户身份对当前目录x的权限,对当前的文件有r的权限!(打铁还得自身硬)
(2)服务功能的开启
anon_world_readable_only=YES #默认是YES,开启的(匿名_全部_可读_只有)
注意:你在哪个地方登陆的就下载到哪个地方,下载的文件的权限和属性是你在登陆ftp服务器之前所使用的用户!
需求5:匿名用户删除和重命名文件
(1)改变ftp服务器针对匿名用户的发布目录的权限
chmod 775 /var/ftp -->如果改成777,则你名用户有w的权限会出现500
chgrp ftp /var/ftp
(2)配置文件中的修改
write_enable=YES #默认开启
anon_another_write_enable=YEs #默认是NO,不开启的
(3)rm、mv的测试
需求6:匿名用户创建目录
(1)匿名用户对当前目录有w的权限
(2)开启创建目录的功能
anon_mkdir_write_enable=YES #默认是NO,不开启
需求7:匿名用户下载速率、最大的连接数(针对所有的用户)
(1)老规矩,前提是可以下载
(2)下载速度以字节作为单位
anon_max_rate=102400 #默认是0,表示不限制速度,这里表示100KB-->测试dd截取文件,然后测试速度!
max_clients=3 #默认是2000,0表示关闭限制,性能问题!
需求8:匿名用户上传文件的身份修改
(1)默认是ftp,注意此用户必须是真实存在的用户
(2)功能配置
chown_uploads=YES #默认是NO,是否允许改变上传文件的权限和文件的"用户"属性(总开关!)
chown_username=kiosk #默认是root(不建议),此参数与chown_uploads关联!
chown_upload_mode=0644 #默认是0600(包含特殊权限),强制改变用户上传文件的权限
此参数的说明:只要可以上传就可以,不关联chown_uploads),是mask的值,不是umask的数值!
需求9:匿名用户家目录的修改
(1)root用户先创建匿名用户的家目录
mkdir /var/anonymoushome/
chmod 755 /var/anonymoushome/
chgrp student /var/anoymoushome/
(2)功能的开启
ftp_username=student #默认是ftp,表示匿名用户登陆的所使用的身份!
anon_root=/var/anonymoushome/ #默认是none,没有家目录,会进入ftp默认的发布目录!
说明1:这里匿名用户登陆的身份是student
说明2:vsftpd进程产生PID,匿名student登陆后,底层会以student的身份去cd进行切换家目录(这是上面操作的原因)
说明2:由于是匿名用户身份登陆,所以不会进入student的家目录!
需求10:匿名验证登陆
(1)配置文件
anonymous_enable=YES #首先匿名用户得能登陆
no_anon_password=NO #默认是NO,表示登陆的时候会检查输入的Email,不会忽略密码的检查步骤(密码默认是空)!
说明:登陆的时候会检查输入的Email
deny_email_enable=YES #默认是NO,表示开启Email address黑名单模式!
场景:当匿名用户使用banned_email_file文件中所列出的e-mail进行登录时,被拒绝。对于阻击某些Dos攻击有效
banned_email_file=/etc/vsftpd/banner_emails
说明1:此选项是关联deny_email_enable的,规定哪个E-mail addres 禁止登陆(黑名单)
说明2:一行输入一个Email address
使用匿名登录时,用户名为:anonymous,密码为:任何合法email地址
默认:ftp和anonymous
思考:进入匿名FTP服务器的用户和密码是什么?
说明:任何用户都可使用“anonymous”为账号,以自己的电子邮件地址为口令登录到FTP服务器,使用该服务器提供的服务!
需求1:匿名用户是否随意切换目录
4.2)本地用户
说明:默认对本地用户的限制比较小!
(1)基本配置
local_enable=YES #默认值,表示允许本地登陆
write_enable=YES #默认值,表示允许本地用户像在本地操作一样
local_max_rate=0 #默认值,表示不限制传输速度
local_umask=077 #本地用户上传文件的默认数值
local_root=none #表示"本地用户"登陆后家目录(none表示默认),可以自定义家目录的位置(用户对该目录有w的权限),拿/var/ftp测试
聊一聊:chroot(change root)
白话:改变根目录单意思,根目录的参照物是/还是用户自己的家目录或者自定义的家目录,是一个开关!
系统安全:避免用户在Linux系统中随意的逛街(离开用户的主目录而进入到其它的LInux系统的目录中),需要将本地用户工作范围局限在用户的主目录下面,让其只能使用FTP的功能!
(2)锁定所有的用户在自己的家目录
chroot_local_user=YES #默认是NO,不锁定用户到自己的家目录(就像在本地主机用本地用户登陆一样)
chmod u-w /home/* #否则出现550的问题,文件权限过大!
注意:如果不锁定,用户具有上传权限和shell访问权限!
(3)锁定部分用户在自己的家目录
3.1)本地用户的黑名单
chroot_local_user=NO #默认是NO,表示不将用户限制在其家目录中!
chroot_list_enable=YES #默认是NO,不开启此功能选项,这里是YES表示使用下列文件中的名单作为限制随意切换目录的本地用户!
chroot_list_file=/etc/vsftpd/chroot_list #说明,与chroot_list_enabl进行关联,黑名单用户!
注意:白名单的用户家目录不能具有w的权限(不安全,强制的角度)
思考:连接特别慢的原因?
注意:黑名单的黑的理解,不是禁止登陆的意思,而是是否用户登陆后限定在家目录中!
3.2)本地用户的白名单
chroot_local_user=YES #默认是NO,表示不将用户限制在其家目录中,YES表示限制!
chroot_list_enable=YES #默认是NO,不开启此功能选项,这里是YES表示使用下列文件中的名单作为允许切换目录的本地用户!
chroot_list_file=/etc/vsftpd/chroot_list #说明,与chroot_list_enabl进行关联,白名单用户!
说明:白名单表示此本地用户登陆后可以切换到其它目录!
(4)限制本地用户的登陆
4.1)永久黑
(1)/etc/vsftpd/ftpusers是永久黑名单
起作用的原因:vaftpd使用PAM模块的相关配置文件/etc/pam.d/vsftpd作为身份认证,阻挡部分不安全的用户登陆!
想将某些用户禁止登陆,可以将本地用户添加到此名单中,一行一个用户(及时生效)!
4.2)临时黑、白名单
(1)/etc/vsftpd/user_list
特点:是vsftpd"自定义"的阻拦访问项目,默认与/etc/vsftpd/ftpusers内容想同!
(2)起作用前提(功能的开启-->黑白名单--->具体的名单)
userlist_enable=YES #表示开启userlist的功能!
userlist_deny=NO #默认是YES表示下面文件的内容是黑名单,现在是NO表示禁止不在/etc/vsftpd/user_list的本地用户ftp登陆
userlist_file=/etc/vsftpd/user_list #白名单
Login failed: 530 Permission denied(黑名单的原因)-->[Loging in]
Login failed: 530 Login incorrect(密码错误)
补充:此/etc/vsftpd/user_list中填入anonymous或者ftp(禁止和允许匿名用户的登陆)
特点说明:这个黑白名单同时也针对于虚拟用户,要慎用!
4.4)虚拟用户!!!
4.4.1)虚拟用户的一般使用
核心步骤
(1)创建虚拟帐号的身份
说明;在/etc/vsftpd/目录下,文件名自定义
guestfile -->格式(用户和密码交互,空格也是字符,最好不要有空格),不一定非要在此目录下创建此文件
(2)生产相应的数据库
db_load -T(转换) -t(加密的格式) hash(加密) -f(加密的文件) /etc/vsftpd/guestfile /etc/vsftpd/ftpfile.db
(3)谁认证-->通过rpm -qc vsftpd.x86_64 -->/etc/pam.d/vsftpd(看此格式的书写)
说明:认证需要口令,谁来认证
注意:用户名和密码都需要认证!
rpm -qc pam.x86_64 -->参照!
(4)参照 /etc/pam.d/vsftpd -->格式照着这个写
在此目录下vim 编辑文件 guestauth
account required(存在则进入,没有则滚蛋) pam_userdb.so(认证的工具) db=/etc/vsftpd/guestfile(注意:会自动加上.db)
auth required pam_userdb.so db=/etc/vsftpd/guestfile
(5)在/etc/vsfpd/vsftpd.conf进行关联
5.1)pam_service_name=guestauth(默认从/etc/pam.d中寻找)
5.2)guest_enable(开启虚拟用户)
5.3)guest_username(虚拟用户使用的身份),虚拟用户也是使用ftp服务器上实际存在的用户!
5.3)userlist_enable=YES -->好好体会这个选项,后续默认数值(userlist_deny=YES),虚拟用户不在黑名单之列!
说明:文件最好是自动补全!
4.4.2)虚拟用户独立家目录
说明:由于采用了ftp作为虚拟用户的身份所以会进入/var/ftp的目录中
说明:接上一步的操作
(1)创建虚拟用户的家目录
mkdir /var/guesthomedir/
cd /var/guesthomedir/
mkdir user{1..3}
chmod u-w /var/questhomedir/*
touch /var/guesthomedir/user1/user1file1
touch /var/guesthomedir/user2/user1file2
touch /var/guesthomedir/user3/user1file3
说明:创建文件的原因-->看虚拟用户登陆之后是否能看到自己家目录的文件!
(2)vsftpd.conf的配置文件-->说明(虚拟用户和本地用户的"共通"点)-->上面也有一个案例!
local_root=/var/guesthomedir/$USER #默认是none(表示默认);现在-u 指定的用户填入,注意与本地用户有冲突!
user_sub_token=$USER #声明变量,告诉ftp这个变量的使用就和shell中的一样
4.4.3)虚拟用户独立配置文件
说明:接上述步骤
(1)建立虚拟用户的配置文件-->man 5 vsftpd.conf帮助文档
mkdir -p /etc/vsftpd/user_conf
touch /etc/vsftpd/user_conf/user{1..3} #注意:文件名和用户名雷同
(2)配置文件的声明
user_config_dir= /etc/vsftpd/user_conf #说明:guest用户登陆的时候会从此配置目录中找相应虚拟用户的配置文件(局部配置文件)
说明:因为用的是ftp的身份(虚拟用户),可能会受限制,最好原始的匿名用户设置为默认值!
测试:全局和局部的都设置,看是局部覆盖,还是全局优先!
结论:局部的会覆盖全局当前的设置!
三、全局设置
需求:
0)用户登陆显示相应的信息,并且为了保持性能设置最大的连接数目
1)本地用户禁止登陆,因为本地用户可以通过ssh来建立连接
2)匿名用户只能下载文件,并且下载速度受限制
3)虚拟用户,对一部分虚拟用户开启上传的权限(高级用户:反馈信息),一部分虚拟用户可以下载(下载速度不受限制)
注意:如果想设置上传文件的数目以及可以使用的硬盘的数量等-->虚拟用户的身份需要设置成本地用户(非ftp),并且开启配额等!
思考:/etc/nologin --->lftp非匿名用户登陆的关系!