vsftpd

文件服务:

安装开启服务前先关闭selinux,清空iptables策略。避免不必要的麻烦,服务开启后,配置一切正常有需要再根据情况开启。

ftp:应用层,C/S,跨主机的文件共享服务;file transfer protocol nfs,cifs:文件系统接口,网络文件系统;

    nfs:network file system  sun公司研发
    cifs:common internet file system  ,windows上的文件共享协议
        linux使用samba实现cifs协议,是跨平台使用。

注意:nfs和cifs客户端可以使用mount命令将其挂载到本地系统之上。跟操作本地磁盘效果是一样的。

网络存储:

NAS:Network Attached Storage,文件服务器,nfs或cifs,文件级别;

SAN:Storage Area Network,块级别共享服务,分区-->格式化-->创建文件系统;IPSAN, FCSAN;远程主机要使用就要先分区,格式化(创建文件系统),才能挂载。


vsftpd

ftp协议

file transfer protocol,21/tcp
    C/S:
        Client --> ftp-->Server
            Client:Connect 
            Server:Listen

连接:
    命令连接:命令传输,连接一直存在;
    数据连接:数据传输,按需创建;

数据连接的建立模式:
    主动模式:ftp服务器开启21和20两个端口,21命令端口,20为数据传输端口。连接建立时,会协商使用主动还是被动模式。如果时主动模式,则客户端会将自己的一个随机端口发送给服务端。
    被动模式:协商为被动模式需要客户端将自己选定的随机端口发送给服务端,服务端使用一个随机端口发送数据给客户端端口。

    注意:主动或被动传输模式,在实际网络环境,还是有区别的,用户端一般都是通过nat网络访问,服务器端也有防火墙。 


数据传输模式:
    文本格式:ASCII
    二进制格式:BINARY

协议安全:
    明文:数据、认证时传输账号和密码均是明文 ;

    安全增强:
        ftp over ssl/tls:ftps
        ftp over ssh:sftp 

    使用虚拟用户账号;尽量不使用系统账号。
        vsftpd默认开通系统账号。

应用实现

            c/s:
                Server:
                    Windows:Serv-U, IIS, ...
                    开源解决方案:
                        wuftpd:Washington University ftp daemon
                        vsftpd:Very Secure ftp daemon
                        proftpd, pureftpd, ...
                注意:vsftpd是红帽默认提供的ftp服务软件。

                Client:
                    GUI:flashfxp, cute, filezilla, gftp, ...
                    CLI:ftp, lftp, ...

vsftpd

vsftpd:
    程序环境:
        主程序:/usr/sbin/vsftpd
        Unit File:/usr/lib/systemd/system/vsftpd.service
        配置文件:/etc/vsftpd/vsftpd.conf
        /etc/vsftpd/ftpusers 这个文件默认是黑名单,名单中的系统用户都不能登录ftp

文档路径映射:

默认匿名用户的路径映射为ftp用户的家目录 系统用户的家目录为,系统用户自己的家目录 虚拟用户的家目录需要根据配置定义,映射到那个系统用户上,就使用那个为家目录 如果使用用户禁锢 chroot功能,则用户的根目录就时其家目录。

fedora, /home/fedora/pub/a.txt --> ftp://HOST:PORT/pub/a.txt
用户的家目录映射:访问vsftpd服务必须以某个系统用户的身份进行;此用户的家目录即为文档映射的根目录;
匿名用户:anonymous,映射为一个系统用户,此用户ftp;

    [root@centos7 ~]# ls /var/ftp/
    pub
    [root@centos7 ~]# getent passwd ftp
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

匿名用户:不能上传文件,要上传也可以,但是不给其家目录授权写权限,可以给其下子目录授权写权限。

注意:文件共享类的权限,有两类权限,文件系统权限,服务权限。两者的交集,才可以使用户有权限。

    setfacl -m u:ftp:rwx /var/ftp/upload/
    服务权限授权,修改vsftpd的主配置文件。

注意:vsftpd默认开启系统上的用户登录,可以在系统上不受约束。

selinux开启也有影响。

    lftp yang@192.168.18.133:~> put /etc/fstab
    put: Access failed: 553 Could not create file. (fstab)####开启selinux不能上传文件。
    lftp yang@192.168.18.133:~> put /etc/fstab ###服务器端关闭setenforce 0
    1130 bytes transferred                      ####可以上传文件

实验:

安装vsftpd
在客户端系统上安装lftp和ftp
lftp -u username,password 1.1.1.1 使用用户名和密码登录1.1.1.1的ftp服务器
使用ftp命令登录
交互式提示用户输入用户名和密码

配置:vsftpd.conf

directive VALUE,...
    directive:指令之前不能存在任何字符,包括空白;

