一、ftp介绍

    常见的文件共享服务有:ftp、nfs和samba。其中ftp是一种应用层的服务,nfs是基于内核来实现的网络文件共享服务,samba是在Linux上实现CIFS(SMB)协议来解决跨平台的文件共享服务。

    ftp是相当古老的传输协议之一,他最主要的功能是在服务器与客户端之间进行文件的传输。这个古老的协议使用的是明码传输方式,因此在使用当中会有相当多的安全问题。为了更安全的使用ftp协议,主要介绍较为安全但功能很少的vsftpd这个软件。

    ftp的传输使用的是tcp协议,是一种C/S模式架构,服务端通过ftp服务向用户提供ftp服务,客户端通过客户端命令连接服务端来进行指令的执行与数据的传输。ftp连接前会先进行三次连接握手以建立TCP会话连接。

二、ftp功能

    1、数据的传输。ftp的数据传输连接还有主动和被动方式。主动方式是指数据传输连接服务端主动创建,服务端主动去连接客户端的某个随机端口;被动方式是指数据传输连接由客户端的某个随机端口去连接服务端的某个随机端口。

    2、实现不同等级的用户身份验证,这样就可以根据不同的用户身份来分配不同的数据操作权限。ftp默认情况下有三种不同的身份,分别是:实体的账号(real user)、访客(guest)、匿名用户(anonymous)。

    3、限制用户的活动目录。主要是为了避免用户在Linux系统中随意活动,所做的限制是只允许在自己的家目录里面活动,防止其他用户随意改动家目录的内容,对系统也起到一定的保护作用。

三、安装vsftpd

    vsftpd全名叫very secure ftp daemon,意思是非常安全的ftp服务。vsftpd所对应的rpm程序包叫做vsftpd,这里通过yum的方式来进行安装。

