zoukankan      html  css  js  c++  java
  • FTP服务配置实践

    一、FTP相关介绍

     1、文本传输协议FTP

      FTP (File Transfer Protocol) 文件传输协议,是因特网中使用最广泛的文件传输协议;

      基于C/S结构的双通道协议(数据和命令连接)

      数据传输格式:二进制(默认) 和 文本

      两种模式 (服务器角度):

       主动模式(PORT style):服务器主动连接

        命令(控制):客户端:随机port ⟶ 服务器:tcp21
        数据:客户端:随机port ⟵ 服务器:tcp20

       被动模式(PASV style):客户端主动连接

        命令(控制):客户端:随机port ⟶ 服务器:tcp21
        数据:客户端:随机port ⟶ 服务器:随机port

      服务器被动模式数据端口示例:

         227 Entering Passive Mode (172,16,0,1,224,59) ,则服务器数据端口为:224*256+59

     2、FTP软价介绍

      FTP服务器:Wu-ftpd,Proftpd,Pureftpd,ServU,IIS  
            vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器

      客户端软件:ftp,lftp,lftpget,wget,curl

     3、FTP服务状态码:

       1XX:信息   125: 数据连接打开
       2XX:成功类状态   200: 命令OK 230: 登录成功
       3XX:补充类   331: 用户名OK
       4XX:客户端错误   425: 不能打开数据连接
       5XX:服务器错误   530: 不能登录

     4、FTP服务用户认证

       匿名用户:ftp,anonymous,对应Linux用户ftp
       系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
       虚拟用户:特定服务的专用用户,独立的用户/密码文件
        nsswitch:network service switch名称解析框架
        pam:pluggable authentication module 用户认证   /lib64/security /etc/pam.d/ /etc/pam.conf     

    二、FTP相关配置说明

     1、vsftpd 服务

      配置文件:/etc/vsftpd/vsftpd.conf  可用man 5 vsftpd.conf 查看相关帮助,格式:option=value (=号前后不要有空格)

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

      服务脚本:/usr/lib/systemd/system/vsftpd.service
           /etc/rc.d/init.d/vsftpd

     2、vsftpd 服务配置相关参数

      命令端口

        listem_port=21

      主动模式端口

        connect_from_port_20=YES  #主动模式的端口为20
        ftp_data_port=20 (默认)    #指定主动模式的端口

      被动模式端口范围

        pasv_enable=yes  #允许被动模式连接 
        pasv_min_port=6000  #设置用于被动模式的服务器的最小端口号
        pasv_max_port=6010  #设置用于被动模式的服务器的最大端口号

      使用当地时间

        use_localtime=YES  #使用当地时间(默认为NO,使用GMT)

      匿名用户

        anonymous_enable=YES  #支持匿名用户
        no_anon_password=YES (默认NO)  #匿名用户略过口令检查
        anon_upload_enable=YES  #匿名上传,注意:文件系统权限
        anno_root=/var/ftp  #设备匿名用户的ftp根目录(不设置默认在/var/ftp目录下)
        anon_mkdir_write_enable=YES   #匿名建目录
        anon_world_readable_only (默认YES)  #只能下载全部读的文件
        anon_umask=0333   #指定匿名上传文件的umask,默认077
        anon_other_write_enable=YES   #可删除和修改上传的文件 

      指定上传文件的默认的所有者和权限

        chown_uploads=YES (默认NO)
        chown_username=whoname
        chown_upload_mode=0644

      Linux系统用户

        local_enable=YES  #是否允许linux用户登录
        write_enable=YES  #允许linux用户上传文件
        local_umask=022  #指定系统用户上传文件的默认权限
        guest_enable=YES  #所有系统用户都映射成guest用户
        guest_username=ftp  #配合上面选项才生效,指定guest用户
        local_root=/ftproot  #guest用户登录所在目录

      禁锢所有系统用户在家目录中

        chroot_local_user=YES (默认NO,不禁锢)  #禁锢系统用户

      禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反

        chroot_list_enable=YES 
        chroot_list_file=/etc/vsftpd/chroot_list
         #当chroot_local_user=YES时,则chroot_list中用户不禁锢
         #当chroot_local_user=NO时,则chroot_list中用户禁锢

       wu-ftp日志:默认启用

        xferlog_enable=YES (默认)  #启用记录上传下载日志
        xferlog_std_format=YES (默认)  #使用wu-ftp日志格式
        xferlog_file=/var/log/xferlog (默认)  #可自动生成

      vsftpd日志:默认不启用

        dual_log_enable=YES  #使用vsftpd日志格式,默认不启用
        vsftpd_log_file=/var/log/vsftpd.log (默认)  #可自动生成

      登录提示信息

        ftpd_banner="welcome to mage ftp server"
        banner_file=/etc/vsftpd/ftpbanner.txt

      日志访问提示信息

        dirmessage_enable=YES (默认)
        message_file=.message (默认)   #信息存放在指定目录下.message

      使用pam(Pluggable Authentication Modules)完成用户认证

        pam_service_name=vsftpd  #pam配置文件:/etc/pam.d/vsftpd   默认文件 /etc/vsftpd/ftpusers 中的用户拒绝登录

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

        userlist_enable=YES  #默认有此设置
        userlist_deny=YES (默认值)  #黑名单,不提示口令,NO为白名单
        userlist_file=/etc/vsftpd/users_list  #此为默认值

      vsftpd服务指定用户身份运行

        opriv_user=nobody (默认值)

      连接数限制

        max_clients=0  #最大并发连接数,0表示不限制
        max_per_ip=0  #每个IP同时发起的最大连接数

      传输速率:字节/秒

        anon_max_rate=0#匿名用户的最大传输速率
        local_max_rate=0#本地用户的最大传输速率

      连接时间:秒为单位

        connect_timeout=60  #主动模式数据连接超时时长
        accept_timeout=60  #被动模式数据连接超时时长
        data_connection_timeout=300  #数据连接无数据输超时时长
        idle_session_timeout=60  #无命令操作超时时长

      优先以文本方式传输 (不建议使用)

        ascii_upload_enable=YES
        ascii_download_enable=YES

      SSL支持:

        ssl_enable=YES  #启用SSL
        allow_anon_ssl=NO  #匿名不支持SSL
        force_local_logins_ssl=YES  #本地用户登录加密
        force_local_data_ssl=YES  #本地用户数据传输加密
        rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem  #指定RSA加密证书信息

    三、FTP相关实验

     系统:CentOS7.6,服务端(192.168.214.17),客户端(192.168.214.27),数据库:mariadb-server(光盘yum源)

    1、实现基于SSL的FTP

     1. 查看是否支持SSL

    [root@centos7 ~]# ldd `which vsftpd`|grep ssl
        libssl.so.10 => /lib64/libssl.so.10 (0x00007fb62523d000)

      2. 创建自签名证书

    [root@centos7 ~]# cd /etc/pki/tls/certs/
    [root@centos7 certs]# make vsftpd.pem    #生成证书,执行后填写相应信息
    [root@centos7 certs]# openssl x509 -in vsftpd.pem -noout -text    #查看生成证书信息

     3. 配置vsftpd服务支持SSL

    [root@centos7 certs]# 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/pki/tls/certs/vsftpd.pem #指定证书路径

     4. 用filezilla等工具测试

    2、实现基于DB文件的虚拟用户FTP服务

     1. 创建用户数据库文件

    [root@centos7 ~]# cd /etc/vsftpd/
    [root@centos7 vsftpd]# vim vusers.txt
    [root@centos7 vsftpd]# cat vusers.txt
    ftpuser1    #奇数行为用户名
    centos      #偶数行为密码
    ftpuser2
    linux  
    [root@centos7 vsftpd]# db_load -T -t hash -f vusers.txt vusers.db
    [root@centos7 vsftpd]# chmod 600 vusers.db

     2. 创建用于虚拟映射的用户和访问FTP目录

    [root@centos7 vsftpd]# useradd -d /data/ftproot -s /sbin/nologin vuser
    [root@centos7 vsftpd]# ll /data
    total 0
    drwx------ 3 vuser vuser 78 Dec 16 18:19 ftproot
    #centos7上FTP根目录不能有w写权限,所以要修改权限
    [root@centos7 vsftpd]# chmod 555 /data/ftproot
    [root@centos7 vsftpd]# ll /data
    total 0
    dr-xr-xr-x 3 vuser vuser 78 Dec 16 18:19 ftproot
    #无写权限,则用户不能上传文件
    #所以需要建一个子目录,并设置w权限,这里用acl实现
    [root@centos7 vsftpd]# mkdir /data/ftproot/upload
    [root@centos7 vsftpd]# setfacl -m u:vuser:rwx /data/ftproot/upload/

     3. 创建支持虚拟用户的PAM认证文件

    [root@centos7 vsftpd]# vim /etc/pam.d/vsftpd.db
    [root@centos7 vsftpd]# cat /etc/pam.d/vsftpd.db
    auth required pam_userdb.so db=/etc/vsftpd/vusers  #注意,这里后面的文件是不带后缀的
    account required pam_userdb.so db=/etc/vsftpd/vusers  #这里也是不带后缀的

     4. 指定pam配置文件

    [root@centos7 vsftpd]# vim /etc/vsftpd/vsftpd.conf 
    pam_service_name=vsftpd.db    #修改此项
    #添加以下两项
    guest_enable=YES
    guest_username=vuser

     5. SELinux 设置

      禁用SELinux (本次实验已禁用),或者用以下命令

    [root@centos7 vsftpd]# setsebool -P ftpd_full_access 1

     6. 虚拟用户建立独立的配置文件

    [root@centos7 vsftpd]# mkdir /etc/vsftpd/vusers.d/    #创建配置文件存放的路径
    [root@centos7 vsftpd]# vim /etc/vsftpd/vsftpd.conf     #修改主配置文件
    user_config_dir=/etc/vsftpd/vusers.d/    #添加此行
    [root@centos7 vsftpd]# cd /etc/vsftpd/vusers.d/
    [root@centos7 vusers.d]# vim ftpuser1    #创建各用户自已的配置文件
    #配置ftpuser1用户可读写,其它用户只读
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    [root@centos7 vusers.d]# vim ftpuser2    #创建各用户自已的配置文件
    #将ftpuser2的登录目录改变至指定的目录
    local_root=/var/ftproot

     7. 启动 vsftpd 服务并进行相关测试

    [root@centos7 vusers.d]# systemctl start vsftpd 
    [root@centos7-27 ~]# ftp 192.168.214.17
    Connected to 192.168.214.17 (192.168.214.17).
    220 (vsFTPd 3.0.2)
    Name (192.168.214.17:root): ftpuser1
    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 (192,168,214,17,95,155).
    150 Here comes the directory listing.
    drwxrwxr-x    2 0        0               6 Dec 16 10:23 upload
    226 Directory send OK.
    ftp> cd upload #只能在此目录下才能上传文件
    250 Directory successfully changed.
    ftp> put anaconda-ks.cfg #上传文件
    local: anaconda-ks.cfg remote: anaconda-ks.cfg
    227 Entering Passive Mode (192,168,214,17,233,226).
    150 Ok to send data.
    226 Transfer complete.
    1924 bytes sent in 0.000446 secs (4313.90 Kbytes/sec)
    ftp> ls #可以看到上传成功了
    227 Entering Passive Mode (192,168,214,17,83,141).
    150 Here comes the directory listing.
    -rw-------    1 1001     1001         1924 Dec 16 10:51 anaconda-ks.cfg
    226 Directory send OK.
    
    [root@centos7 vusers.d]# mkdir /var/ftproot    #创建ftpuser2的根目录
    [root@centos7 vusers.d]# chmod -w /var/ftproot    #去掉写权限
    [root@centos7 vusers.d]# cp /etc/fstab /var/ftproot/f1.txt 
    #客户端上测试
    [root@centos7-27 ~]# ftp 192.168.214.17
    Connected to 192.168.214.17 (192.168.214.17).
    220 (vsFTPd 3.0.2)
    Name (192.168.214.17:root): ftpuser2
    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 (192,168,214,17,87,195).
    150 Here comes the directory listing.
    -rw-r--r--    1 0        0             595 Dec 16 11:00 f1.txt
    226 Directory send OK.
    ftp> get f1.txt  #下载文件是可以的
    local: f1.txt remote: f1.txt
    227 Entering Passive Mode (192,168,214,17,86,114).
    150 Opening BINARY mode data connection for f1.txt (595 bytes).
    226 Transfer complete.
    595 bytes received in 0.000463 secs (1285.10 Kbytes/sec)
    ftp> put f1.txt  #上传是不行的,一是没配置权限,二是根目录也无写权限
    local: f1.txt remote: f1.txt
    227 Entering Passive Mode (192,168,214,17,143,39).
    553 Could not create file.
    View Code 

    3、实现基于MySQL的虚拟用户FTP服务

     1. 配置MySQL服务,并创建相应库与表

    [root@centos7 ~]# yum install mariadb-server    #安装数据库
    [root@centos7 ~]# systemctl start mariadb    #启动
    [root@centos7 ~]# mysql    #连接数据库
    MariaDB [(none)]> create database vsftpd; #创建数据库
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> use vsftpd;
    Database changed
    MariaDB [vsftpd]> CREATE TABLE users (    --创建表
        -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
        -> name CHAR(50) BINARY NOT NULL,
        -> password CHAR(48) BINARY NOT NULL
        -> );
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [vsftpd]> insert users (name,password) value('ftpuser1',password('centos')); #添加用户
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [vsftpd]> insert users (name,password) value('ftpuser2',password('linux'));  #添加用户
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@localhost identified by 'centos';  #创建本地连接数据库用户
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'127.0.0.1' identified by 'centos';   #创建本地连接数据库用户
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [vsftpd]> flush privileges;  #刷新权限
    Query OK, 0 rows affected (0.00 sec)
    CREATE TABLE users (
    id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    name CHAR(50) BINARY NOT NULL,
    password CHAR(48) BINARY NOT NULL
    );
    创建表语名

     2. 安装 pam_mysql 包

      CentOS6上pam_mysql 由epel6 源中提供,配好epel源后 yum install vsftpd pam_mysql 即可

      CentOS7上无对应的rpm包,需手动编译安装

    [root@centos7 ~]# ls -l pam_mysql-0.7RC1.tar.gz  #准备pam_mysql源码包
    -rw-r--r-- 1 root root 335240 Dec 16 20:55 pam_mysql-0.7RC1.tar.gz
    #先安装相关依赖包
    [root@centos7 ~]# yum install -y gcc gcc-c++ pam-devel mariadb-devel
    [root@centos7 ~]# tar xvf pam_mysql-0.7RC1.tar.gz
    [root@centos7 ~]# cd pam_mysql-0.7RC1/
    #编译安装
    [root@centos7 pam_mysql-0.7RC1]# ./configure  --with-pam-mods-dir=/lib64/security/
    [root@centos7 pam_mysql-0.7RC1]# make && make install 

     3. 安装 vsftpd 服务,并配置FTP目录权限

    [root@centos7 ~]# yum install -y vsftpd
    [root@centos7 ~]# useradd -d /data/ftproot -s /sbin/nologin vuser  #创建虚拟用户
    [root@centos7 ~]# chmod 555 /data/ftproot  #设置FTP目录权限
    [root@centos7 ~]# mkdir /data/ftproot/upload  #创建上传目录
    [root@centos7 ~]# setfacl -m u:vuser:rwx /data/ftproot/upload  #设置上传目录权限

     4. 创建 pam 认证文件,并配置 vsftpd.conf 文件

    [root@centos7 ~]# vim /etc/pam.d/vsftpd.mysql
    [root@centos7 ~]# cat /etc/pam.d/vsftpd.mysql
    auth required pam_mysql.so user=vsftpd passwd=centos host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
    account required pam_mysql.so user=vsftpd passwd=centos host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
    [root@centos7 ~]# vim /etc/vsftpd/vsftpd.conf
    pam_service_name=vsftpd.mysql  #修改此项
    #添加以下三项
    guest_enable=YES
    guest_username=vuser
    user_config_dir=/etc/vsftpd/vusers.d/
    auth 表示认证
    account 验证账号密码正常使用
    required 表示认证要通过
    pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝 对路径;后面为给此模块传递的参数
    user=vsftpd 为登录mysql的用户
    passwd=centos 登录mysql的的密码
    host=localhost mysql服务器的主机名或ip地址
    db=vsftpd 指定连接msyql的数据库名称
    table=users 指定连接数据库中的表名
    usercolumn=name 当做用户名的字段
    passwdcolumn=password 当做用户名字段的密码
    crypt=2 密码的加密方式为mysql password()函数加密,0表示不加密,1表示crypt(3)加密,2表示使用mysql password()函数加密,3表示md5加密,4表示sha1加密
    pam配置字段说明

     5. SELinux 设置

      禁用SELinux (本次实验已禁用),或者用以下命令

    [root@centos7 ~]# restorecon -R /lib64/security
    [root@centos7 ~]# setsebool -P ftpd_connect_db 1
    [root@centos7 ~]# setsebool -P ftp_home_dir 1
    [root@centos7 ~]# chcon -R -t public_content_rw_t /data/ftproot/

     6. 虚拟用户建立独立的配置文件

    [root@centos7 ~]# mkdir /etc/vsftpd/vusers.d/    #创建配置文件存放的路径
    [root@centos7 ~]# vim /etc/vsftpd/vsftpd.conf     #修改主配置文件
    user_config_dir=/etc/vsftpd/vusers.d/    #添加此行
    [root@centos7 ~]# cd /etc/vsftpd/vusers.d/
    [root@centos7 vusers.d]# vim ftpuser1    #创建各用户自已的配置文件
    #配置ftpuser1用户可读写,其它用户只读
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    [root@centos7 vusers.d]# vim ftpuser2    #创建各用户自已的配置文件
    #将ftpuser2的登录目录改变至指定的目录
    local_root=/var/ftproot
    [root@centos7 vusers.d]# mkdir /data/ftproot  #创建ftpuser2的登录目录
    [root@centos7 vusers.d]# chmod 555 /data/ftproot  #修改目录权限
    

     7. 启动 vsftpd 服务并进行相关测试 

    [root@centos7 ~]# systemctl start vsftpd
  • 相关阅读:
    进程和线程
    进程通信、同步与调度
    文件和文件系统
    【nexys3】【verilog】小设计——拆弹游戏
    Qt4开发环境搭建(Qt4.8.7+mingw4.8.2+Qt Creator4.2.0)
    GPL和LGPL
    【rpi】使用putty远程连接rpi(ssh)
    mysql 命令 小结
    安装mysql zip 安装包 Navicat连接
    python虚拟环境 virtualenv工具
  • 原文地址:https://www.cnblogs.com/hovin/p/12050804.html
Copyright © 2011-2022 走看看