vsftpd详解

一、FTP简介
二、vsftp介绍
三、实验
四、虚拟用户

一、FTP简介
File Server:ftp,nfs,samba
    ftp:file transfer Protocol,21/tcp,20/tcp
    明文协议:认证以及数据传输都是明文
1.服务端和client端实现    
服务端:vsftpd,pureftpd,proftpd,..,FileZilla Server
客户端实现:
    Linux:ftp,lftp
    windows:cureftp,filezilla,Flashfxp
2.ftp的传输模式:ASCII传输模式和二进制数据传输模式。
    1.ASCII传输方式:假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
    2.二进制模式:在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。
3.FTP的工作模式
    FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。
    //21为命令端口,20位数据端口
Port模式:主动模式
    1.被动模式:c用任意的非特殊端口(N>1023)向服务器端(21)发送数据传输请求。
        然后c监听在N+1(N+1>1024),并通过N+1端口发送命令给s。服务器反过来会连接c的端口。
        服务器端端口:半随机,不再固定使用20/tcp,服务器在响应c命令连接请求的时候,已经回复本次通信使用的端口
    FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
    FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
    FTP服务器数据(20)端口到客户端端口(>1023)(服务器初始化数据连接到客户端数据端口)
    FTP服务器数据(20)端口接受客户端端口(>1023)(客户端发送ACK包到服务器的数据端口)
如图一:
1.png   

    在第1步中,客户端的命令端口与FTP服务器的命令端口建立连接,并发送命令“PORT 1027”。然后在第2步中,FTP服务器给客户端的命令端口返回一个"ACK"。在第3步中,FTP服务器发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接,最后客户端在第4步中给服务器端返回一个"ACK"。
    主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。

Pasv模式:被动模式 //当客户端通知服务器它处于被动模式时才启用。
    当开启一个FTP连接时,c打开两个任意的非特权本地端口(N >; 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,c不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P >; 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。    
    FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
    FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
    FTP服务器数据端口(>1023)接受客户端端口(>1023)(客户端初始化数据连接到服务器指定的任意端口)
    FTP服务器数据端口(>1023)到客户端端口(>1023)(服务器发送ACK响应和数据到客户端的数据端口)
如图二:

2.png    

    在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令"PORT 2024",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。
被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。详细内容参看附录1。 
第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。
    
下面是主动与被动FTP优缺点的简要总结: 
主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。    

主动FTP:
    命令连接:客户端 >1023端口 -> 服务器 21端口
    数据连接:客户端 >1023端口 <- 服务器 20端口 
被动FTP:
    命令连接:客户端 >1023端口 -> 服务器 21端口
    数据连接:客户端 >1023端口 -> 服务器 >1023端口 
ftp缺陷:
    1.支持系统用户,可能导致数据泄露
    2.明文传输

二、vsftp介绍
vsftpd:very secure ftp daemon
用户:资源位于用户的家目录下
    匿名用户(映射到某一固定的系统用户):例如ftp,vsftpd /目标访问的资源,就是用户的家目录,/var/ftp
    本地用户(系统用户);root及系统用户(0-999);每个用户都可以通过ftp访问自己的家目录
    虚拟用户()
    
中间框架:
    名称解析:nsswitch(name service switch)名称服务转换 //数字名称和字符串名称中间的转换,例如uid和用户名的转换,port和protocol等
    密码认证:pam(plugable authentication modules) 
vsftpd实现的名称解析,借助于pam实现,但是httpd不是
    ssh就支持pam,vsftpd也支持pam,不是必须得使用pam
    
1.安装
yum install vsftpd -y
id ftp //家目录是/var/ftp ,是系统用户
程序:/usr/sbin/vsftpd
配置文件:/etc/vsftpd/vsftpd.conf
CentOS 6:
    /etc/rc.d/vsftpd
CentOS 7:
    /usr/lib/systemd/system/vsftpd.service
    systemctl enable vsftpd
    systemctl start vsftpd
浏览器:ftp://192.168.4.118/
lftp:lftp -u wolf,wolf 192.168.4.118 //默认用户可以直接登录自己的家目录
    lcd /etc/
    put fstab //可以直接上传文件
    
配置:/etc/vsftpd/vsftpd.conf
1)匿名服务器的连接

1
2
3
4
5
6
7
8
9
10
11
anonymous_enable= yes  (允许匿名登陆)
dirmessage_enable=YES  // 切换目录显示的提示信息,默认该目录下的 ".message"
message_file    // 可以手动指定消息文件,lftp命令不会显示, ftp 命令可以显示
local_umask=022 (FTP上本地的文件权限,默认是077)
connect_from_port_20=YES  // 服务器是否能够工作于主动模式,并不影响真正使用的模式,服务器工作于主动还是被动,取决于client端 *
xferlog_enable= yes  (激活上传和下传的日志)
xferlog_std_format= yes  (使用标准的日志格式)
ftpd_banner=XXXXX (欢迎信息)
pam_service_name=vsftpd (验证方式)*
listen= yes  (独立的VSFTPD服务器)*
listen_ipv6=YES