2EOY`RBQ44YC[GK@U~2FHEI.png

安装完成之后启动vsftpd服务,

    centos 6 启动vsftpd

@TV2[7WB695LFCRL$~VY[J2.png

    centos 7 启动vsftpd

NK0@[_DR1CHJSN@58X49Z6Q.png

这样FTP服务器便搭建完成。但此时还不能访问FTP服务器,因为服务器默认情况下关闭了防火墙,此时我们还需使用‘iptables -F’命令关闭防火墙,这样客户端才可以访问FTP服务器。

}MQGILU{90Y2NDA_H3Y@C]0.png

四、vsftpd配置文件及目录

    1、用户认证配置文件:/etc/pam.d/vsftpd

    2、配置文件目录:/etc/vsftpd

    3、主配置文件:vsftpd.conf

    4、匿名用户(映射为ftp用户)共享资源位置:/var/ftp

    5、系统用户通过ftp访问的资源的位置:用户自己的家目录

    6、虚拟用户通过ftp访问的资源的位置:给虚拟用户指定的映射成为的系统用户的家目录

vsftpd的配置文件常用的修改内容:

1、匿名用户的设置:

    anonymous_enable=YES  (Default: NO) 是否开启匿名用户
    anon_upload_enable=YES (Default: NO) 是否允许匿名用户上传,如启动,还需让ftp用户对/var/ftp/pub及其他需要上传的目录设置wx权限
    anon_mkdir_write_enable=YES (Default: NO) 是否允许匿名用户创建目录,如启动,还需让ftp用户对/var/ftp/pub及其他需要上传的目录设置wx权限
    anon_other_write_enable=YES (Default: NO) 匿名用户除了具有写权限外是否可以删除及重命名或更改服务器上的其他文件
    no_anon_password=YES (Default: NO) 使用ftp客户端登录匿名时,是否密码,如为NO,即默认,则需要输入任意密码,如为YES,直接登录,不用输入。
    anon_umask (Default: 077) 匿名用户上传时的默认掩码权限。

2、系统用户的设置:

    local_enable=NO (Default: YES) 是否开启Linux本地用户登录
    write_enable=NO (Default: NO) 是否允许Linux本地用户上传文件
    local_umask=022 (Default: 077) 本地用户上传文件的默认权限

3、访客的设置:

    guest_enable (Default: NO) 所有的非匿名用户都映射为了guest用户
    guest_username (Default: ftp) guest用户是谁,默认ftp

4、禁锢所有的ftp本地用户于其家目录中:

    chroot_local_user=YES 将linux系统用户的根目录设置为家目录,注意在Centos7中该目录对用户不能有w权限,
当为YES时,所有人都不能越狱,当为NO时,所有人都能越狱。

5、禁锢文件中指定的ftp本地用户于其家目录中:

    chroot_list_enable=YES  越狱例外,下一行一定要有。当上一行为YES是,为白名单,当为NO时,为黑名单
    chroot_list_file=/etc/vsftpd/chroot_list

6、日志:

    vsftpd_log_file (Default: /var/log/vsftpd.log) vsftpd格式日志的存放路径
    xferlog_enable=YES  (Default: no) 是否开启上传、下载日志
    xferlog_std_format  (Default: no) 是否使用wuftp格式 
    xferlog_file (Default: /var/log/xferlog) xferlog的存放路径,将登陆及文件上传下载等信息记录到系统日志当中
    dual_log_enable=YES (Default: NO) ,vsftpd_log_file=/var/log/vsftpd.log 是否同时开启vsftpd格式的日志,该格式记录信息更多,不只upload/downloads

7、改变上传文件的属主:

    chown_uploads=YES (Default: NO) 匿名用户上传文件的所属人是否要更改。如YES,则更改为chown_username所指定的      
    chown_username  (Default: root)

8、vsftpd 使用 pam 完成用户认证,其用到的 pam 配置文件:

    pam_service_name=vsftpd

9、是否启用控制用户登录的列表文件

    userlist_enable=YES  (Default: NO) 是否启用用户过滤功能。如YES,则开启,过滤文件由userlist_file决定
    userlist_file (Default: /etc/vsftpd/user_list) 过滤文件路径 
    userlist_deny (Default: YES) 当该值为YES时userlist为黑名单,反之为白名单,/etc/vsftpd/ftpuser 固定是黑名单,写入其中的用户一定不能登录ftp

10、连接限制:

    max_clients (Default: 2000) 允许同时登录的最大客户端请求数
    max_per_ip 每个ip可同时发起的并发请求数

11、传输速率:

    anon_max_rate (Default: 0) 匿名用户上传和下载的最大速度,单位字节。
    local_max_rate (Default: 0) Linux本地用户上传和下载的最大速度,单位字节。

12、主动模式的设置:

    ftp_data_port (Default: 20) 主动模式使用的端口
    connect_from_port_20 (Default: YES) 是否允许主动传输,主动模式的端口号
    connect_timeout (Default: 60) 在主动连接方式下,数据连接超时时长,在60秒内得不到客户端响应时强行断开

13、被动模式的设置:

    pasv_enable=YES (Default: YES) 是否支持数据的被动模式传输,这里一定要设置为YES
    pasv_min_port=9527 (Default: 0) 被动模式,服务端开启的随机端口的最小值
    pasv_max_port=9529 (Default: 0) 被动模式,服务端开启的随机端口的最大值
    accept_timeout (Default: 60) 在被动模式下,数据连接超时时长,在60秒内得不到客户端响应时强行断开

12、其他相关参数:

    data_connection_timeout (Default: 300) 数据连接无数据传输时的超时时长,300秒后无数据传输时断开连接
    listen_port (Default: 21) FTP命令通道的监听端口
    listen=YES (Default: ) 表示vsftpd使用的命令通道监听端口,即以standalone(单机模式)启动
    banner_file Default: (none) 登录时的欢迎信息。不是所有客户端都可见,当该行存在时,则优先于ftpd_banner 
    dirmessage_enable (Default: NO) 每进入一个目录时,如果该目录下有.message文件,则将其内容展现出来,不是所有客户端都可见
    max_clients (Default: 2000) 允许同时登录的客户端请求数
    nopriv_user  (Default: nobody) 客户端建立命令通道时,服务端与之连接的进程的所属用户
    idle_session_timeout  (Default: 300) 无命令操作超时时长
    ascii_upload_enable=NO  
    ascii_download_enable=NO

五、ftp用例

    1、在centos6中以非独立方式运行vsftpd

  1. 安装vsftpd和xinetd服务

    yum -y install vsftpd xinetd

M4(8UU)1_D$5GNP%D1%U6SU.png

2.修改配置文件/etc/vsftpd/vsftpd.conf

    vim /etc/vsftpd/vsftpd.conf
       listen=NO

WK[HH89Q2}%Z(JEGW_3OP7W.png

3.修改配置文件/etc/xinetd.d/vsftpd

    vim /etc/xinetd.d/vsftpd 
      service ftp
      {
              flags           = REUSE
              socket_type     = stream
              wait            = no
              user            = root
              server          = /usr/sbin/vsftpd
              log_on_failure  += USERID
              disable         = no
      }

_DT5@(Q1O$QS)F@0ITQI6OH.png

4.重启xinetd服务,并修改/etc/xinetd.d/下某个服务的配置文件,将disable=yes改为no并重启/etc/init.d/xinetd服务使之生效。

    service xinetd restart
    chkconfig xinetd on

59]K6A4GAHA}OV5_H@C`2ED.png

    2、实现基于SSL的FTPS
1.查看是否支持SSL

Z$Q4%@T0EPY[%0@I1@%P{Z2.png

2.进入/etc/pki/tls/certs路径下,生成以vsftpd.pem命名的自签名证书,并复制证书到/etc/vsftpd目录下

    cd /etc/pki/tls/certs/
    make vsftpd.pem
    cp vsftpd.pem /etc/vsftpd/

5}65F8_ANNUC)14`H@P30C5.png
HXWG(]BA6V%23%_[]WOQ`1C.png

