- 概念
1.1介绍
FTP:File transfer protocol 文件传输协议
1.2原理
默认采用被动模式
被动模式FTP
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被
动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >; 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P >; 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
FTP服务器数据端口(>1023)接受客户端端口(>1023)(客户端初始化数据连接到服务器指定的任意端口)
FTP服务器数据端口(>1023)到客户端端口(>1023)(服务器发送ACK响应和数据到客户端的数据端口)
NFS,基于主机认证,只是局域网之间文件传输
FTP,可以实现用户之间的认证
Real:本地用户 ,服务端用户
匿名用户
虚拟(游客)用户
1.3 配置文件
主配置文件:
vim /etc/vsftpd/vsftpd.conf
从配置文件
vim /var/ftp/pub
主配置文件详解
anonymous_enable=YES 是否启用匿名用户
local_enable=YES
write_enable=YES 允许写入(无论是匿名用户还是本地用户要实现上传就需要快开启它)
local_umask=022 默认本地用户上传文件权限755
dirmessage_enable=YES 显示每个目录下的文件信息
xferlog_enable=YES 日志启用
connect_from_port_20=YES 主动请求的数据端口
chown_uploads=YES 所有匿名用户上传的文件所属用户将会被改成chown_username
chown_username=whoever 匿名上传的所属用户名是whoever
xferlog_file=/var/log/xferlog 启用的日志文件
xferlog_std_format=YES
idle_session_timeout=600 空闲连接超时
data_connection_timeout=120 数据连接超时
nopriv_user=ftpsecure 当服务器运行于最底层时使用的用户名
chroot_list_enable=YES chroot_local_user=YES 所有文件列出用户, 可以切换到其他目录
chroot_list_file=/etc/vsftpd/chroot_list 用于指定用户列表文件,该文件用于控制哪些用户可以切换到FTP站点根目录的上级目录
listen=NO 服务将自己监听处理listen_ipv6=YES
pam_service_name=vsftpd 设置PAM认证模块使用名称预设为vsftpd
userlist_enable=YES
tcp_wrappers=YES 服务端和客户端访问控制策略(服务器级别的一种防火墙)
二、准备工作
2.1查看系统版本号
2.2配置本地yum仓库
1)在光驱中插入kylin-server-v10的系统光盘(若是虚拟机则连接相应的ISO文件),然后在系统中将光盘挂载到/mnt目录。
2)将本地目录/mnt/mydvd配置为本机的yum源
2.3安装vsftpd
2.4 重启vsftpd服务,关闭防火墙和修改SE linux策略
SELLinux设置(查看下面常见问题)
- 设置安全策略:
setsebool -P allow_ftpd_anon_write=1
- 修改安全上下文:
chcon -R -t public_content_rw_t /var/ftp/pub
- 防火墙配置(临时)
Systemctl stop firewalld.service
- 开启vsftpd服务,并设置开机自启
2.5配置网络
1)查看虚拟网卡名称 ens33
2)配置IP地址
3)客户端计算机->网络‘属性’->更改适配器配置->WLAN(注:如果网线连接选择以太网)
4)按‘windows+R’键->输入“cmd”->输入ipconfig,保证虚拟机和主机电脑的IPV4地址同一网段内与子网掩码、网关一致
5)虚拟机中IP配置(静态IP、添加IP地址、子网掩码、网关、DNS)
6)重启网络服务
7)测试网络
三、匿名用户登录
3.1要求:
- vsftpd服务器只允许匿名登录
- 匿名用户在根目录下只能下载
- 匿名用户在pub子目录下可以新建、下载、上传、重命名文件(文件夹)
3.2过程:
(1)修改配置文件/etc/vsftpd,默认访问var/ftp/pub\
- vsftpd的配置文件在/etc/vsftpd目录下,修改 vsftp.conf 文件:(建议复制一个备份文件在同一目录下,以防直接修改错误,而无法恢复。)
- 查看以下授权是否开启并修改:
anonymous_enable=YES #启用匿名访问
no_anon_password=YES #不需要匿名密码登录
local_enable=NO #启用本地用户访问(NO)
anon_umask=022 #设置匿名用户上传的文件权限
anon_upload_enable=YES #启用匿名用户上传
anon_world_readable_only=NO #匿名用户只读
anon_mkdir_write_enable=YES #启用匿名用户创建文件夹权限
anon_other_write_enable=YES #启用匿名用户其它操作的权限
(2)保存退出,重启FTP服务器
(3)在 /var/ftp/pub 目录下创建文件test
(4)在Windows的浏览器里匿名连接FTP服务器:
(5)在Windows的文件资源系统操作:(匿名用户登录,用户名为ftp,密码为空)注:确定防火墙关闭
(6)测试
匿名用户在pub子目录下可以上传、下载、新建、重命名和删除文件
a. 在/var/ftp/pub下新建 download文件和upload文件,并chmod授权777
b. 在/home/下为用户授权
c. 将Windows桌面上的kylin.txt文件拖拽上传到upload文件中
d. 进入upload文件中查看,也可在火狐浏览器中查看
e. 在download文件中创建123.txt、test1.txt等文件
f. 将从download文件中的123.txt下载(拖拽)到Windows桌面
g. 在Windows文件资源管理器中新建文件夹和重命名
h. 删除文件
3.3常见问题及解决办法:
(1)有的时候我们改了配置了vsftpd.conf文件之后还是不能上传下载文件,需要进行以下操作:
- 在麒麟V10系统终端中使用命令getsebool -a|grep ftp 查看ftp的相关权限
这个时候会报SElinux is disabled(因为在装vsftpd的时候SElinux=disabled,在银河麒麟V10的终端通过修改selinux配置文件/etc/selinux/config文件中的SELUNUX参数发现无法启动selinux。(在银河麒麟中有个kysec安全软件,怀疑是此软件拦截了selinux的启动。)
- 解决办法:
- Vim /etc/sysconfig/selinux将SElinux=disabled 改为SElinux=enforcing
2)调用指令:security-switch --set default,执行过程中出现selinux关闭。
查看指令帮助,执行 security-switch --set custom --list selinux,重启后调用sestatus发现selinux启动了。
3)重启后发现当前模式还是enforce,查看/etc/default/grub, selinux=1 enforcing=1,去除 enforcing=1,重启机器。Selinux模式已经正常。
(2)在Windows终端中,登录ftp FTP550报错
- 解决办法:
1)在虚拟机中检查用户和指定的文件目录是否授权
2)执行Windows+R,输入cmd,登录ftp 192.168.1.17测试
四、本地用户
4.1要求:
- 允许账号登录FTP服务器,但不能登录本地系统
- 对账号根目录进行限制,不能进入根目录以外的任何目录
4.2过程:
(1)创建用户,并禁止本地登录
useradd -s /sbin/nologin lisi
passwd lisi #设置密码
su lisi #测试是否能登录本地系统
在/home目录下,执行chmod 755 lisi增加权限
检查/etc/shells下是否添加/sbin/nologin,如果没有,执行vim /etc/shells进行添加。
(2)创建根目录,并赋予其他用户相应权限
mkdir -p /var/ftp/testup #创建上传文件夹
chmod o+w /var/ftp/testup #赋予其它用户写的权限
在/var/ftp/testup中创建1234.txt文件,并填写些东西。
(3)修改安全上下文,使根目录能够写入(上传)功能
chcon -t public_content_rw_t /var/ftp/testup
(4)修改配置文件,执行 vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #禁止匿名用户登录
local_enable=YES #允许本地用户登录
local_root=/var/ftp/testup
#设置本地用户的根目录为/var/ftp/testup
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port20=YES
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
(5)修改SELinux允许本地用户登录
getsebool -a|grep ftp
setsebool -P ftpd_full_access on
setsebool -P tftp_home_dir on
(6)重启vsftpd服务,使配置生效
systemctl restart vsftpd
- 设置防火墙规则
(8)测试
a. 执行Windows+r,输入cmd,登录ftp 192.168.1.16虚拟机地址,对账号根目录进行限制,不能进入根目录以外的任何目录,使用lisi用户 下载、上传、删除测试。
b. 在Windows资源管理器访问地址ftp://192.168.1.16
c. 将桌面的kylin.txt上传(拖拽)到var/ftp/textup目录文件中
4.3常见问题及解决办法:
安装完vsftpd软件后,SELinux安全策略默认是没有开启FTP服务,直接访问会报错500 OOPS,所有需要修改为允许使用FTP服务。
目标:希望FTP用户访问自己的家目录
尝试:命令行输入 setsebool -P ftp_home_dir=1
发现会报错:
- 解决办法:
麒麟V10服务器操作系统开始用tftp_home_dir来替代了ftp_home_dir,所以修改如下:
五、虚拟用户
使用虚拟用户比使用用本地用户和匿名用户的安全性更高,即使被破解了用户名和密码也不会影响本地系统,如果使用本地和匿名用户,也就相当于破解了本地的用户名和密码。
5.1要求:
- vuser1只能进行下载
- vuser2能进行下载和上传
- 对下载/上传流量进行控制
5.2过程:
(1)操作虚拟用户列表
a. 建立虚拟用户的用户名、密码列表的文本文件
vim /etc/vsftpd/vusers.list
b. 用db_load转换工具,将文本文件(上一步所建立的文件)转化为数据库文件
db_load -T -t hash -f vusers.list vusers.db
c. 修改虚拟用户列表文件及数据库文件访问权限。
chmod 600 /etc/vsftpd/vusers.*
(2)创建虚拟用户对应的本地用户
- 禁止他们本地登录
- 设置用户主目录的访问权限
(3)建立支持虚拟用户的PAM认证文件
vim /etc/pam.d/vusers.vu
注意:/etc/pam.d/vusers.vu中,空格用Tab键。
(4)修改/etc/vsftpd/vsftpd.conf主配置文件程度
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES #使用虚拟用户一定要启用本地用户
chroot_local_user=YES #将所有本地用户限制在家目录中(需添加)
guest_enable=YES #启用用户映射功能,允许虚拟用户登录(需添加)
pam_service_name=vusers.vu #指定对虚拟用户进行PAM认证的文件名vuser.vu
user_config_dir=/etc/vsftpd/vconfig #指定虚拟用户的配置文件的位置(需添加)
allow_writeable_chroot=YES
(5)为虚拟用户vuser1、vuser2建立各自独立的配置文件
vuser1
vim /etc/vsftpd/vconfig/vuser1
guest_username=svuser1 #设置vuser1对应的本地用户为svuser1
local_root=/var/ftp/share #用户登录后所在的目录
anon_world_readable_only=NO #允许浏览和下载
anon_max_rate=500000 #限定传输速率为500KB/s
vuser2
vim /etc/vsftpd/vconfig/vuser2
guest_username=svuser2
local_root=/var/ftp/noshare
anon_world_readable_only=NO
write_enable=YES //允许写入
anon_upload_enable=YES //允许上传
anon_mkdir_write_enable=YES //允许创建文件夹
anon_max_rate=1000000 //限定传输速度为1000KB/s
(6)修改SELinux允许本地用户登录和匿名用户具有写入权限
(7)重新加载vsftpd服务,使配置生效
systemctl restart vsftpd
(8)测试
打开Windows文件资源管理器登录ftp://192.168.1.16
在vuser1中只能进行下载测试
将文件666.txt下载(拖拽)到桌面
将文件test上传(拖拽)到桌面、新建文件夹、删除测试
- vuser2能进行上传、下载
将个人日日程APP.zip包上传到目录下
将123.txt下载(拖拽)到桌面
anonymous_enable=NO
local_enable=YES //使用虚拟用户一定要启用本地用户
chroot_local_user=YES //将所有本地用户限制在家目录中(需添加)
guest_enable=YES //启用用户映射功能,允许虚拟用户登录(需添vim /etc/vsftpd/vconfig/vtext2
guest_username=vtext2
local_root=/var/ftp/noshare
anonymous_enable=NO #禁止本地登录
write_enable=YES #允许写入
local_umask=022
anon_upload_enable=NO #允许上传
anon_mkdir_write_enable=NO #允许创建文件夹
idle_session_timeout=600
data_connection_timeout=120
anon_world_readable_only=NO #允许浏览和下载
max_clients=10 #客户端允许最大访问量
max_per_ip=5
local_max_rate=1048576 #本地用户最大传输速度
anon_max_rate=1000000 #限定传输速度为1000KB/s
5.3常见问题及解决办法:
- “Windows+r”-> cmd 登录ftp 192.168.8.17 发现500报错,没有读取chroot_list文件,这里需要我们自行创建chroot_list_file=/etc/vsftpd/chroot_list 用于指定用户列表文件,该文件用于控制哪些用户可以切换到FTP站点根目录的上级目录
- 解决办法:
在/etc/vsftpd下,创建chroot_list文件
再次登录Windows终端测试
vuser2上传、下载测试