匿名用户配置:
    anonymous_enable=YES ###是否开启匿名用户登录

    anon_upload_enable=YES ###是否允许匿名用户上传文件,但是该目录需要先给ftp用户授权写权限,ftp服务仅仅是授权用户上传权限,没有删除权限,删除权限需要单独授权。

    anon_mkdir_write_enable=YES ###是否允许匿名用户创建目录
    anon_other_write_enable=YES ###是否开启用户的其他写权限。是否允许用户删除文件。

本地用户配置:

    local_enable=YES 是否开启系统用户
    write_enable=YES 是否允许系统用户向自己的家目录写入文件。
    默认开启了系统用户登录,用户可以在家目录和系统各目录之间切换。

认证服务:
    pam_service_name=vsftpd                     

    /etc/pam.d/vsftpd 

    pam: pluggable authencate module

切换目录时的提示信息:
    dirmessage_enable=YES  ##进入某个目录后的提示信息
    目录下放置.messages文件

修改上传文件的属主:
    chown_uploads=YES
    chown_username=USERNAME

禁锢用户于自己的家目录:

会引入别的风险,因此,要求用户对自己的家目录不能有写权限;

系统用户控制:

    (1) 禁锢所有用户
        chroot_local_user=YES

    (2) 禁锢部分用户
        (a) 白名单:名单中的用户不被禁锢;
            chroot_local_user=YES
            chroot_list_enable=YES ##起用名单列表
            chroot_list_file=/etc/vsftpd/chroot_list ##名单列表位置

        (b) 黑名单:名单中的用户被禁锢
            chroot_local_user=NO
            chroot_list_enable=YES
            chroot_list_file=/etc/vsftpd/chroot_list

# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().

# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)

#chroot_local_user=YES
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list

不允许用户对根目录有写权限(这里的根指的时用户的家目录),会带来安全风险,所以需要将禁止用户对家目录的文件系统的写权限。
但是还要用户能够上传文件等操作,就要在家目录下创建一个用户有写权限的目录。

注意:如果开启此选项,而用户还对自己的家目录有写权限,ftp服务将拒绝用户登录。除非将用户对家目录的写权限去掉。
一般使用系统用户登录ftp的用户,这类用户一般不让其使用ssh等,登录系统,仅作ftp认证使用。所以去掉用户家目录的写权限,对用户没什么影响。

    [root@centos6 ~]# lftp -u yang,123qwe 192.168.18.133
    lftp yang@192.168.18.133:~> ls
    ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

默认开启了系统用户登录,用户可以在家目录和系统各目录之间切换。 默认匿名用户被禁锢在/var/ftp目录下,此为其根目录。

用户控制列表(黑白名单)-定义那些用户能访问,那些用户不能访问ftp

默认使用黑名单控制

/etc/vsftpd/ftpusers   ###这各是PAM中定义的不能访问ftp服务的用户列表  
/etc/vsftpd/user_list  ###这个是ftp服务自己定义的列表,可实现黑白名单的作用。

user_list控制用户访问vsftpd:默认使用黑名单控制。

            (1) 白名单
                userlist_enable=YES
                userlist_deny=NO   ###不拒绝,则名单为白名单
                要作为白名单使用,就要把/etc/vsftpd/user_list这个文件中的用户删掉
                填入要加入白名单的用户

            (2) 黑名单,默认
                userlist_enable=YES
                userlist_deny=YES   ###拒绝,则名单为黑名单

[root@centos7 ~]# cat /etc/vsftpd/user_list 
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.

具体配置文件配置参数。参看man vsftpd.conf

例如控制用户上传下载的速率 服务最大并发连接数 max_clients 2000 允许同时连接客户端数 允许每个ip(客户端)的最大连接数 …

vsftp认证机制:

使用系统自带的pam模块认证。

配置文件中定义了pam认证。
    /etc/vsftpd/vsftpd.conf
        pam_service_name=vsftpd 这里使用的是相对路径,/etc/pam.d的相对路径。

/etc/pam.d/vsftpd
    [root@centos7 ~]# cat /etc/pam.d/vsftpd 
    #%PAM-1.0
    session    optional     pam_keyinit.so    force revoke
    ###默认拒绝指定目录下的列表文件中的用户登录
    auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    auth       required     pam_shells.so
    auth       include      password-auth
    account    include      password-auth
    session    required     pam_loginuid.so
    session    include      password-auth

虚拟用户账号:

    vsftpd登录方式:三种
        匿名用户,系统账号(可以登录系统的用户),虚拟账号(与系统无关的自建的账号和密码)

    vsftpd依赖pam完成认证,pam存储支持的认证方式,vsftpd都可调用;
    账号密码存储于何处?
        文件、MySQL、ldap、redis、...


    pam_mysql模块
        CentOS 6:epel
        CentOS 7:编译安装 

    编译:
        (1) 编译环境;
        (2) 依赖关系:mariadb-devel, pam-devel 
            服务于两个不同的服务,需要这个两个服务的开发包支持。才能编译安装。

        下载pam源码解压       
        # ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security/
        # make install

