FTP:
文件传输协议(File Transfer Protocol 简称FTP),采用c/s模式工作
控制端口:21
数据端口:20
FTP工作原理:
1、主动模式 standard
FTP客户端从任意一个非特权端口N(N>1024)发送PORT命令给FTP服务端控制端口21,
其中PORT命令包含客户端接收数据的端口N+1,此时服务器收到了这条PORT命令,
它就会让自己的数据端口20与客户端的数据端口N+1连接。此时如果传输数据的话,
就需要服务端与客户端重新建立一个新的连接来传输数据。
2、被动模式 passive
FTP客户端从任意一个非特权端口N(N>1024)发送PASV命令给FTP服务端控制端口21,
其中PASV命令包含客户端接收数据的端口N+1,此时服务端会随机开启一个
高端端口P(P>1024),并发送PORT命令给客户端,PORT命令包括服务端的数据端口P,
然后客户端从数据端口N+1发起一个请求连接服务端数据端口P,这时产生了数据连接。
使用被动模式就不需要服务端与客户端重新建立一个新的连接来传输数据。
不同点:
传输数据的连接方式不同:主动模式是服务端向客户端发起数据连接,
而被动模式是客户端向服务端发起数据连接。
相同点:
都是使用21号控制端口进行用户验证和管理。
FTP服务器的部署与配置
1、安装FTP服务所需的软件包
yum -y install vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
匿名用户的主目录:/var/ftp/
匿名用户的下载目录:/var/ftp/pub/
2、主配置文件/etc/vsftpd/vsftpd.conf
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO ------控制匿名用户访问权限,YES表示允许匿名访问FTP服务器。
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
local_enable=YES ---控制FTP用户是否可以访问FTP服务器,YES表示允许FTP用户访问FTP服务,
同时当selinux处于enforcing状态时,需要调整ftp_home_dir的bool值。
(但是从RHEL7上安装vsftpd3.0版本后,就是没有ftp_home_dir这个bool值了,
所以就不需要修改此bool值)
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES ----控制FTP用户对FTP服务器的可写权限,YES表示可写。
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022 ----FTP用户创建目录或文件时的umask值
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
#anon_upload_enable=YES ----控制匿名用户上传文件的权限,YES表示允许匿名用户上传文件。
当selinux处于enforcing状态时,需要调整ftpd_anon_write和ftpd_full_access的bool值。
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES ---控制匿名用户创建目录的权限,YES表示允许匿名用户创建目录
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES ---显示说明性文件
#
# Activate logging of uploads/downloads.
xferlog_enable=YES ---控制文件在传输过程中是否被日志记录,YES表示记录
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES ----强制使用20端口进行数据传输
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES --设置为YES时,默认匿名用户上传文件的所有者为FTP
#chown_username=whoever ---whoever修改为ftp用户,匿名用户上传文件的所有者将变成该FTP用户。
#
# You may override where the log file goes if you like. The default is shown
# below.
#xferlog_file=/var/log/xferlog ---设置FTP服务日志文件位置
#
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
xferlog_std_format=YES ---设置标准的FTP Xferlog模式
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600 ---控制连接超过600秒空闲时,自动断开连接
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120 ---控制数据连接建立后120秒内无交互时,自动断开连接。
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure ---非特权状态下使用ftpsecure用户
You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service. ---成功连接FTP服务器时的提示语
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES ---禁止下载文件到指定的邮箱地址中
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails ---设置电子邮箱地址
# the user does not have write access to the top level directory within the
# chroot)
#chroot_local_user=YES ---控制FTP用户能否离开自己的FTP主目录,
YES表示禁止FTP用户离开自己的FTP主目录。
#chroot_list_enable=YES ---控制列表中的FTP用户能否离开自己的FTP主目录,
YES表示禁止列表中的FTP用户离开自己的FTP主目录。默认是允许
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list ---FTP用户列表文件,每一行一个用户名
#ls_recurse_enable=YES ---控制FTP用户是否能使用类似 ls -R命令,
默认是禁止的,YES表示允许使用
# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=NO ---控制是否侦听ipv4套接字,NO表示不侦听ipv4套接字,
不能同时设置侦听ipv4和ipv6套接字
listen_ipv6=YES --控制是否侦听ipv6套接字,YES表示侦听ipv6套接字,
默认情况下侦听ipv6的任意地址,此时能够接受来自客户端ipv6的连接和ipv4的连接
pam_service_name=vsftpd ---设置PAM认证文件的名称
userlist_enable=YES ---控制是否启动/etc/vsftpd/user_list文件,YES表示启动
tcp_wrappers=YES ---控制是否启用/etc/hosts.allow和/etc/hosts.deny配置文件
管理网络主机对FTP服务的访问,YES表示启用。
示例:匿名用户
1、设置允许匿名用户访问FTP服务器
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES ---启用匿名登录
pasv_enable=YES ---启用passive被动模式
pasv_min_port=10000 ---开启最低的pasv端口,建议采用大于1024的高端口
pasv_max_port=11000 ---开启最高的pasv端口
systemctl restart vsftpd
firewall-cmd --add-service=ftp --permanent
firewall-cmd --add-port=10000-11000/tcp --permanent
firewall-cmd --reload
2、设置允许匿名用户访问FTP服务器时能够在/var/ftp/pub目录下进行文件上传
ls -ld /var/ftp/pub --查看/var/ftp/pub目录权限,发现其他用户对该目录没有写入权限
setfacl -m u:ftp:rwx /var/ftp/pub ---设置ftp用户对/var/ftp/pub目录有读写权限
setsebool -P ftpd_anon_write on
setsebool -P ftpd_full_access on
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_upload_enable=YES
systemctl restart vsftpd
3、设置允许匿名用户访问FTP服务器时能够在/var/ftp/pub目录下创建目录
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_mkdir_write_enable=YES
systemctl restart vsftpd
注意:除了上面设置外,还需要ftp服务账户必须对/var/ftp/pub目录具有读写的权限,
而且ftpd_anon_write和ftpd_full_access的bool设置为on。
这两步在第2题中已经完成了,所以不需要操作了。
4、设置允许匿名用户访问FTP服务器时能够对/var/ftp/pub目录中的文件或
目录进行重命名或删除操作
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_other_write_enable=YES
systemctl restart vsftpd
注意:出了上面设置外,还需要ftp服务账户必须对/var/ftp/pub目录具有读写的权限,
而且ftpd_anon_write和ftpd_full_access的bool设置为on。
这两步在第2题中已经完成了,所以不需要操作了
示例:FTP用户
useradd ftpuser1
useradd ftpuser2
useradd ftpuser3
echo redhat | passwd --stdin ftpuser1
echo redhat | passwd --stdin ftpuser2
echo redhat | passwd --stdin ftpuser3
1、设置允许FTP用户访问FTP服务器
vim /etc/vsftpd/vsftpd.conf
local_enable=YES
write_enable=YES
systemctl restart vsftpd
注意:
1、通过FTP用户访问FTP服务器时,默认访问的主目录为FTP用户家目录,
此时FTP用户可以在自己的家目录下上传文件、下载文件、创建目录、
重命名文件或者目录、删除文件或目录,同时FTP用户可以切换至其他目录中访问
2、local_enable=YES write_enable=YES
这两个值为默认设置,另外在配置文件中提示还需要对ftp_home_dir
这个bool值进行设置为on。但是,在RHEL7版本中安装的vsftpd 3.0版本
已经没有定义这个bool值了。具体情况根据版本而定
2、设置FTP用户访问FTP服务器时,将所有FTP用户访问的目录限制在自己的主目录中,
不允许FTP用户访问其他目录( FTP用户对自己的家目录不能有写入的权限)
分析:
此时必须将ftpd_full_access的bool值设置为on,
同时FTP用户对自己家目录不能有写入权限,
否则会提示登录失败 500 OOPS:vsftpd:refusing to run with writable root
inside chroot()从2.3.5之后,vsftpd增强了安全检查,
如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!
如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以用命令chmod u-w /home/ftpuser1去除用户主目录的写权限,
注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加下列两项中的一项
allow_writeable_chroot=YES
setsebool -P ftpd_full_access on
chmod u-w /home/ftpuser1
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
systemctl restart vsftpd
3、设置FTP用户访问FTP服务器时,将部分FTP用户访问的目录限制在自己的主目录中,
其他FTP用户仍然可以访问其他目录。
如果限制ftpuser1和ftpuser2用户访问的目录限制在自己的家目录中,
ftpuser3可以访问其他目录
setsebool -P ftpd_full_access on
chmod u-w /home/ftpuser1
chmod u-w /home/ftpuser2
vim /etc/vsftpd/vsftpd.conf
#chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
vim /etc/vsftpd/chroot_list
ftpuser1
ftpuser2
systemctl restart vsftpd
chroot_local_enable=YES时:
chroot_list_enable=YES 代表/etc/vsftpd/chroot_list文件中定义的FTP用户不受限,
其他的ftp用户受限
chroot_list_enable=NO 代表所有的FTP用户受限
chroot_local_enable=NO时:
chroot_list_enable=YES 代表只限制/etc/vsftpd/chroot_list文件中定义的FTP用户
chroot_list_enable=NO 所有的FTP用户均不受限。
ftpusers和user_list文件默认禁用这些用户访问ftp服务器
如果想仅允许某些FTP用户访问ftp服务器的话,需要将userlist_deny=NO写入
到vsftpd.conf这个配置文件中,然后把允许访问的ftp用户写入user_list文件中即可