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
原文地址:https://www.cnblogs.com/hovin/p/12050804.html