一、Linux中文件服务器介绍
文件服务器是一种很常见的服务器类型,在现实中应用很广泛,在Unix-Like操作系统中有很多的文件服务器,如NFS,是网络文件系统,在Unix-Like系统中实现主机之间文件共享,它不易与Windows进行交互,无法实现跨平台应用。
后来就相继出现了可以实现跨平台应用的文件服务器,如FTP和SAMBA服务器。FTP是工作于应用层的一种协议,可以实现跨平台和跨越互联网,但FTP服务在文件在线编辑方面功能很薄弱;而SAMBA服务则能够很好的实现文件的在线编辑,也可以实现跨平台,但是在实现跨越互联网方面则很困难。所以每一种文件服务器都有自己的优缺点,都有各自适用的领域,都是无法被取代的,在实际的应用中,我们应该根据自己的实际需求来选择适合自己的文件服务器,这样能够节省资源和提高工作效率。
二、ftp协议工作过程
FTP(File Transmission Protocol)是互联网最早的协议之一,比HTTP协议出现的还要早。
FTP协议有两个连接,一种称为命令连接(或者控制连接),工作在21号端口,它时时都在线,用来传输各种命令;一种称为数据连接,工作在20号端口,当用户使用get命令来下载文件的时候,重新打开一个连接来专门用于数据传输 。
从FTP服务器角度来说,数据连接又分为主动模式和被动模式,主动模式的工作方式是这样的:当客户端想要连接服务的时候,会自动打开本地的一个大于1023的随机端口(假如为1277),向服务端的21号端口发起连接请求,当服务器端收到命令连接请求的时候,会自动打开自己的20号端口,来响应客户端的(1277+1)端口,如果客户端的1277+1端口已经被占用,则继续连接客户端的1277+2端口,直到连接成功,然后将数据传送至客户端。当数据传输完成之后,数据连接会断开,命令连接则继续保持,直到客户端发起断开连接请求。被动模式的工作方式:在被动模式下,命令连接也是由客户端发起的,客户端会自动打开本地的一个大于1023的随机端口(假如为2300),向服务器端的21号端口发起连接请求。当服务器端收到请求后,它会告知客户端自己已经打开了一个端口(大于1023的随机端口,并附带两个随机数,假如为 24 23),可以下载数据,而客户端会使用自己的2300+1 端口,连接服务端通知的那个端口(此端口通常由服务端附带的随机数计算得来,一般为24*256+23),然后开始下载数据,直到连接超时或者数据下载完成,此连接断开。
FTP支持binary和Ascii两种数据传输格式,登录FTP的账户通常可以有:
(1)匿名用户:anonymous,登录后被服务器端自动映射为ftp用户,访问的目录是ftp用户的家目录,其对数据的操作权限取决于ftp用户所拥有的权限
(2)系统用户:系统上存在的某一个用户,登录FTP后,访问的是自己的家目录。
(3)虚拟用户:此类用户有账号和密码,但是不能用来登录系统,只能用来登录FTP服务,虚拟用户的账号和密码验证位置可以存放在file、Kerberos、Nis、Mysql、Ldap中
为了灵活的实现对登录某种服务的账号密码进行认证,有一个专门的认证模块来完成认证工作,就是PAM。PAM(Pluggable Authentication Modules)可插入式认证模块,是由Sun提出的一种认证机制。它通过提供一种动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而不需要更改服务程序,同时也便于向系统中添加新的认证手段。FTP服务也可以基于PAM框架提供的认证机制对登录账户进行认证。
目前最流行的FTP服务软件是Vsftpd(very secure ftp),一种安全的ftp服务软件,接下来就对其进行介绍。
1.vsftpd的主配置文件 /etc/vsftpd/vsftpd.conf 辅助配置文件有/etc/vsftpd/ftpusers /etc/pam.d/vsftpd
首先要将vsftpd软件包安装在系统上:
#yum install vsftpd –y
然后启动服务:
#service vsftpd start
#netstat –tunlp | grep 21
出现上图所示的内容,说明vsftpd 服务已经启动了。
2.主配置文件/etc/vsftpd/vsftpd.conf 中定义的用户操作命令:
anonymous_enable=YES|NO 定义是否允许匿名登录,一般都启用该项
local_enable= 定义是否允许本地用户(通常UID >500)登录
write_enable= 定义本地用户是否有写权限
anon_upload_enable= 定义匿名用户是否有上传文件的权限
anon_mkdir_write_enable= 定义匿名用户是否有创建目录的权限
anon_other_write_enable= 定义是否允许匿名用户删除和重命名目录的权限
anon_world_readable_only= 定义匿名用户只能下载那些全局可读的文件
xferlog_enable= 定义是否打开传输日志,仅仅是定义打开
xferlog_file=/path/to/file 传输日志文件,要实现此功能要将xferlog_enable=YES 启用
nopriv_user= ftpsecure 定义非特权用户
chroot_list_enable= 定义是否锁定本地用户登录后的家目录,如果锁定此登录的用户,他登录ftp后只能在自己的家目录中进行操作,不可以切换到系统的其他目录。
chroot_list_file=/path/to/file 定义锁定部分用户的家目录,将要锁定的用户写在/path/to/file 文件中即可,要与chroot_list_enable=YES 一起用。
chroot_local_user= 定义是否锁定所有的登录用户的目录。
pam_service_name=vsftpd 定义登录FTP的认证规则,如图所示:
#vim /etc/pam.d/vsftpd 此文件只定义登录规则
根据上图,处于安全性的考虑,只要是列在/etc/vsftpd/ftpusers 文件中的用户,都无法登录FTP服务,其中就有root用户,(root用户也是无法登录FTP服务的)。
#vim /etc/vsftpd/ftpusers 中定义的用户如下图所示:
所以如果想不让哪个用户登录FTP服务,直接将此用户添加到此文件中即可。
userlist_enable=YES|NO 是否启用用户文件列表
定义用户列表的文件是user_list 在/etc/vsftpd/ 目录下。
上面介绍过,所有列入/etc/vsftpd/ftpusers中的用户都无法登录FTP,那其他的没有列入ftpusers中的用户都可以登录FTP服务了。
如果我们想只允许系统中的某些个用户登录FTP服务,其他的不允许,我们就可以让userlist_enable=YES ,表示启用用户文件列表。但并不是启用了userlist_enable 就可以实现我们的要求,还需要借助于userlist_deny=YES|NO 来实现。
userlist_deny=YES 表示所有列入user_list 中的用户都拒绝登录,此时user_list 是一个黑名单
userlist_deny=NO 表示所有列入user_list 中的用户都允许登录,此时user_list 是一个白名单。
#vim /etc/vsftpd/user_list
就可以直接在里面定义用户了。
3.如何让vsftpd 支持SSL
FTP协议是一种很古老的协议了,无论是用户认证还是数据传输都是明文的,所以很不安全。一些网络攻击者利用嗅探器或者抓包工具就可以获取我们的登录账户和密码。使用SSL可以实现用户账号和密码以及传输数据的加密。
(1)首先提供FTP服务的服务器自己给自己颁发证书
#vim /etc/pki/tls/openssl.cnf 指定CA的路径
修改[CA_default] 下的 dir =../../CA 为 dir = /etc/pki/CA
保存退出
(2) 生成CA 私钥
#cd /etc/pki/CA
#(umask 077 ; openssl genrsa 1024 > private/cakey.pem)
#openssl req –new –x509 –key private/cakey.pem –out cacert.pem –days 3650
会提示输入证书的一些信息,如下图所示:
#mkdir certs newcerts crl 创建证书所需要的一些目录
#touch index.txt 创建证书索引文件
#echo 01 > serial 创建证书序列号文件并给它一个序列号
(3) 为vsftpd准备证书
#cd /etc/vsftpd
#mkdir ssl
# cd ssl
# (umask 077; openssl genrsa 1024 > vsftpd.key)
# openssl req –new –key vsftpd.key –out vsftpd.csr
此命令输入后,会提示输入证书的一些信息
然后会提示要不要签发证书,输入两次y 即签发完成。
# ls 会看到如下几个文件
vsftpd.crt vsftpd.csr vsftpd.key
(4) # vim /etc/vsftpd/vsftpd.conf
在最后一行添加如下内容
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
保存退出
# service vsftpd restart
(5) 开始验证使用SSL登录vsftpd
这里使用FileZilla客户端工具来登录FTP服务器,也可以使用其他的客户端工具来验证,如图所示:输入FTP服务器的IP地址和21端口,输入账户和密码,然后点击连接,连接成功后显示下图所示界面:
此时已经连接成功了,可以进行安全的数据下载等操作了。