家住海边喜欢浪:zhang789.blog.51cto.com
简介
ftp工作原理
常见的FTP服务
Vsftpd服务器的安装
Vsftpd.conf配置文件详解
配置FTP服务器实例
实例:配置匿名用户
实例:配置本地用户登录
实例:配置虚拟用户登录(MySQL认证)
实例:控制用户登录
实例:设置欢迎信息
分析vsftpd日志管理
FTP 是File Transfer Protocol(文件传输协议)的英文简称
,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。互联网上提供文件存储和访问服务的计算机,他们依照的是FTP协议提供服务!支持FTP协议的服务器就是FTP服务器!FTP协议提供存储和传输服务的一套协议!
下载"(Download)
和"上传"(Upload)
。”下载”文件就是从远程主机拷贝文件至自己的计算机上;”上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
ftp采用客户端/服务端的工作模式(C/S结构),通过TCP协议建立客户端和服务器之间的连接,但与其他大多数应用协议不同,FTP协议在客户端和服务端之间建立了两条通信链路,分别是控制链路和数据链路,其中,控制链路负责FTP会话过程中FTP命令的发送和接收,数据链路则负责数据的传输
FTP会话包含了两个通道,控制通道和数据通道,FTP的工作有两种方式,一种是主动模式,一种是被动模式,以FTPServer为参照物,主动模式,服务器主动连接客户端传输,被动模式,等待客户端的的连接
(无论是主动模式还是被动模式,首先的控制通道都是先建立起来的,只是在数据传输模式上的区别)
工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:
PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:
20号端口:数据传输端口 ftp-data
21号端口:指令传输端口
ASCII
、二进制
。假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝。
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
如在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果传输二进制文件,所有的位都是重要的。)
Windows下:Serv-U FTP Server
Linux下有代表性的FTP服务器软件是Wu-FTP
、ProFTP
及vsftpd
。Wu-FTP(Washington University FTP)
是由美国华盛顿大学开发的、以效率和稳定性为参考量的FTP软件。它的功能强大,配置较复杂,由于开发时间较早,应用十分广泛,也因此成为黑客们主要的攻击目标。Wu-FTP的早期各级版本不断出现安全漏洞,系统管理员不得不因安全因素而经常对其进行升级。ProFTP针对Wu-FTP的弱项而开发,除了在安全性方面进行了改进外,还具备设置简单的特点,并提供了一些Wu-FTP没有的功能,大大简化了架设和管理FTP服务器的工作。vsftpd
则凭借在安全性方面的出色表现,被很多大型网站广为采用。
vsftpd-2.2.2-11.el6_4.1.x86_64.rpm //服务端软件包
ftp-0.17-54.el6.x86_64.rpm //客户端软件包
lftp-4.0.9-1.el6.x86_64.rpm //类似ftp的客户端软件包,具有增强功能
1、安装vsftpd软件
[root@localhost ~]# yum -y install vsftpd
2、相关配置文件
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
/etc/vsftpd/vsftpd.conf //主配置文件,核心配置文件
/etc/vsftpd/ftpusers //黑名单,这个里面的用户不允许访问FTP服务器
/etc/vsftpd/user_list //白名单,允许访问FTP服务器的用户列表
3、启动服务
服务启动与关闭
[root@localhost vsftpd]# chkconfig vsftpd on
[root@localhost vsftpd]# service vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@localhost vsftpd]# netstat -antup | grep ftp
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 2579/vsftpd
tcp 0 0 10.1.252.97:21 10.1.250.64:54777 ESTABLISHED 2582/vsftpd
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
#################用户登陆控制##############
anonymous_enable=YES #接受匿名用户
no_anon_password=YES #匿名用户login时不询问口令
anon_root=(none) #匿名用户主目录
local_enable=YES #接受本地用户
local_root=(none) #本地用户主目录
deny_email_enable=YES #如果匿名用户需要密码,那么使用banned_email_file里面的电子邮件地址的用户不能登录
check_shell=YES #仅在没有pam验证版本时有用,是否检查用户有一个有效的shell来登录
userlist_enable=YES #若启用此选项,userlist_deny选项才被启动
userlist_deny=NO #若为YES,则userlist_file中的用户将不能登录,为NO则只有userlist_file的用户可以登录
#如果和chroot_local_user一起开启,那么用户锁定的目录来自/etc/passwd每个用户指定的目录
passwd_chroot_enable=NO #切换目录密码支持
ftp_username=FTP #定义匿名登入的使用者名称。默认值为ftp。
#################用户权限控制###############
write_enable=YES #可以上传(全局控制).
local_umask=022 #本地用户上传文件的umask
file_open_mode=0666 #上传文件的权限配合umask使用
anon_upload_enable=NO #匿名用户可以上传
anon_mkdir_write_enable=NO #匿名用户可以建目录
anon_other_write_enable=NO #匿名用户修改删除
anon_world_readable_only=YES #如果设为YES,匿名登入者会被允许下载可阅读的档案。默认值为YES。
#guest_enable=NO #如果开启,那么所有非匿名登陆的用户名都会被切换成guest_username指定的用户名
chown_uploads=YES #所有匿名上传的文件的所属用户将会被更改成chown_username
chown_username=lightwiter #匿名上传文件所属用户名
chroot_list_enable=YES #如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录
async_abor_enable=YES #允许使用"async ABOR"命令,一般不用
ascii_upload_enable=YES #使用ASSCII上传
ascii_download_enable=YES #用ASCII 模式下载
secure_chroot_dir=/usr/share/empty #这个选项必须指定一个空的数据夹且任何登入者都不能有写入的权限,当
vsftpd不需要file system 的权限时,就会将使用者限制在此数据夹中
默认值为/usr/share/empty
###################超时设置##################
idle_session_timeout=600 #空闲连接超时
data_connection_timeout=120 #数据传输超时
ACCEPT_TIMEOUT=60 #PAVS请求超时
connect_timeout=60 #PROT模式连接超时
################服务器功能选项###############
xferlog_enable=YES #开启日记功能
xferlog_std_format=YES #使用标准格式
#log_ftp_protocol=NO #当xferlog_std_format关闭且本选项开启时,记录所有ftp请求和回复,当调试比较有用.
pasv_enable=YES #允许使用pasv模式
#pasv_promiscuous=NO #关闭安全检查,Pasv向
#port_enable=YES #允许使用port模式
#prot_promiscuous #关闭安全检查,Port向
tcp_wrappers=YES #开启tcp_wrappers支持
pam_service_name=vsftpd #定义PAM 所使用的名称,预设为vsftpd
nopriv_user=nobody #当服务器运行于最底层时使用的用户名
pasv_address=(none) #使vsftpd在pasv命令回复时跳转到指定的IP地址.(服务器联接跳转?)
#################服务器性能选项##############
#ls_recurse_enable=YES #是否能使用ls -R命令以防止浪费大量的服务器资源
#one_process_model #是否使用单进程模式
listen=YES #绑定到listen_port指定的端口,既然都绑定了也就是每时都开着的,就是那个什么standalone模式
text_userdb_names=NO #当使用者登入后使用ls -al 之类的指令查询该档案的管理权时,预设会出
现拥有者的UID,而不是该档案拥有者的名称。若是希望出现拥有者的名
称,则将此功能开启。
use_localtime=NO #显示目录清单时是用本地时间还是GMT时间,可以通过mdtm命令来达到一样的效果
#use_sendfile=YES #测试平台优化
################信息类设置################
ftpd_banner=WelcomeFTP Server. #login时显示欢迎信息.如果设置了banner_file则此设置无效
dirmessage_enable=YES #允许为目录配置显示信息,显示每个目录下面的message_file文件的内容 #setproctitle_enable=YES #显示会话状态信息,关!
##############文件定义 ##################
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list#定义不能更改用户主目录的文件
userlist_file=/etc/vsftpd/vsftpd.user_list #定义限制/允许用户登录的文件
banner_file=/etc/vsftpd/banner #定义登录信息文件的位置
banned_email_file=/etc/vsftpd.banned_emails #禁止使用的匿名用户登陆时作为密码的电子邮件地址
xferlog_file=/var/log/vsftpd.log #日志文件位置
message_file=.message #目录信息文件
##############目录定义 #################
user_config_dir=/etc/vsftpd/userconf #定义用户配置文件的目录
#定义本地用户登陆的根目录,注意定义根目录可以是相对路径
也可以是绝对路径.相对路径是针对用户家目录来说的.
local_root=webdisk #此项设置每个用户登陆后其根目录为/home/username/webdisk
anon_root=/var/ftp #匿名用户登陆后的根目录
#############用户连接选项#################
max_clients=100 #可接受的最大client数目
max_per_ip=5 #每个ip的最大client数目
connect_from_port_20=YES #使用标准的20端口来连接ftp
listen_address=192.168.0.2 #绑定到某个IP,其它IP不能访问
#listen_port=2121 #绑定到某个端口
#ftp_data_port=2020 #数据传输端口
pasv_max_port=0 #pasv连接模式时可以使用port 范围的上界,0 表示任意。默认值为0。
pasv_min_port=0 #pasv连接模式时可以使用port 范围的下界,0 表示任意。默认值为0。
##############数据传输选项#################
anon_max_rate=51200 #匿名用户的传输比率(b/s)
local_max_rate=5120000 #本地用户的传输比率(b/s)
通过修改不同的配置文件选项,达到不同的实验效果
使用匿名FTP,用户无需输入用户名密码即可登录FTP服务器,vsftpd安装后默认开启了匿名ftp的功能,用户无需额外配置即可使用匿名登录ftp服务器
这个时候用户可以匿名方式登录ftp服务器,查看并下载匿名账户主目录下的各级目录和文件,但是不能上传文件或者创建目录
[root@localhost ~]# lftp 10.1.252.97
lftp 10.1.252.97:~> ls
drwxr-xr-x 2 0 0 4096 May 11 06:17 pub
lftp 10.1.252.97:/> cd pub/
lftp 10.1.252.97:/pub> put /etc/issue
put: Access failed: 550 Permission denied. (issue) //拒绝上传
lftp 10.1.252.97:/pub> get 1.txt //可以下载
lftp 10.1.252.97:/pub>
出于安全方面的考虑,vsftpd在默认情况下不允许用户通过匿名FTP上传文件,创建目录等更改操作,但是可以修改vsftpd.conf配置文件的选项,可以赋予匿名ftp更多的权限
实例1、允许匿名ftp上传文件
1、修改vsfpd.conf
write_enable=YES
anon_upload_enable=YES
2、更改/var/ftp/pub目录的权限,为ftp用户添加写权限,并重新加载配置文件
[root@localhost pub]# chmod o+w /var/ftp/pub/
[root@localhost pub]# service vsftpd reload
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
3、测试
lftp 10.1.252.97:/pub> put /etc/issue
79 bytes transferred //成功上传
lftp 10.1.252.97:/pub> ls
-rw-r--r-- 1 0 0 0 Jul 25 01:13 1.txt
-rw------- 1 14 50 79 Jul 25 01:19 issue
实例2、允许匿名ftp创建目录
1、修改vsftpd.conf文件
write_enable=YES
anon_mkdir_write_enable=YES
2、更改/var/ftp/pub目录的权限,为ftp用户添加写权限,并重新加载配置文件
[root@localhost pub]# chmod o+w /var/ftp/pub/
[root@localhost pub]# service vsftpd reload
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
3、测试
lftp 10.1.252.97:/pub> mkdir zabbix
mkdir ok, `zabbix‘ created
lftp 10.1.252.97:/pub> ls //创建成功
-rw-r--r-- 1 0 0 0 Jul 25 01:13 1.txt
-rw------- 1 14 50 79 Jul 25 01:19 issue
drwx------ 2 14 50 4096 Jul 25 01:23 zabbix
本地用户登录就是指使用Linux操作系统中的用户账号和密码登录ftp服务器,vsftp安装后默只支持匿名ftp登录,用户如果试图使用Linux操作系统中的账号登录服务器,将会被vsftpd拒绝
1、创建本地用户
[root@localhost pub]# useradd zhanghe
[root@localhost pub]# passwd zhanghe
Changing password for user zhanghe.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
2、修改vsftpd.conf文件
local_enable=YES
3、修改目录权限
[root@localhost html]# chmod o+w /var/www/html/
4、登录账户测试
1、安装MySQL并创建对应用户和表
[root@localhost ~]# yum install mysql-server -y #安装MySQL数据库
[root@localhost ~]# service mysqld start #启动数据库
[root@localhost ~]# mysql_secure_installation #初始化MySQL配置
创建用户并授权,创建对应数据库和表并插入两行数据
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> GRANT ALL ON vsftpd.* TO vsftpd@‘%‘ IDENTIFIED BY ‘123456‘;
Query OK, 0 rows affected (0.00 sec) #授予用户权限
mysql> CREATE DATABASE vsftpd; #创建数据库
Query OK, 1 row affected (0.00 sec)
mysql> use vsftpd; #进入指定默认数据库
Database changed
mysql> CREATE TABLE vsftpd.users (uid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE KEY,name VARCHAR(100) NOT NULL PRIMARY KEY,password CHAR(48) NOT NULL); #创建表
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO users (name,password) VALUES (‘tom‘,PASSWORD(‘mageedu‘)),(‘jerry‘,PASSWORD(‘mageedu‘)),(‘lucy‘,PASSWORD(‘mageedu‘)); #插入3行,用户为tom,jerry,lucy
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> FLUSH PRIVILEGES; #刷新权限
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
2、配置vsftpd基于MySQL表的虚拟用户
首先要完成基于MySQL表的认证,需要通过pam_mysql模块实现,我们要先安装pam_mysql
pam_mysql模块
CentOS 6:epel
CentOS 7:编译安装
[root@localhost ~]# yum -y install pam_mysql
准备要映射成为的系统账号:
[root@localhost ~]# mkdir -pv /ftproot/{pub,upload}
[root@localhost ~]# useradd -d /ftproot vuser
[root@localhost ~]# setfacl -m u:vuser:rwx /ftproot/upload
准备基于mysql认证的pam配置文件:/etc/pam.d/vsftpd.mysql
[root@localhost ~]# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so host=10.1.252.36 user=vsftpd passwd=123456 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so host=10.1.252.36 user=vsftpd passwd=123456 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
配置vsftpd启用虚拟用户,并使用指定的pam service:vsftpd.conf
//并确保pam_service_name选项的值如下所示
pam_service_name=vsftpd.mysql
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=vuser
配置每虚拟用户拥有不同的权限:vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_conf
为每个用户单独提供配置文件
[root@localhost ~]# mkdir /etc/vsftpd/vusers_conf
[root@localhost ~]# cd /etc/vsftpd/vusers_conf/
[root@localhost vusers_conf]# touch tom
[root@localhost vusers_conf]# vim tom
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
测试
[root@localhost ~]# ftp 10.1.252.97
Connected to 10.1.252.97 (10.1.252.97).
220 (vsFTPd 2.2.2)
Name (10.1.252.97:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,1,252,97,44,23).
150 Here comes the directory listing.
drwxr-xr-x 2 500 500 4096 Jul 25 01:47 51cto
drwx------ 2 501 501 4096 Jul 25 02:17 iii
drwxr-xr-x 2 500 500 4096 Jul 25 01:45 zabbix
226 Directory send OK.
ftp>
1、编辑vsftpd.conf文件
userlist_enable=YES
userlist_file=/etc/vsftpd/ftpuser_list
[root@localhost vsftpd]# vim user_list
或者:vim /etc/vsftpd/ftpuser_list
halt
mail
news
uucp
operator
games
nobody
tom //添加禁止登录的用户
2、登录测试
[root@localhost ~]# ftp 10.1.252.97
Connected to 10.1.252.97 (10.1.252.97).
220 (vsFTPd 2.2.2)
Name (10.1.252.97:root): tom
530 Permission denied.
Login failed.
ftp> ls
530 Please login with USER and PASS.
Passive mode refused.
ftp>
1、修改vsftpd.conf,并重载服务
ftpd_banner=Welcome to blah mageedu@ftp service.
[root@localhost vsftpd]# service vsftpd reload
2、测试
[root@localhost ~]# ftp 10.1.252.97
Connected to 10.1.252.97 (10.1.252.97).
220 Welcome to blah mageedu@ftp service.
Name (10.1.252.97:root): tom
1、修改vsftpd.conf文件
#ftpd_banner=Welcome to blah mageedu@ftp service.
banner_file=/etc/vsftpd/banner.txt
2、添加欢迎信息文件
[root@localhost vsftpd]# cat banner.txt
*************************************************
* *
* Welocome to Mageedu FTP server *
* *
*************************************************
3、测试
[root@localhost ~]# ftp 10.1.252.97
Connected to 10.1.252.97 (10.1.252.97).
220-*************************************************
220-* *
220-* Welocome to Mageedu FTP server *
220-* *
220-*************************************************
220
Name (10.1.252.97:root):
1、编译vsftpd.conf文件
dirmessage_enable=YES
2、在文件目录下创建欢迎信息文件并重载服务
[root@localhost vsftpd]# cat /var/www/html/.message
欢迎进入ftp根目录
[root@localhost html]# service vsftpd reload
3、测试
Name (10.1.252.97:root): tom
331 Please specify the password.
Password:
230-欢迎进入ftp根目录
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
[root@localhost ~]# cat /var/log/xferlog
Mon Jul 25 09:13:36 2016 1 10.1.252.96 0 /pub/1.txt b _ o a lftp@ ftp 0 * c
//提示时间:从10.1.252.96访问:访问的文件:b是二进制传输方式:o是服务器到客户端:a表示匿名
Mon Jul 25 09:19:49 2016 1 10.1.252.96 79 /pub/issue b _ i a lftp@ ftp 0 * c
//提示时间:从10.1.252.96访问:访问的文件:b是二进制传输方式:i是客户端到服务端:a表示匿名
Mon Jul 25 09:46:01 2016 1 10.1.250.64 49451 /var/www/html/Linux_Services_and_Security.txt b _ i r zhanghe ftp 0 * c
提示时间:从10.1.252.64访问:访问的文件:b是二进制传输方式:i是客户端到服务端:r表示真实用户:服务名ftp:认证方式0表示无:*无法获取用户ID:c表示传输已完成
[root@localhost ~]#
本文出自 “家住海边喜欢浪” 博客,请务必保留此出处http://zhang789.blog.51cto.com/11045979/1863022
原文地址:http://zhang789.blog.51cto.com/11045979/1863022