功能:只能连接FTP服务器,不能上传和下传
注:其中所有和日志欢迎信息相关连的都是可选项,打了星号的无论什么帐户都要添加,是属于FTP的基本选项

2)开启匿名FTP服务器上传权限

1
2
3
4
5
Anon_upload_enable= yes  (开放上传权限)  // 即使启用了也不会生效,因为 /var/ftp/ 的属主和属组是root,只有属主有写权限    ,匿名使用的是 ftp 用户的权限
     // 修改fs权限,即可setfacl,或者修改目录的权限, //setfacl  -m u: ftp :rwx  /var/ftp/anon ,或者
anon_mkdir_write_enable= yes  (可创建目录的同时可以在此目录中上传文件)
write_enable= yes  (开放本地用户写的权限)
anon_other_write_enable= yes  (匿名帐号可以有删除的权限)

3)开启匿名服务器下传的权限
anon_world_readable_only=no  //只读
注:要注意文件夹的属性,匿名帐户是其它(other)用户要开启它的读写执行的权限
(R)读-----下传 (W)写----上传 (X)执行----如果不开FTP的目录都进不去 

4)普通用户FTP服务器的连接(独立服务器)

1
2
3
4
local_enble= yes  (本地帐户能够登陆)  // 所有非匿名用户和虚拟用户,要想能使用,必须启用该项
write_enable=no (本地帐户登陆后无权删除和修改文件)
local_umask=022  // 本地用户上传文件的权限,匿名用户上传文件的权限默认是 umask =077
write_enable=YES  // 全局配置

功能:可以用本地帐户登陆vsftpd服务器,有下载上传的权限
注:在禁止匿名登陆的信息后匿名服务器照样可以登陆但不可以上传下传 

5)用户登陆限制进其它的目录,只能进它的主目录

1
2
3
4
5
chroot_local_user= yes  (本地所有帐户都只能在自家目录)  // 禁锢所用本地用户,注意要求用户对家目录不能有写权限, ftp 也是如此
设置指定用户执行chroot
chroot_list_enable= yes  (文件中的名单可以调用) //  这两项不用同时使用
chroot_list_file=/任意指定的路径 /vsftpd .chroot_list  
     #chroot_list_file=/etc/vsftpd/chroot_list //文件中,只需要写用户名即可

注意:vsftpd.chroot_list 是没有创建的需要自己添加,要想控制帐号就直接在文件中加帐号即可 

6)限制本地用户访问FTP

1
2
3
4
userlist_enable=YES     // 启用时,vsftpd将加载一个由userlist_指令指定的用户列表文件;此文件中的用户是否能访问vsftpd服务取决于userlist_deny指令
                     // 默认为NO
userlist_deny=no (名单中的人不允许访问)
userlist_file=/指定文件存放的路径/ (文件放置的路径)

注:开启userlist_enable=yes匿名帐号不能登陆 

7)安全选项

1
2
3
4
5
6
7
8
9
10
11
idle_session_timeout=600(秒) (用户会话空闲后10分钟)
data_connection_timeout=120(秒) (将数据连接空闲2分钟断)
accept_timeout=60(秒) (将客户端空闲1分钟后断)
connect_timeout=60(秒) (中断1分钟后又重新连接)
local_max_rate=50000(bite) (本地用户传输率50K)  //0 表示不受限制
anon_max_rate=30000(bite) (匿名用户传输率30K)
pasv_min_port=50000 (将客户端的数据连接端口改在
pasv_max_port=60000 50000—60000之间)
max_clients=200 (FTP的最大连接数)
max_per_ip=4 (每IP的最大连接数)
listen_port=5555 (从5555端口进行数据连接) // 默认21

8)修改匿名用户上传的文件属性

1
2
3
#chown_uploads=YES     //是否更改
#chown_username=whoever //启用chown_uploads指令时,将文件的属主修改为指定的用户,默认是root用户    
chown_uploads_mode  // 匿名用户上传的文件的权限,默认0600

9)日志信息:

1
2
3
4
xferlog_enable=YES // 默认 /var/log/vsftpd .log
xferlog_file= /var/log/xferlog  // 指定日志目录,传输日志
xferlog_std_format=YES  // 是否使用,默认日志记录格式
vsftpd_log_file= 定义默认日志记录位置