vsftpd使用mysql认证配置步骤

一、MySQL设置:

    mysql> CREATE DATABASE vsftpd;
    mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'mageedu';
    MariaDB [(none)]> flush privileges
    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);
    mysql> use vsftpd
    mysql> INSERT INTO users (name,password) VALUES ('tom',PASSWORD('mageedu')),('jerry',PASSWORD('mageedu')),('lucy',PASSWORD('mageedu'));

    MariaDB [vsftpd]> DESC user
    -> ;
    ERROR 1146 (42S02): Table 'vsftpd.user' doesn't exist
    MariaDB [vsftpd]> DESC users;
    +----------+----------------------+------+-----+---------+----------------+
    | Field    | Type                 | Null | Key | Default | Extra          |
    +----------+----------------------+------+-----+---------+----------------+
    | uid      | smallint(5) unsigned | NO   | UNI | NULL    | auto_increment |
    | name     | varchar(100)         | NO   | PRI | NULL    |                |
    | password | char(48)             | NO   |     | NULL    |                |
    +----------+----------------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)

    MariaDB [vsftpd]> select * from users;
        -> ;
    +-----+-------+-------------------------------------------+
    | uid | name  | password                                  |
    +-----+-------+-------------------------------------------+
    |   2 | jerry | *9A94EE7D14C10908118B62D2DA88E6932E11E438 |
    |   3 | lucy  | *9A94EE7D14C10908118B62D2DA88E6932E11E438 |
    |   1 | tom   | *9A94EE7D14C10908118B62D2DA88E6932E11E438 |
    +-----+-------+-------------------------------------------+
    3 rows in set (0.00 sec)

二、启用虚拟账号,映射为vuser

        准备要映射成为的系统账号:
            # mkdir -pv /ftproot/{pub,upload}  ###为虚拟账号创建家目录。登录ftp后的家目录。
            # useradd -d /ftproot vuser ###但是家目录要给为刚创建的目录。随便创建一个用户
            这样创建的用户对自己的家目录没有写权限。

            # setfacl -m u:vuser:rwx /ftproot/upload ###给upload目录写权限。

        配置vsftpd启用虚拟用户,并使用指定的pam service:修改/etc/vsftpd/vsftpd.conf配置文件
            pam_service_name=vsftpd.mysql
            guest_enable=YES  ###启用虚拟账号
            guest_username=vuser ###将虚拟账号映射为vuser,刚创建的系统用户。

            man vsftpd.conf
               guest_enable
                      If enabled, all  non-anonymous  logins  are  classed  as  "guest"
                      logins.  A  guest  login is remapped to the user specified in the
                      guest_username setting.
                      Default: NO ##默认不开启使用虚拟用户,开启则将虚拟用户映射为系统用户,映射
                        为的系统用户由guest_username的值决定。

               guest_username
                      See the boolean setting guest_enable for a  description  of  what
        ▽             constitutes  a  guest  login.  This  setting is the real username
                      which guest users are mapped to.
                      Default: ftp ##默认将虚拟用户映射为ftp这个系统用户

三、重新定义一个pam文件,不再使用系统账号认证,而是使用mysql认证

        准备基于mysql认证的pam配置文件:/etc/pam.d/vsftpd.mysql

            auth required pam_mysql.so host=127.0.0.1 user=vsftpd passwd=mageedu db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
            account required pam_mysql.so host=127.0.0.1 user=vsftpd passwd=mageedu db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 

        注意:auth required 对登录的用户要做认证,使用mysql认证,使用刚才建好的mysql账号登录 ,访问的数据库vsftpd 表为users 用户名使用的字段为name 密码使用的字段为password 加密方式使用加密方式为2 (源码文件中自带README文件中介绍了pam支持的加密方式)
            account required做账号审计的,账号是否在有效期内等。
            两个条件必须同时满足

           0 (or "plain") = No encryption.  Passwords stored in plaintext.
                            HIGHLY DISCOURAGED.
           1 (or "Y")     = Use crypt(3) function.
           2 (or "mysql") = Use MySQL PASSWORD() function. It is possible
                            that the encryption function used by PAM-MySQL
                            is different from that of the MySQL server, as
                            PAM-MySQL uses the function defined in MySQL's
                            C-client API instead of using PASSWORD() SQL function
                            in the query.                  
           3 (or "md5")   = Use plain hex MD5.          
           4 (or "sha1")  = Use plain hex SHA1.