3.编辑配置文件

    vim /etc/vsftpd/vsftpd.conf 
      ssl_enable=YES                启用SSL
      allow_anon_ssl=NO             匿名不支持SSL
      force_local_logins_ssl=YES       本地用户登录加密
      force_local_data_ssl=YES         本地用户数据传输加密
      rsa_cert_file=/etc/vsftpd/vsftpd.pem

LS55O@OP5`SP]_4]SDWC_UI.png

4.重启服务,用客户端测试
U]MG$YO]NV4I_C)NUU1(EJB.png
    3、实现基于文件验证的vsftpd虚拟用户

虚拟用户:

    所有虚拟用户会统一映射为一个指定的系统账号:访问共享位置,即为此系统账号的家目录

    各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

  1. 创建虚拟用户的账号密码数据库文件

    vim ftpvusers 
      zhangsan
      redhat
      lisi
      redhat
      wangwu
      redhat

W7M0YJDW}%RHS1X0VD]UPL0.png    

    db_load -T -t hash -f ftpvusers /etc/vsftpd/ftpvusers.db

%PN@K8BSEDV$RUV$~$M8N6A.png

    cd /etc/vsftpd/
    chmod 600 ftpvusers.db

G$KW97)I1Q34DQ}814U0T6V.png
2.创建映射用户

    useradd -d /var/ftpsite -s /sbin/nologin ftpvuser

0`C[%IN4`A)AXGH0JVTU7]Q.png

]99_ZNC1)0IZ$`]8EGV{Q5N.png

    chmod u-w /var/ftpsite/

PBOU01~0QR@E1{J{L$`P`YD.png

U07)3G[WS~6$DGZM7`~BWOP.png

3.编辑主配置文件

    vim /etc/vsftpd/vsftpd.conf 
      guest_enable=YES
      guest_username=ftpvuser
      pam_service_name=vsftpd.vuser

ND%]L1JT3)XW]F6@]BIX8@0.png

4.编辑pam文件

    vim /etc/pam.d/vsftpd.vuser 
      auth       required     pam_userdb.so db=/etc/vsftpd/ftpvusers
      account    required     pam_userdb.so db=/etc/vsftpd/ftpvusers

3RD)WN$B1UCOXTMC[R%HZAE.png
5.配置子配置文件

    vim /etc/vsftpd/vsftpd.conf 
    user_config_dir=/etc/vsftpd/configdir

1TYMIBLR}]0)7GE8$G@8D0S.png

    mkdir /etc/vsftpd/configdir  创建配置文件存放的路径
    vim zhangsan                 创建各用户自己的配置文件
      anon_root=/var/ftpsite     修改登录目录为指定的目录
      anon_max_rate=102800       文件下载的最大速度

4I%~PGUXD3THG13X()6SAP6.png
6.重启服务,使生效,并测试

    systemctl restart vsftp

4JU47D{JOMY]T7DT}$8CA`O.png

)9(X`C@A27KZ4YIL]4G3@_Y.png

    4、实现基于MySQL验证的虚拟用户

1.编译安装pam_mysql

在centos6,可通过epel源直接yum安装yum -y install pam_mysql
在centos7,需要下载源码包,手工编译安装
yum -y groupinstall "Development tools" 
yum -y install mariadb-devel pam-devel openssl-devel mariadb-server mariadb glibc-headers gcc-c++
tar xvf pam_mysql-0.7RC1.tar.gztar.gz -C /usr/local/src/  下载pam_mysql-0.7RC1.tar.gz并解压
cd /usr/local/src/pam_mysql-0.7RC1/
 ./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/securit
make && make install

2.创建数据库

MariaDB [(none)]> create database ftpdb;
grant all on ftpdb.* to [email protected]'%' identified by 'centos';

spacer.gifQQ图片20190111112348.png

3.使用创建的mysql帐户登录数据库

mysql -uftpuser -h 192.168.153.7 -pcentos
MariaDB [ftpdb]> create table ftpvusers (id int unsigned auto_increment primary key,username char(30),password char(48));
MariaDB [ftpdb]> insert into ftpvusers (username,password) values ('lishuyang',password('centos')),('wangyapeng',password('centos'));

QQ图片20190111113330.png

4.配置vsftpd连接mysql用的pam模块

 vim /etc/pam.d/vsftpd.mysql
   auth required pam_mysql.so user=ftpuser passwd=centos host=192.168.153.7 db=ftpdb table=ftpvusers usercolumn=username 
       passwdcolumn=password crypt=2
   account required pam_mysql.so user=ftpuser passwd=centos host=192.168.153.7 db=ftpdb table=ftpvusers usercolumn=username 
       passwdcolumn=password crypt=2

QQ图片20190111114016.png

5.安装vsftpd并修改配置文件

 vim /etc/vsftpd/vsftpd.conf
    pam_service_name=vsftpd.mysql

QQ图片20190111114409.png

6.测试是否搭建成功

wget --ftp-user=fanguodong --ftp-password=123 ftp://192.168.153.7/pub/bigfile -P /root/guodong1.txt