10)其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#nopriv_user=ftpsecure    
#nopriv_user=ftpsecure    
#async_abor_enable=YES    
#ascii_upload_enable=YES   //设定以anscii上传,和下载
#ascii_download_enable=YES
#deny_email_enable=YES    //拒绝使用邮箱登录
#banned_email_file=/etc/vsftpd/banned_emails //邮箱登录的标语    
#ls_recurse_enable=YES    listen=NO  //enable将使用独立守护进程
pam_service_name=vsftpd
     userlist_deny=YES  // 表示此列表(user_list)为黑名单,默认为YES,默认文件 /etc/vsftpd/user_list
     userlist_deny=NO  // 表示此列表(user_list)为白名单
userlist_file   // 默认为 /etc/vsftpd/user_list ,
     # If userlist_deny=NO, only allow users in this file
     # If userlist_deny=YES (default), never allow users in this file
         用户列表, /etc/vsftpd/user_list ,和ftpusers
         //ftpuser :是黑名单,禁止用户登录名单,user_list:是允许登录的用户

tcp_wrappers=YES
    查看man vsftpd.conf 查看所有配置指令
    
tcpwrapper
    任何以xinetd管理的服务都可以通过TcpWrapper来设置防火墙。
    ldd `which sshd ` | grep wrap
    可以看出ssh服务确实添加了wrapper模块。
     /etc/hosts.allow 、/etc/hosts.deny 这两个文件的关系为allow文件优先,
        若分析到的没有记录在allow文件当中,则以deny文件来判断。
     daemon list : client list [:option[:option]]
     例如:telnet
    in.telnetd(进程名字) : 10.0.0.66 : spawn echo 'date' %c to %s >/var/log/wra.log
    
三、实验
实验一:修改默认ftp监听端口号
1、编辑/etc/vsftpd/vsftpd.conf 文件,在该配置文件中添加此行:listen_port=811
2、编辑/etc/services 文件,将其中的
ftp 21/tcp  改为 ftp 811/tcp ,
ftp 21/udp  改为 ftp 811/tcp
3、执行/etc/init.d/vsftpd restart 重新启动vsftpd 服务。启动完成后可以使用
netstat -tnulp | grep vsftpd

实验二:匿名用户启用
anonymous_enable=yes
anon_upload_enable=YES
anon_mkdir_write_enable=YES
并且chmod a+wx 对其他人对该目录有写入的权限

实验三:Localuser
chroot_local_user=yes #是否将所有用户限制在主目录,YES为启用 NO禁用.(该项默认值是NO,即在安装vsftpd后不做配置的话,ftp用户是可以向上切换到要目录之外的)
或者如下两个指令都可以实现chroot本地用户,但是对于lcd命令无效,限制的是cd命令
chroot_list_enable #是否启动限制用户的名单 YES为启用  NO禁用(包括注释掉也为禁用)
chroot_list_file=/etc/vsftpd/chroot_list #是否限制在主目录下的用户名单,至于是限制名单还是排除名单,这取决于chroot_local_user的值,我们可以这样记忆: chroot_local_user总是一个全局性的设定,其为YES时,全部用户被锁定于主目录,其为NO时,全部用户不被锁定于主目录。那么我们势必需要在全局设定下能做出一些“微调”,即,我们总是需要一种“例外机制",所以当chroot_list_enable=YES时,表示我们“需要例外”。而”例外“的含义总是有一个上下文的,即,当”全部用户被锁定于主目录“时(即chroot_local_user=YES),"例外"就是:不被锁定的用户是哪些;当"全部用户不被锁定于主目录"时(即chroot_local_user=NO),"例外"“就是:要被锁定的用户是哪些。这样解释和记忆两者之间的关系就很清晰了!
如图:

问题:Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
allow_writeable_chroot=YES  //添加这个选项


四、虚拟用户
虚拟用户:
    1.基于db文件来存放 
        奇数行:用户名
        偶数行:密码
    2.基于mysql服务
        //vsftpd实现用户认证,需要基于pam实现,但是pam不支持到mysql中
        /lib64/security/目录中有很多pam模块,并没有pam关于mysql的库
        pam-mysql.sourceforge.net
    
1.安装pam-mysql驱动
    yum -y install pam-devel mariadb-server mariadb-devel openssl-devel
    //pam链接msyql的时候,可能需要ssl进行链接
    ./configure --with-mysql=/usr/local/mysql --with-openssl  --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security/
    make && make install
    ls /usr/lib64/security/ //将会生成pam_mysql.so,pam_mysql.la
    
2.配置vsftpd
1)配置mariadb,
    vsftpd库:
    MariaDB [vsftpd]> create table users (
        -> id int auto_increment not null primary key,
        -> name char(30) not null,
        -> password char(48) binary not null );
insert into users (name,password) value ('jerry',password('jerry'));
insert into users (name,password) value ('tom',password('tom'));
grant all privileges on vsftpd.* to 'vsftpd'@'127.0.0.1' identified by 'vsftpdusers';
flush privileges;

mysql -uvsftpd -p -h127.0.0.1
    
