What is FTP
大伙都知道FTP就是文件传输协议,File Transfer Protocol, 此协议诞生于互联网发展初期,历史悠久,主要用于文件共享,工作在TCP/IP应用层。
How it works
FTP主要工作在两种模式,一种是主动模式,也有人叫标准模式Standard; 另一种是被动模式,也叫pasv模式(passive),在这里所言主动与被动皆相对于服务器而言。
在主动模式下,客户端首先随机启动一个端口如2021向服务器TCP21端口发起连接,此过程就是我们常说的tcp三次握手,此过程即是FTP的控制连接过程,一旦连接建立除非服务端定义的超时时间或其他的连接策略,否则连接会一直保持下去。之后客户端根据需求向服务端发送相应的命令请求,服务端收到命令请求会根据本地的配置来验证客户端是否有相应的权限,如果有则通过20端口向客户端2022端口返回相应数据,如果2022端口非空闲则发送给2023,以此类推,直到找到空闲的端口为止;如果经查此人无此权限,则返回给相应的错误信息。
下图为我用Dia画的一个简单示意图,真的是不画图不知道,一画才顿感自己的知识掌握的程度是如此令人汗颜,愧哉愧哉,看着马哥讲解PPT上信手拈来,如此轻松,真的到自己来有点无从下手之感,归根结底还是知识掌握不扎实,动手太少,书到用时方恨少,不能做到拳不离手,曲不离口又何来如马哥般的烂熟于心?向马可致敬,为自己之前的眼高手低做深刻检讨,从现在开始,坚持博客总结,小伙伴们,能把自己的知识倒给别人跟自己会使用真是不是一个境界。子曰:学而时习之,不变乐乎;有朋自远方来,不亦悦乎;人不知而不愠,不亦君子乎?扯远了。。。 言归正传。。。
在主动模式下,有个缺陷,如果客户端开启了防火墙,未放行外来不明端口那么就悲剧了,连接建立却无法进行数据通信。于是乎被动模式就此诞生了:此模式下,客户端与服务端建立控制连接后,由服务端主动向客户端发出一个通知包告之自己数据服务工作在哪个端口,等待客户端有数据请求时连接上来。通常是这样的格式,e.g 100,56 客户端计算出100*256+56=25656然后随机打开一个端口去连接服务器25656端口建立数据连接通道。
此模式下仍旧会有问题产生,因为众所周知,通常情况下为了安全考虑,服务器一般是处于防火墙内的,而每次服务器通知给客户端的数据连接端口都是随机产生的,这样一来服务端的防火墙开放的端口就不好控制了,解决这个问题就需要防火墙的连接跟踪功能了,防火墙可以自动追踪到和这个连接相关的连接,打上related标签,这样只要是相关的连接,防火墙都会信任放行了,关于这个会在以后iptables应用中详细解释。
用户类型
FTP服务器支持的用户账号类型主要有三种
1. 匿名用户 anonymous
2. 系统用户 :提供服务的系统自身存在的用户
3. 虚拟用户
不过其实不管是哪种类型的用户,事实上最终都是系统用户,匿名用户和虚拟用户其实是映射到系统的一个用户上来,以这个用户的身份来访问系统共享出来的资源的。
安装配置
提供ftp服务的软件有很多,这里以红帽提供的vsftpd为例,vsftpd 是Very Secured ftp Deamon的缩写,由此可见安全是他的强项。
安装比较简单,我们直接用yum 安装就好了 ,软件很小
yum �Cy install vsftpd
安装完成可以用rpm �Cql vsftpd 查看都生成了哪些文件
[root@ha1 ~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd.log
/etc/pam.d/vsftpd
/etc/rc.d/init.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/sbin/vsftpd
/usr/share/doc/vsftpd-2.0.5
/usr/share/doc/vsftpd-2.0.5/AUDIT
/usr/share/doc/vsftpd-2.0.5/BENCHMARKS
我们可以看到vsftpd的配置文件是/etc/vsftpd/vsftpd.conf, 下面对配置文件的常用选项作简单说明:
anonymous_enable=yes|no 是否启用匿名用户
write_enable=yes|no 系统用户是否可以上传文件
anon_upload_enable=yes|no 是否允许匿名用户上传文件,此功能必须要先让对应的文件夹ftp用户具有rwx权限,由于vsftpd文件权限受SELinux控制,可用setfacl �Cm u:ftp:rwx /path/to/dir 给权限,不过一般匿名用户不会给这么大的权限
anon_mkdir_enable=yes|no 是否允许匿名用户创建文件夹
anon_other_write_enable=yes|no 是否允许匿名用户删除文件
dirmessage_enable=yes|no 此选项启用,可以对应目录下创建一个.message文件,里面定义想要显示的内容,当用户切换到此目录时,屏幕会打印出.message内定义好的内容
local_enable=yes|no 是否允许本地系统用户通过ftp登陆
chroot_local_user=yes 禁锢所有本地系统用户在其家目录, 如果需要禁锢部分用户可分别定义
chroot_local_enable=no|yes 此项若为yes则自定义的chroot_list中的用户是不被禁锢的,如果是no则定义的用户是被禁锢的
chroot_list_enable=yes
chroot_list_file=/etc/vsftpd/chroot_list
xferlog_enable=yes|no
xferlog_file=/path/to/file
listen=YES 服务使用独立守护进程,如果为NO则为瞬时守护进程, 需要在/etc/xinet.d/下为其提供相应格式的脚本或配置文件
pam_service_name=vsftpd pam认证的配置文件, 本例表示/etc/pam.d/vsftpd , 用户列表文件/etc/vsftpd/ftpuser
userlist_enable=YES 用户列表文件/etc/vsftpd/user_list
userlist_deny=YES|NO 如果此项为Yes则user_list中定义的用户不可以登陆ftp, 反之亦然.
配置FTP支持SSL加密传输
我们知道ftp在整个数据传输过程中都是明文的, 就连认证过程也不例外, 这样势必就会留下安全隐患, 一般我们实现ftp加密传输有两种方式, 一种是openssl自带的子系统sftp是基于ssh方式实现ftp的加密传输,这个系统安装完成就已经自带了,这里介绍另一种通过自签证书方式实现:
首先要配置服务器为证书服务器并颁发证书(这里简单说下过程,以后会有详细博文细说自签证书原理及生成过程)
1. 切换到CA目录并创建所需目录和文件
cd /etc/pki/CA
mkdir certs newcerts crl
touch index.txt
echo 01 > serial
2. 生成服务器私钥
[root@ha1 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
.............................................+++
.........................................................+++
e is 65537 (0x10001)
3. 生成服务器自签证书
[root@ha1 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.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) [GB]:CN
State or Province Name (full name) [Berkshire]:SH
Locality Name (eg, city) [Newbury]:SH
Organization Name (eg, company) [My Company Ltd]:linux
Organizational Unit Name (eg, section) []:Tech
Common Name (eg, your name or your server's hostname) []:linux.org
Email Address []:
4. 切换到vsftpd目录创建ssl证书存放目录
[root@ha1 CA]# mkdir /etc/vsftpd/ssl
[root@ha1 CA]# cd /etc/vsftpd/ssl
5. 生成ftp服务器私钥
[root@ha1 ssl]# (umask 077;openssl genrsa -out vsftpd.key 2048)
Generating RSA private key, 2048 bit long modulus
..............................................................................+++
...........................................+++
e is 65537 (0x10001)
6. 生成证书申请
[root@ha1 ssl]# openssl req -new -key vsftpd.key -out vsftpd.csr
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) [GB]:CN
State or Province Name (full name) [Berkshire]:SH
Locality Name (eg, city) [Newbury]:SH
Organization Name (eg, company) [My Company Ltd]:linux
Organizational Unit Name (eg, section) []:Tech
Common Name (eg, your name or your server's hostname) []:ftp.linux.org
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
7. 申请并颁发证书
[root@ha1 ssl]# openssl ca -in vsftpd.csr -out vsftpd.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Oct 28 10:34:34 2013 GMT
Not After : Oct 28 10:34:34 2014 GMT
Subject:
countryName = CN
stateOrProvinceName = SH
organizationName = linux
organizationalUnitName = Tech
commonName = ftp.linux.org
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
B6:78:71:21:4B:B0:F5:28:B5:9E:1C:E4:07:62:31:6D:FB:0C:43:B1
X509v3 Authority Key Identifier:
keyid:92:68:7A:CF:82:BF:8B:A8:73:1A:5B:60:3D:94:6C:8E:77:18:6A:A1
Certificate is to be certified until Oct 28 10:34:34 2014 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
8. 编辑配置文件,让vsftpd支持ssl
vim /etc/vsftpd/vsftpd.conf
#SSL support
ssl_enable=YES
ssl_sslv3=YES
ssl_sslv2=YES
ssl_tlsv1=YES
allow_anon_ssl=NO 匿名用户不启用ssl连接
force_local_data_ssl=YES 强制系统用户登陆时数据传输必须使用ssl连接
force_local_logins_ssl=YES 强制系统用户登陆认证必须使用ssl连接
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
9. 重启服务使配置生效
service vsftpd restart
下面就可以用客户端来登陆验证一下:
Openstack是我添加的本地用户,可以看到我没有使用ssl时系统是不让我登陆的.
现在改用ssl方式连接,可以从下图看到已经成功连接了,第一次连接时会询问是否信任证书,接受就好了,忘记截图了。
当然匿名用户不使用加密连接也是木有问题的:
本人水平有限,有疏忽不对的地方欢迎指正。