FTP服务概述:
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。
FTP(File Transfer Protocol: 文件传输协议)作用: Internet 上用来传送文件的协议
常见FTP服务器:
windows:Serv-U FTP Server,filezilla_server
Linux:ProFTPD:(Professional FTP daemon)一个Unix平台上或是类Unix平台上(如Linux, FreeBSD等)的FTP服务器程序。
今天的主角:vsftp
VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全。
特点:
它是一个安全、高速、稳定的FTP服务器;
模式: C/S 模式
端口:
[root@localhost ~]# vim /etc/services
20 (传数据) 21 (传指令)
fsp(File Service Protocol): 文件服务协议。
工作流程(原理):
这里的主动和被动,是相对于的FTP server 端来判断的
如果server 去连接client 开放的端口,说明是主动的,相反,如果client去连接server开放的端口,则是被动的
安装vsftp服务器端、客户端
[root@localhost ~]# yum -y install vsftpd lftp
lftp
注:从RHEL6开始,系统镜像中默认没有ftp客户端命令。取而代之的是lftp命令
Linux客户端:
lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。llftp的界面非常好一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。
配置文件位置:
2.vsftpd 相关文档
/etc/vsftpd/vsftpd.conf:vsftpd 的核心配置文件
/etc/vsftpd/ftpusers:用于指定哪些用户不能访问FTP 服务器。 黑名单
/etc/vsftpd/user_list:指定允许使用vsftpd 的用户列表文件。 白名单
vim /etc/vsftpd/user_list
#如果userlist_deny= YES(默认),绝不允许在这个文件中的用户登录ftp,甚至不提示输入密码
#prompt 提示
/etc/vsftpd/vsftpd_conf_migrate.sh:是vsftpd 操作的一些变量和设置脚本
/var/ftp/:默认情况下匿名用户的根目录
启动服务
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# systemctl enable vsftpd
##注意关闭iptables 和selinux
[root@localhost ~]# netstat -antup | grep ftp
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 11725/vsftpd
为什么看不到20端口?。
因为没有数据通信。
ftp服务使用
linux登录
[root@test178 pub]# lftp 10.10.100.187
lftp 10.10.100.187:~>
windows:
通过浏览器访问或 打开文件夹,在地址栏输入地址:ftp://10.10.100.178/
修改配置文件,实战举例
搭建一台功能简单的FTP 服务器,允许所有人上传和下载文件,并允许创建用
户自己的目录。
分析:
允许所有人上传和下载文件需要设置成允许匿名用户登录并且需要将允许匿名用户上传功能
开启
anon_mkdir_write_enable 字段可以控制是否允许匿名用户创建目录。
[root@localhost vsftpd]# cp vsftpd.conf vsftpd.conf.back #养成好习惯,修改配置文件之前,先备份
[root@localhost vsftpd]#vim /etc/vsftpd/vsftpd.conf #修改以下内容
允许匿名用户访问
anonymous_enable=YES
允许匿名用户上传文件并可以创建目录
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES ##默认没有,需要的可以手动添加下这行,匿名用户可删除文件
配置好保存退出
因为没有创建用户,所以现在是使用ftp默认匿名的方式登录,进行上传文件,需要注意上传文件夹的权限问题,匿名用户的文件路径/var/ftp/put/,查看发现这个文件的属主是root,我们需要将文件夹的属主修改成ftp
[root@test178 pub]# ll -d /var/ftp/pub/
drwxr-xr-x. 2 root root 6 10月 31 2018 /var/ftp/pub/
[root@test178 pub]#chown -R ftp.ftp /var/ftp/pub/
[root@test178 pub]# ll -d /var/ftp/pub/
drwxr-xr-x. 2 ftp ftp 6 10月 31 2018 /var/ftp/pub/
这样重启服务,就可以正常上传文件了
在上传文件,或者创建文件夹报错550 create directory operation failed
确定前面的配置没有错检查selinux
解决办法
如何禁止SELinux。
#vim /etc/selinux/config
修改为:SELINUX=disabled
如果不想重启系统的话,在终端中输入:setenforce 0。
重新启动vsftpd进程,问题解决。
但是可以删除文件夹了,这个参数对匿名用户来说权限太大,不安全,均衡使用这个参数
注意,默认匿名用户家目录的权限是755,这个权限是不能改变的。切记!
需求:搭建一台FTP,要求使用系统用户登录,但不能登录本地系统,不允许匿名用户登录,并将账号的目录限制为/var/www/html,不能进入其他目录。
思路
创建用户和设置密码指定根目录
修改配置文件
重启服务
根据思路进行操作
创建用户并设置密码指定目录
[root@localhost178 ~]# mkdir -p /var/www/html #创建ftp根目录
[root@localhost178 ~]# useradd -s /sbin/nologin test1
[root@localhost178 ~]# useradd -s /sbin/nologin test2
[root@localhost178 ~]# echo "123456"|passwd --stdin test1
更改用户 test1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost178 ~]# echo "123456"|passwd --stdin test2
更改用户 test2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost178 ~]# chmod -R o+w /var/www/html/
[root@localhost178 ~]# ll -d /var/www/html/
drwxr-xrwx. 2 root root 6 10月 17 08:54 /var/www/html/
配置vsftpd.conf 主配置文件并作相应修改
[root@localhost178 vsftpd]# grep -v "^#" /etc/vsftpd/vsftpd.conf #修改后的配置文件
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
local_root=/var/www/html
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
这样登录还是会报错,登录失败: 530 Login incorrect.
解决办法
1,查看防火墙,selinux ,先把这两个都暂时关闭
[root@localhost178 vsftpd]# setenforce 0
[root@localhost178 vsftpd]# systemctl stop firewalld
2,tail -f /var/log/secure查看错误信息,根据相应信息修改
如果没有信息,则修改/etc/pam.d/vsftpd文件,注释掉auth required pam_shells.so,重启服务
[root@localhost178 pam.d]# cat vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
[root@localhost178 pam.d]# systemctl restart vsftpd
这样就登录上来 了,登录会提示不安全的服务器,原因是服务器没有配置证书。
linux系统登录方式
[root@localhost178 pam.d]# lftp 10.10.100.178 -utest1,123456
lftp IP -u用户,密码
ftp根目录文件夹属主是root
配置vsftpd,使用SSL证书加密数据传输
FTP与HTTP一样缺省状态都是基于明文传输,希望FTP服务器端与客户端传输保证安全,可以为FTP配置SSL
使用OpenSSL生成自签证书
1.ftp安装在公网的时候建议配置证书
2.内网安全要求比较高的时候
没有证书传输文件的时候,文件是明文传输,
配置证书文件传输,是加密进行传输,更加安全
生成证书
[root@localhost178 vsftpd]# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3560
Generating a 2048 bit RSA private key
...............+++
...........................................................+++
writing new private key to 'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:zh #国家
State or Province Name (full name) []:gd #省
Locality Name (eg, city) [Default City]:sz #市
Organization Name (eg, company) [Default Company Ltd]:xs #组织名称
Organizational Unit Name (eg, section) []:xs #组织部门名称
Common Name (eg, your name or your server's hostname) []:xs.com #组织域名
Email Address []:xs@qq.com #邮件地址
OpenSSL 简单参数解释:
req - 是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令。
x509 - X.509 证书数据管理。
days - 定义证书的有效日期。
newkey - 指定证书密钥处理器。
keyout - 设置密钥存储文件。
out - 设置证书存储文件,注意证书和密钥都保存在一个相同的文件
创建证书文件存放目录
[root@local vsftpd]# mkdir .sslkey #为了安全,创建一个隐藏的文件夹存放证书
[root@local vsftpd]# cp vsftpd.pem .sslkey/
[root@lcal vsftpd]# chmod 400 .sslkey/vsftpd.pem #权限的设置
修改配置文件,支持SSL
[root@localhost178 vsftpd]# vim vsftpd.conf
#config ssl
ssl_enable=YES #启用SSL支持
#allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
#上面四行force 表示强制匿名用户使用加密登陆和数据传输
ssl_tlsv1=YES
#ssl_sslv2=NO
#ssl_sslv3=NO
#require_ssl_reuse=NO #不重用SSL会话,安全配置项
ssl_ciphers=HIGH #允许用于加密 SSL 连接的 SSL 算法。这可以极大地限制那些尝试发现使用存在缺陷的特定算法的攻击者
rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem
#定义 SSL 证书和密钥文件的位置
注意:上面的配置项不要添加到vsftpd.conf 文件最后,否则启动报错
配置FileZilla客户端验证:
连接成功,发现可以使用TLS加密传输了
注意: 在工作中,内网FTP传输,可以不用证书加密传输
如果FTP服务器在公网,为了数据的安全性,就一定要配置证书加密传输
ftp模式
分为主动模式(active mode)和被动模式(passive mode),ftp是tcp连接,所以要进行三次握手
- active和passive模式的配置:
在命令行输入vim /etc/vsftpd/vsftpd.conf:
1> active mode:
pasv_enable=NO (passive模式关闭)
pasv_min_port=3000
pasv_max_port=4000
port_enable=YES (active模式开启)
connect_from_port_20=YES (即默认情况下,FTP PORT主动模式进行数据传输时使用20端口(ftp-data)。YES使用,NO不使用。)
2>passive mode:
pasv_enable=YES
pasv_min_port=3000
pasv_max_port=4000
设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意(1024 – 65535端口)。默认值为0。把端口范围设在比较高的一段范围内,比如3000-4000。
在linux上,如果不配置pasv_enable=NO,默认是passive模式。