2)配置pam
cat /etc/vsftpd/vsftpd.conf
    pam_service_name=vsftpd.mysql //vsftpd将要使用哪一个pam文件实现认证,相对路径,相对于/etc/pam.d目录
vim /etc/pam.d/vsftpd.mysql //自己建立一个pam文件
    auth required pam_mysql.so user=vsftpd passwd=vsftpdusers host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
    account required pam_mysql.so user=vsftpd passwd=vsftpdusers host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
    //一个用于验证账户,一个验证密码,都必须满足才通过认证,编译目录中有README文件说明了用法
    
创建一个系统用户,用来映射虚拟用户
useradd -s /sbin/nologin -d /ftproot vuser
chmod go+rx /ftproot/   //让其他用户能读

3)修改配置文件:
vim /etc/vsftpd/vsftpd.conf
    pam_service_name=vsftpd.mysql
    guest_enable=YES //启动来宾账户
    guest_username=vuser  
    
    anonymous_enable=YES //这几个都保证yes,这样用于虚拟账户才能用
    local_enable=YES
    write_enable=YES
systemctl restart vsftpd
    chmod -w /ftproot/
注:实验中虚拟用户,只能使用没有写权限的/ftproot
    虚拟用户用的是匿名用户的权限,匿名为vuser
    //匿名用户,也就是来宾用户,需要映射为一个系统用户
    
3.匿名用户添加写权限
    mkdir /ftproot/{pub,upload}
    chown vuser /ftproot/upload/   //fs级别的权限
    vim /etc/vsftpd/vsftpd.conf
        anon_upload_enable=YES
    ftp //tom登录
    cd upload //只有在该目录中有权限
    lcd /etc  
    put fstab //tom和jerry用户都有上传的权限
4.区分tom和jerry的权限,//不同匿名用户,匿名为同一系统用户,分配不同权限
    cd /etc/vsftpd/
    vim vsftpd.conf
        anon_upload_enable=YES  //关闭该权限
    mkdir vuser.conf.d ;cd vuser.conf.d
    vim tom
        anon_upload_enable=YES
    vim jerry
        anon_upload_enable=NO
    vim ../vsftpd.conf
        user_config_dir=/etc/vsftpd/vuser.conf.d/
    systemctl restart vsftpd
    ftp 192.168.4.118 //分别使用tom和jerry测试
        
小结:
    ftp:命令连接,数据连接(port,pasv)
    vsftpd:/etc/vsftpd/vsftpd.conf
    用户类型:
        匿名用户:
        本地用户:
            禁锢本地用户
            黑名单
            白名单
        虚拟用户
            权限

实验四:虚拟用户(pam_userdb.so)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost vsftpd] # mkdir /etc/vsftpd/virtual/
[root@localhost vsftpd] # touch /etc/vsftpd/vuer.txt
[root@localhost vsftpd] # cat /etc/vsftpd/vuer.txt
ftpuser1
ftpuser1
ftpuser2
ftpuser2
[root@localhost vsftpd] # db_load -T -t hash -f /etc/vsftpd/vuer.txt /etc/vsftpd/vuser.db //yum install db4-utils db4-devel db4-4.3
[root@localhost vsftpd] # vim /etc/pam.d/vsftpd  //之前有的加注释
auth    required    pam_userdb.so    db= /etc/vsftpd/vuser
account    required    pam_userdb.so    db= /etc/vsftpd/vuser
[root@localhost vsftpd] # chmod 700 vuser.db 
[root@localhost vsftpd] # useradd -d /ftpdir vuser
[root@localhost vsftpd] # chown vuser.vuser /ftpdir/
[root@localhost vsftpd] # usermod -s /sbin/nologin vuser
[root@localhost vsftpd] # vim /etc/vsftpd/vsftpd.conf 
guest_enable=YES                 ####激活虚拟账户  
guest_username=vuser            ####把虚拟账户绑定为系统账户vuser  
pam_service_name=vsftpd         ####使用PAM验证  
user_config_dir= /etc/vsftpd/vsftpd_user_conf  
设置用户虚拟用户配置文件,与虚拟用户同名
[root@localhost ~] # touch  /etc/vsftpd/vsftpd_user_conf/ftpuser1
[root@localhost ~] # touch  /etc/vsftpd/vsftpd_user_conf/ftpuser2
文件内容: // 随意填写
     anon_world_readable_only=NO                ###浏览FTP目录和下载  
     anon_upload_enable=YES                       ###允许上传  
     anon_mkdir_write_enable=YES                 ###建立和删除目录  
     anon_other_write_enable=YES                 ####改名和删除文件  
     local_root= /ftpdir/                     #### 指定虚拟用户在系统用户下面的路径,限制虚拟用户的家目录,虚拟用户登录后的主目录 。

  













本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/2064842 ,如需转载请自行联系原作者
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值