Linux下FTP服务与虚拟用户及SSL加密
FTP的客户端有很多种,较为常见的是网页浏览器,如:firefox等。
一般操作系统都提供了基础的命令行方式的FTP客户端。输入“ftp”或者“ftp服务器地址”就可以使用命令行方式。下面列举了一些常用的FTP命令。
远程命令:
cd 改变所在目录
ls 查看当前目录下文件列表
get 从服务器下载当个文件
mget 从服务器下载多个文件
put 向服务器上传单个文件
mput 向服务器上传多个文件
pwd 显示服务器当前目录
quit 退出ftp程序
本地命令:
!ls 显示客户端当前目录下的文件列表
!cd 改变客户端当前所在目录
!pwd 显示客户端当前目录
VSFTPD服务器
VSFTPD的安装
我们为了安装安装包的简单,首先先架设一个本地的YUM仓库,配置本地YUM源。后期会介绍YUM的配置。使用yum 安装vsftpd
[[email protected] /]# yum install vsftpd -y
如果系统中开启了SELinux,那么需要执行下面的命令,使得VSFTPD可以被正常访问
[[email protected] /]# setsebool -P ftpd_disable_trans 1
VSFTPD安装完成后,默认的主配置文件是 /etc/vsftpd/vsftpd.conf 。下面按自上而下的顺序介绍此文件的参数设定。
anonymous_enable=YES
允许匿名访问,即允许anonymous账号访问FTP服务。
local_enable=YES
允许使用本机帐号登录
write_enable=YES
用户可以读写
local_umask=022
默认掩码为022,即默认创建的文件权限是755
#anon_upload_enable=YES
是否允许匿名用户上传文件夹,默认是注释掉的
#anon_mkdir_write_enable=YES
是否允许匿名用户创建新文件夹。默认注释掉的
dirmessage_enable=YES
若目录下存在.message文件,则显示该文件内容
xferlog_enable=YES
默认上传/下载的日志文件被记录在/var/log/vsftpd.log中
connect_from_port_20=YES
从20端口连接。默认状况下,20为FTP的数据传输端口
#chown_uploads=YES
#chown_username=whoever
允许新上传文件的拥有者为whoever.两行同时出现的,默认注释掉
#xferlog_file=/var/log/vsftpd.log
日至位置设定
xferlog_std_format=YES
使用标准格式登记上传/下载记录
#data_connection_timeout=120
传输延时时间,单位为秒
#nopriv_user=ftpsecure
使用特殊用户ftpsecure。这里可以把ftpsecure账户作为一般访问用户,即所有连接FTP服务器的用户都具有ftpsecure用户名。为了安全起见,可以在/etc/passwd中将ftpsecure的用户的SHELL设定为/sbin/nologin。
#ftpd_banner=Welcome to blah FTP service.
登录提示信息
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
若启用上述两项设定,则可以在/etc/vsftpd/banned_emails中建立黑名单
pam_service_name=vsftpd
列出与VSFTPD相关的PAM文件
userlist_enable=YES
当此项设置为yes的时候,启用配置文件/etc/vsftpd.user_list。此时有两种情况
a.此时若没有userlist_deny=NO,则/etc/vsftpd.user_list中存在的用户不可以访问VSFTPD服务器
b.此时若存在userlist_deny=NO,则仅接受/etc/vsftpd.user_list中存在的用户的登录请求
当此项设定为NO是,不会启用配置文件/etc/vsftpd.user_list
tcp_wrappers=YES
启用TCP Wrapper支持
以上是默认安装后,VSFTPD主配置文件出现的设定选项。除此之外,还有一些常用选项
guest_enable=YES
guest_username=ftp
guest用户名,即所有非匿名用户将具有guest用户身份
local_root=/var/ftp
anon_root=/var/ftp
设定本机用户和匿名用户的FTP根目录
use_localtime=YES
是否使用本机时间,若设定为NO,则使用格林尼治时间
#idle_session_timeout=600
客户端在600秒内没有任何动作,则服务器自动断开与客户端连接
max_clients=0
最大客户连接数
max_per_ip=0
每个客户端的最大连接数
local_max_rate=0
本地账户的最大传输速率,单位为秒,0为不限制
anon_max_rate=0
匿名用户的最大传输速率
前面已经介绍了VSFTPD的安装,安装后需要启动服务
[[email protected] /]# service vsftpd start
设置开机启动
[[email protected] /]# chkconfig vsftpd on
VSFTPD虚拟用户
设置虚拟用户使其仅能访问VSFTPD,而不可以登录系统
首先,我们需要确认安装盘上的db4软件包已经装上,如果没有,就要手动安装
[[email protected] /]# rpm -qa |grep db4
db4-utils-4.7.25-16.el6.x86_64
db4-4.7.25-16.el6.x86_64
[[email protected] Packages]# rpm -ivh db4-utils-4.7.25-16.el6.x86_64.rpm
[[email protected] Packages]# rpm -ivh db4-4.7.25-16.el6.x86_64.rpm
当我们用yum 安装时,就已经默认安装好了。所以不用手动安装的了
接下来,需要创建虚拟用户的用户名和密码,创建一个文档,假定这个文件为/tmp/id.txt 内容如下
xingzheson
123456
zhulaoshi
654321
这里的单数行为用户名,而双数行为用户名对应的密码。生产用户账号的数据库文件并设定数据文件权限,最后删除/tmp/id.txt
[[email protected] tmp]# db_load -T -t hash -f /tmp/id.txt /etc/vsftpd/vsftpd_id.db
[[email protected] tmp]# chmod 600 /etc/vsftpd/vsftpd_id.db
[[email protected] tmp]# rm -f /tmp/id.txt
下面设定vsftpd.conf 文件
接着建立PAM文件/etc/pam.d/vsftpd.virtual,
[[email protected] tmp]# vi /etc/pam.d/vsftpd.virtual
内容如下:
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_id
account required pam_userdb.so db=/etc/vsftpd/vsftpd_id
session reiuired pam_loginuid.so
下面建立相关的目录:
[[email protected] tmp]# mkdir /home/vsftpd
[[email protected] tmp]# mkdir -p /home/vsftpd/{xingzheson,zhulaoshi}
[[email protected] tmp]# chown -R ftp:ftp /home/vsftpd/
重启服务,如果系统中开启了SELinux,那么需要执行以下命令,允许虚拟用户存取其家目录
[[email protected] tmp]# setsebool -p allow_ftpd_full_access 1
如果设置正确,则虚拟用户可以登录服务器。输出如下:
虚拟用户的配置部分完全正常,但是会发现一个问题,那就是本地用户无法正常登录VSFTPD服务器了。接下来我们找找原因
a.用户的FTP根目录变为了/home/vsftpd/$USER.也就是说,如果一个本地用户zhu尝试登录VSFTPD,那么服务器会试图寻找/home/vsftpd/zhu这个目录。但是zhu的家目录应该是/home/zhu,而/home/vsftpd/zhu 并不存在,所以登录失败
b.即使我们可以用一些方法让zhu的家目录可以被重新定位到/home/zhu(可以用链接的方法),但是由于zhu登录VSFTPD时的身份实际上是ftp(因为启用了guest_enable=YES),所以还是无权访问自己的家目录
c.及时上述两个问题解决了,还是无法登录。哎。因为在PAM文件/etc/pam.d/vsftpd.virtual中,只设定了虚拟用户的验证。zhu是本地用户,该用户的身份验证并不在虚拟用户的数据库中,所以无法登录。
解决办法:
接下来,修改/etc/vsftpd/vsftpd.conf文件,在其中加入 user_config_dir=/etc/vsftpd/virtua
重启服务,建立/etc/vsftpd/virtua文件夹,并在其中建立文本文件/etc/vsftpd/virtua/zhu
[[email protected] vsftpd]# mkdir /etc/vsftpd/virtua
[[email protected] vsftpd]# vim /etc/vsftpd/virtua/zhu
内容如下:
local_root=/home/zhu (指定zhu真正的家目录)
guest_username=zhu (修改zhu的身份。这里的zhu的身份就不是ftp了)
经过这样的修改之后,本地用户和虚拟用户就都可以登录VSFTPD了,并且在增加了user_config_dir之后,就可以给每个用户单独添加不同的访问规则和权限,无论该用户是本地用户还是虚拟用户。
配置具有SSL的VSFTPD
为了提升VSFTPD的传输安全性,这里可以使用SSL加密。
首先用OpenSSL为VSFTPD生成安全证书。这里生成的证书有效期为365天
[[email protected] virtua]# cd /etc/vsftpd/
[[email protected] vsftpd]# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem
生成证书的时候需要填写一些信息,任意写都可以,输出如下
Generating a 1024 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]:CN
State or Province Name (full name) []:JiangSu
Locality Name (eg, city) [Default City]:NanH^H^H^H^H^H^Hj
Organization Name (eg, company) [Default Company Ltd]:ITD^H^H
Organizational Unit Name (eg, section) []:whatever
Common Name (eg, your name or your server's hostname) []:Martian
Email Address []:[email protected]
接下来编辑/etc/vsftpd/vsftpd.conf,加入以下内容
ssl_enable=YES
allow_anon_ssl=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem
重启服务,这样带有SSL加密的·VSFTPD服务器就假设好了。
转载于:https://blog.51cto.com/520yatou/1434541