四、配置每虚拟用户拥有不同的权限:vsftpd.conf

        user_config_dir=/etc/vsftpd/vusers_conf
        chroot_local_user=YES 修改配置文件,禁锢用户   

        # mkdir /etc/vsftpd/vusers_conf
        # touch USERNAME

        该配置文件功能强大,控制用户行为等。很多参数与/etc/vsftpd/vsftpd.conf的参数相同,
        但是不是所有的参数都有效,有些设置是优先于用户配置的。

        man vsftpd.conf
           user_config_dir
                  This powerful option allows the override  of  any  config  option
                  specified  in the manual page, on a per-user basis. Usage is sim‐
                  ple, and  is  best  illustrated  with  an  example.  If  you  set
                  user_config_dir  to  be  /etc/vsftpd/user_conf and then log on as
                  the user "chris", then vsftpd will apply the settings in the file
                  /etc/vsftpd/user_conf/chris  for the duration of the session. The
                  format of this file is as detailed in this  manual  page!  PLEASE
                  NOTE that not all settings are effective on a per-user basis. For
                  example, many settings only prior to  the  user's  session  being
                  started.  Examples of settings which will not affect any behviour
                  on  a  per-user  basis   include   listen_address,   banner_file,
                  max_per_ip, max_clients, xferlog_file, etc.

                  Default: (none)

        为每个用户创建一个权限配置文件

    配置用户权限--配置指令:

        anon_upload_enable=YES
        anon_mkdir_write_enable=YES
        anon_other_write_enable=YES

练习:完成vsftpd的配置,要求;

(1) 基于mysql认证; (2) 设定tom用户,密码为mageedu,有上传文件权限; (3) 上传路径为/upload/

总结: vsftpd 任何用户登录都要由家目录。 匿名用户的家目录默认为/var/ftp 系统用户的家目录为自己系统上家目录 启用虚拟用户,虚拟用户的家目录由配置文中配置的系统用户决定。 虚拟用户公用一个家目录。 支持为每个虚拟用户设立一个配置文件,配置用户账号行为等功能。

    用户访问方式(认证方式)
        默认是支持匿名用户,和系统用户登录
        需要使用其他认证方式需要单独配置。要pam支持的方式,或有其支持pam模块软件。

    允许将用户锁定在家目录
        匿名用户锁定在/var/ftp/目录下
        系统用户没做限制,可以任意切换目录。

        用户禁锢,由黑白名单之分。可以控制那些用户禁锢那些用户不禁锢

    用户访问授权(userlist)两种控制方式
        pam定义和ftp服务定义的授权方式

        /etc/vsftpd/ftpusers   ###这各是PAM中定义的不能访问ftp服务的用户列表  
        /etc/vsftpd/user_list  ###这个是ftp服务自己定义的列表,可实现黑白名单的作用。

配置服务前先关闭selinux和iptalbes以免引起不必要的错误。如需开启等服务调试完毕再开启。开启后进行测试,设置selinux或iptables

配置vsftpd服务过程中,配置文件错误可能导致服务不能启动,注意配置文件修改 /etc/vsftpd/vsftpd.conf

配置服务不能启动,注意查看 [root@centos7 ~]# systemctl status vsftpd.service 服务不能启动会有简要的提示。

配置mysql认证,用户不能登录问题 查看系统安全日志/var/log/security日志,有关于认证错误的日志。 查看是那个方面出了问题。是vsftpd本身的问题还是pam_mysql模块除了问题。 还是pam提示连接不上数据库。 连接不上数据库,可使用为vsftpd建的mysql账号本地登录(服务端主机上)测试。是否为账号问题。

 

原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/56560

(0)
上一篇 2016-11-01 10:17
下一篇 2016-11-01 10:19

相关推荐

  • N25期–第十六周作业

    1源码编译安装LNMP架构环境; 2、编写一个脚本完成以下功能: (1)、一键搭建LNMP源码编译环境; (2)、可通过在脚本后面跟上一些参数来自定义安装目录等其他选项。” 1、源码编译安装LNMP架构环境; 安装编译工具和库文件 1 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libp…

    Linux干货 2017-05-08
  • find命令使用练习

    1、  查找/var目录下属主为root,且属组为mail的所有文件   2、  查找/var目录下不属于root、lp、gdm的所有文件   3、  查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件   4、  查找当前系统上没有属主或属组,且最…

    Linux干货 2016-08-15
  • Linux基础之文件查找压缩

    为何学习本章节,可以设想一下,在未来工作中面对大量用户时,想要找到同一类型属性的用户文件时,需要一个工具可以快速准确的定位到所寻找的文件,那就是locate和find。   ******************************************************* 重点:     1.德摩根定律     非(P且Q) = (非P…

    2016-08-22
  • 快速删除无用包组

    快速删除无用组 第一步: [root@cloud ~]# yum grouplist >> list.txt 第二步: 编辑 list.txt把需要留下来的删除 第三步: 创建脚本 remove.sh 运行 #/bin/bash # # while read…

    Linux干货 2016-06-09