zoukankan      html  css  js  c++  java
  • Linux学习90 vsftpd安装配置与企业高级应用进阶实战

    一、vsftpd

      1、vsftpd is a Very Secure FTP daemon. It was written completely from

      2、URL:

        a、SCHEME://username:password@HOST:PORT/PATH/TO/FILE

        b、路径映射:

          (1)、用户家目录:每个用户的URL的/映射到当前用户的家目录

      3、vsftpd以ftp用户的身份运行进程,默认用户即为ftp用户,匿名用户的默认路径即ftp用户的家目录/var/ftp

        a、ftp,anonymous

    [root@www ~]# cat /etc/passwd|grep ftp
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

        b、注意:一个用户通过文件共享服务访问文件系统上的文件的生效权限为此二者的交集

      4、程序环境

        a、主程序:/usr/sbin/vsftpd

        b、主配置文件:/etc/vsftpd/vsftpd.conf

        c、数据根目录:/var/ftp

        d、Systemd Unit File:/usr/lib/systemd/system/vsftpd.service

      5、配置vsftpd:

        a、用户类别:

          (1)、匿名用户:anonyous --> ftp,/var/ftp

          (2)、系统用户:至少禁止系统用户访问ftp服务,/etc/vsftpd/ftpusers,PAM(/etc/pam.d/vsftpd)

    [root@www ~]# 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 #认证时使用password-auth这个文件来进行认证
    account    include    password-auth
    session    required     pam_loginuid.so
    session    include    password-auth
    [root@www ~]# cat /etc/pam.d/password-auth
    #%PAM-1.0
    # This file is auto-generated.
    # User changes will be destroyed the next time authconfig is run.
    auth        required      pam_env.so
    auth        required      pam_faildelay.so delay=2000000
    auth        sufficient    pam_unix.so nullok try_first_pass #使用此模块来提供功能
    auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
    auth        required      pam_deny.so
    
    account     required      pam_unix.so
    account     sufficient    pam_localuser.so
    account     sufficient    pam_succeed_if.so uid < 1000 quiet
    account     required      pam_permit.so
    
    password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
    password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
    
    
    password    required      pam_deny.so
    
    session     optional      pam_keyinit.so revoke
    session     required      pam_limits.so
    -session     optional      pam_systemd.so
    session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
    session     required      pam_unix.so

            1)、我们在192.168.10.13上创建用户fedora,并且设置密码为123456

    [root@www ~]# useradd fedora
    [root@www ~]# echo "123456"|passwd --stdin fedora

            2)、现在我们在192.168.10.14上通过fedora账号登陆

    [root@node2 ~]# lftp -u fedora 192.168.10.13
    Password: 
    lftp fedora@192.168.10.13:~> 

            3)、然后我们在192.168.10.13 /home/fedora目录下创建一个文件,可以看到在192.168.10.14上能够看到

    [root@www ~]# finger fedora
    Login: fedora                     Name: 
    Directory: /home/fedora                 Shell: /bin/bash
    Never logged in.
    No mail.
    No Plan.
    [root@www ~]# touch /home/fedora/test.txt
    lftp fedora@192.168.10.13:~> ls
    -rw-r--r--    1 0        0               0 May 27 01:43 test.txt

            4)、因此我们可以看到我们通过fedora登录时其路径映射为/home/fedora。其实匿名用户登录也是系统用户,只是其是默认的ftp用户。

          (3)、虚拟用户:非系统用户,用户账号非为可登录操作系统的用户账号(非/etc/passwd);

          (4)、用户通过vsftpd服务访问到的默认路径,是用户自己的家目录;默认可用自己有权限访问的所有路径间切换;禁锢用户于其家目录中

        b、配置文件:

          (1)、/etc/vsftpd/vsftpd.conf

            directive value

          (2)、注意:directive之前不能有多余字符

          (3)、可用通过man  vsftpd.conf命令进行查看

        c、匿名用户

          (1)、anonymous_enable=YES :是否支持启用匿名账号。默认为YES,这一项最多只能开启匿名用户的下载权限。

          (2)、anon_world_readable_only=YES:匿名用户是否支持全局只读,默认为YES。

          (3)、anon_upload_enable=YES :匿名用户是否有上传权限,默认只能创建文件不能创建目录,要想创建目录要使用anon_mkdir_write_enable这个选项

          (4)、anon_mkdir_write_enable=YES

          (5)、anon_other_write_enable=YES :所有删除和修改类的权限由此选项来设置,比如删除修改文件或目录

          (6)、示例

            1)、我们在192.168.10.13 /var/ftp目录中创建upload这个目录。(注意,我们/var/ftp目录的属主和数组是root权限这个是不能改的,而且不允许其他人有写权限,如果一改那么我们服务就启动不了了)

    [root@www vsftpd]# ls -ld /var/ftp/
    drwxr-xr-x 3 root root 17 5月  26 16:28 /var/ftp/
    [root@www vsftpd]# mkdir /var/ftp/upload
    [root@www vsftpd]# ls -ld /var/ftp/*
    drwxr-xr-x 2 root root 6 8月   3 2017 /var/ftp/pub
    drwxr-xr-x 2 root root 6 5月  27 10:09 /var/ftp/upload

            2)、然后我们修改upload的属主和属组。并且我们在配置文件中设置upload目录拥有共享权限。并且重启服务

    [root@www vsftpd]# chown ftp.ftp /var/ftp/upload/
    [root@www vsftpd]# ls -l /var/ftp/
    总用量 0
    drwxr-xr-x 2 root root 6 8月   3 2017 pub
    drwxr-xr-x 2 ftp  ftp  6 5月  27 10:09 upload
    [root@www vsftpd]# cat /etc/vsftpd/vsftpd.conf |grep anon_upload_enable
    anon_upload_enable=YES
    [root@www vsftpd]# systemctl restart vsftpd

            3)、现在我们尝试在192.168.10.14上通过匿名用户访问并上传文件到upload目录,发现可以成功

    [root@node2 ~]# cd /etc/
    [root@node2 etc]# lftp -u ftp 192.168.10.13
    Password: 
    lftp ftp@192.168.10.13:~> ls          
    drwxr-xr-x    2 0        0               6 Aug 03  2017 pub
    drwxr-xr-x    2 14       50              6 May 27 02:09 upload
    lftp ftp@192.168.10.13:/> cd upload/
    lftp ftp@192.168.10.13:/upload> put issue
    23 bytes transferred
    lftp ftp@192.168.10.13:/upload> ls
    -rw-------    1 14       50             23 May 27 02:20 issue
    lftp ftp@192.168.10.13:/upload> 

            4)、我们现在在192.168.10.13中查看相应的文件,可以发现权限为600,其实我们可以在配置文件中定义上传文件的umask的

              anon_umask=077 #默认是077

            5)、此时我们还不能创建目录和删除文件,因此我们需要在192.168.10.13中配置相应参数然后重启服务。然后我们再尝试通过192.168.10.14登陆后创建目录和删除文件。

    [root@www /]# cat /etc/vsftpd/vsftpd.conf |grep -E "anon_(mkdir|other)"
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    [root@www /]# cat /etc/vsftpd/vsftpd.conf |grep -E "anon_(mkdir|other)"
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    [root@www /]# systemctl restart vsftpd
    [root@node2 etc]# lftp -u ftp 192.168.10.13
    Password: 
    lftp ftp@192.168.10.13:~> ls          
    drwxr-xr-x    2 0        0               6 Aug 03  2017 pub
    drwxr-xr-x    2 14       50             19 May 27 02:20 upload
    lftp ftp@192.168.10.13:/> cd upload/
    lftp ftp@192.168.10.13:/upload> put fstab 
    465 bytes transferred
    lftp ftp@192.168.10.13:/upload> ls
    -rw-------    1 14       50            465 May 27 02:30 fstab
    -rw-------    1 14       50             23 May 27 02:20 issue
    lftp ftp@192.168.10.13:/upload> mkdir testdir
    mkdir ok, `testdir' created
    lftp ftp@192.168.10.13:/upload> ls
    -rw-------    1 14       50            465 May 27 02:30 fstab
    -rw-------    1 14       50             23 May 27 02:20 issue
    drwx------    2 14       50              6 May 27 02:30 testdir
    lftp ftp@192.168.10.13:/upload> rm fstab 
    rm ok, `fstab' removed
    lftp ftp@192.168.10.13:/upload> ls
    -rw-------    1 14       50             23 May 27 02:20 issue
    drwx------    2 14       50              6 May 27 02:30 testdir
    lftp ftp@192.168.10.13:/upload> rmdir testdir
    rmdir ok, `testdir' removed
    lftp ftp@192.168.10.13:/upload> ls
    -rw-------    1 14       50             23 May 27 02:20 issue
    lftp ftp@192.168.10.13:/upload>

        d、系统用户:

          (1)、local_enable=YES :是否启用本地用户,即是否允许本地用户访问ftp服务。默认是启用的

          (2)、write_ebable=YES:是否允许本地用户拥有写权限。默认是启用的。

    [root@www /]# cat /etc/vsftpd/vsftpd.conf |grep -E "<(local|write)_enable"
    local_enable=YES
    write_enable=YES

          (3)、local_umask=022:设定上传文件的反掩码

          (4)、辅助配置文件:/etc/vsftpd/ftpusers。这个文件中是通过pam来进行认证实现的

            列在此文件中的用户,均禁止使用ftp服务。因为我们ftp是明文传输的,我们可以通过抓包的方式查看到我们的密码。我们要禁止某个用户登录就可以将用户加入到该文件即可

    [root@www /]# cat /etc/pam.d/vsftpd |grep ftpuser
    auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    [root@www /]# cat /etc/vsftpd/ftpusers 
    # Users that are not allowed to login via ftp
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    news
    uucp
    operator
    games
    nobody

            我们可以通过tcpdump命令进行抓包

    [root@www /]# tcpdump -i eno16777736 -nn -XX tcp port 21

            上述意思是我们抓取eno16777736这个接口上的包,-nn表示数值格式显示端口和掩码地址。tcp port 21表示我们抓tcp端口为21的包

          (5)、chroot_local_user=YES

            禁锢所有本地用户于其家目录,需要事先去除用户对家目录的写权限。

          (6)、chroot_list_enable=YES :禁锢部分用户

          (7)、chroot_list_file=/etc/vsftpd/chroot_list

              禁锢列表中文件存在的用户于其家目录中;需要事先去除用户对家目录的写权限

          (8)、示例

            1)、在192.168.10.13上创建5个用户

    [root@www /]# for i in {1..5};do useradd user$i;echo "123456"|passwd --stdin user$i;done

            2)、我们现在尝试锁定user1和user2

    [root@www /]# chmod a-w /home/user1
    [root@www /]# chmod a-w /home/user2
    [root@www /]# ls -ld /home/user{1,2}
    dr-x------ 2 user1 user1 62 12月 23 15:45 /home/user1
    dr-x------ 2 user2 user2 62 1月   2 11:45 /home/user2

            3)、然后我们创建/etc/vsftpd/chroot_list文件并且在我们的/etc/vsftpd.d/vsftpd.conf中将相应的选项启动起来并且重启服务

    [root@www /]# cat /etc/vsftpd/vsftpd.conf |grep -E "^chroot"
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    [root@www /]# cat /etc/vsftpd/chroot_list 
    user1
    user2
    [root@www /]#
    [root@www /]# systemctl restart vsftpd

            4)、我们在192.168.10.14上来验证user1和user3,我们可以看到user1看到的是/,相当于将其禁锢在家目录了,而user3是/home/user3,他可以切换到/或/etc等目录下查看文件信息。

    [root@node2 etc]# ftp 192.168.10.13
    Connected to 192.168.10.13 (192.168.10.13).
    220 (vsFTPd 3.0.2)
    Name (192.168.10.13:root): user1
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> pwd
    257 "/"
    ftp> exit
    221 Goodbye.
    [root@node2 etc]# ftp 192.168.10.13
    Connected to 192.168.10.13 (192.168.10.13).
    220 (vsFTPd 3.0.2)
    Name (192.168.10.13:root): user3
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> pwd
    257 "/home/user3"
    ftp> 

        e、传输日志:是否开启上传下载日志

          (1)、xferlog_enable=YES 

          (2)、xferlog_file=/var/log/xferlog

          (3)、xferlog_std_format=YES

        f、守护进程的类型

          (1)、standalone:独立守护进程;由服务进程自动监听套接字,并接收用户访问请求

          (2)、transient:瞬时守护进程;由受托管方代为监听套接字,服务进程没有访问请求时不启动;当托管方收到访问请求时,才启动服务进程;

            CentOS 6:xinetd独立守护进程,/etc/xinetd.d/

            CentOS 7:由systemd代为监听

        g、控制可登录vsftpd服务的用户列表

          (1)、userlist_enable=YES

            启用/etc/vsftpd/user_list文件来控制可登录用户

          (2)、userlist_deny=

            YES:意味着此为黑名单。默认是等于YES的。即定义哪些用户不能访问,除此之外都可以访问。

            NO:意味着此为白名单。即哪些用户可以访问,除此之外都没法访问。

          (3)、示例

            1)、在192.168.10.13中配置相应选项。我们将其配置为白名单,即只允许我们自己定义的用户登录。

    [root@www ~]# cat /etc/vsftpd/vsftpd.conf|grep "userlist"
    userlist_enable=YES
    userlist_deny=NO

            2)、我们在我们/etc/vsftpd/user_list文件中添加user1和user2然后重启服务

    [root@www vsftpd]# cat 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.
    user1
    user2
    [root@www vsftpd]# systemctl restart vsftpd

            3)、现在我们在192.168.10.14上进行登录,然后我们发现user1可以登陆,user3没法登陆

    [root@node2 ~]# ftp 192.168.10.13
    Connected to 192.168.10.13 (192.168.10.13).
    220 (vsFTPd 3.0.2)
    Name (192.168.10.13:root): user1
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> exit
    221 Goodbye.
    [root@node2 ~]# ftp 192.168.10.13
    Connected to 192.168.10.13 (192.168.10.13).
    220 (vsFTPd 3.0.2)
    Name (192.168.10.13:root): user3
    530 Permission denied.
    Login failed.

        h、上传下载速率

          anon_max_rate=0 :默认为0,表示无限制

          local_max_rate=0:本地上传下载速率,默认为0,表示无限制

        i、并发连接数限制

          max_clients=2000 :最大并发连接数,默认为2000个

          max_per_ip=50 :最大单IP的连接数,默认为50

      6、虚拟用户

        a、用户账号存储于何处?

          文件、MySQL、Redis、...

        b、vsftpd:认证功能托管给pam

          基于何种存储服务来存储用户信息,以及对存储服务的驱动要靠pam实现

        c、pam_mysql:

          yum install -y mariadb-devel pam-devel

          ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security

          make && make install

        d、创建数据库,授权用户,创建账号和密码

          auth字段:认证

          account字段:账号检查

         e、配置vsftpd,添加或修改以下选项

          pam_service_name=vsftpd.vusers #为定义的用户名划一个配置文件来完成系统认证

          guest_enable=YES #启用来宾账户

          guest_username=vuser #将来宾账户映射为系统用户名

        e、示例

          (1)、安装maridb,mariadb-devel(开发环境),pam-devel

          (2)、安装开发环境 yum groupinstall "Development Tools" "Server Platform Development" -y 

          (3)、下载程序包pam-mysql包

            

           (4)、展开并编译

           (5)、配置mysql并启动服务

             

          (6)、连接至mysql并授权一个账号

          (7)、创建相应的库和表,并插入对应数据

          (8)、我们创建一个用户,家目录为/ftproot/vuser

            

          (9)、然后创建我们的/ftproot/vuser/pub目录

          (10)、我们创建一个pam配置文件/etc/pam.d/vsftpd.vusers

          (11)、我们把/etc/vsftpd/vsftpd.conf还原到我们刚安装好服务时候的状态。然后修改相应的配置项。然后重启服务。

             

          (12)、然后我们远程登录时提示我们的家目录不能拥有写权限,因此我们需要将家目录的写权限给干掉,然后重启服务

            

           (13)、然后我们再远程登录

            

             可以看到我们能登陆

          (14)、我们创建/ftproot/vuser/upload目录并且给定相应的权限  

             

           (15)、然后配置用户的上传下载权限

            1)、在/etc/vsftpd.d/vsftpd.conf中添加下面字段

              

             2)、在该路径下添加一个和用户同名的文件,比如/etc/vsftpd/vusers_config/tom,添加如下配置。然后重启服务

              

          (16)、然后我们尝试访问发现已经可以了

            

    二、博客作业

      pam_mysql认证ftp虚拟用户账号,且拥有不同的权限

  • 相关阅读:
    ubuntu安装jdk的两种方法
    LeetCode 606. Construct String from Binary Tree (建立一个二叉树的string)
    LeetCode 617. Merge Two Binary Tree (合并两个二叉树)
    LeetCode 476. Number Complement (数的补数)
    LeetCode 575. Distribute Candies (发糖果)
    LeetCode 461. Hamming Distance (汉明距离)
    LeetCode 405. Convert a Number to Hexadecimal (把一个数转化为16进制)
    LeetCode 594. Longest Harmonious Subsequence (最长的协调子序列)
    LeetCode 371. Sum of Two Integers (两数之和)
    LeetCode 342. Power of Four (4的次方)
  • 原文地址:https://www.cnblogs.com/Presley-lpc/p/12970678.html
Copyright © 2011-2022 走看看