VSFTP详细配置说明
§·FTP(File Transfer Protocol 文件传输协议)介绍 1
§·Linux中 VSFTP基于mariadb用户名密码认证 7
§·FTP(File Transfer Protocol 文件传输协议)介绍
※·FTP: File Transfer Protocol,监听的端口为TCP/21号端口(命令连接端口),数据传输端口为TCP/20号端口.
※·文件传输协议,应用层协议, 明文协议:认证及数据传输。
※·FTP为服务器端客户端架构:
服务端实现:vsftpd, pureftpd, proftpd, …, Filezilla Server
客户端实现:Linux: ftp, lftp ; Windows: cuteftp, Filezilla, Flashfxp, …
※·FTP简单介绍
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
※·FTP账户分类
◎·Real帐户
这类用户是指在FTP服务上拥有帐号。当这类用户登录FTP服务器的时候,其默认的主目录就是其帐号命名的目录。但是,其还可以变更到其他目录中去。如系统的主目录等等。
◎·Guest用户
在FTP服务器中,我们往往会给不同的部门或者某个特定的用户设置一个帐户。但是,这个账户有个特点,就是其只能够访问自己的主目录。服务器通过这种方式来保障FTP服务上其他文件的安全性。这类帐户,在Vsftpd软件中就叫做Guest用户。拥有这类用户的帐户,只能够访问其主目录下的目录,而不得访问主目录以外的文件。
◎·Anonymous(匿名)用户
这也是我们通常所说的匿名访问。这类用户是指在FTP服务器中没有指定帐户,但是其仍然可以进行匿名访问某些公开的资源。
在组建FTP服务器的时候,我们就需要根据用户的类型,对用户进行归类。默认情况下,Vsftpd服务器会把建立的所有帐户都归属为Real用户。但是,这往往不符合企业安全的需要。因为这类用户不仅可以访问自己的主目录,而且,还可以访问其他用户的目录。这就给其他用户所在的空间带来一定的安全隐患。所以,企业要根据实际情况,修改用户所在的类别。
§·FTP连接类型主动模式与被动模式
※·命令连接:传输指令,21/tcp ,客户端发出请求,服务端21/tcp响应,数据连接:传输数据
※·数据连接必然是通过某个命令连接发起,由于数据连接的端口不同,FTP服务器有以下两种工作模式:
※·主动模式(PORT)(服务器连接客户端端口)
主动模式下,FTP客户端从任意的非特殊的端口(N > 1023)连入到FTP服务器的命令端口–21端口。然后客户端在N+1(N+1 >= 1024)端口监听,并且通过N+1(N+1 >= 1024)端口发送命令给FTP服务器。服务器会反过来连接用户本地指定的数据端口,比如20端口。以服务器端防火墙为立足点,要支持主动模式FTP需要打开如下交互中使用到的端口:
1 .FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
2 .FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
3 .FTP服务器数据(20)端口到客户端端口(>1023)(服务器初始化数据连接到客户端数据端口)
4 .FTP服务器数据(20)端口接受客户端端口(>1023)(客户端发送ACK包到服务器的数据端口);
在第1步中,客户端的命令端口与FTP服务器的命令端口建立连接,并发送命令“PORT 1027”。然后在第2步中,FTP服务器给客户端的命令端口返回一个"ACK"。在第3步中,FTP服务器发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接,最后客户端在第4步中给服务器端返回一个"ACK"。
主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。
※·被动模式(PASV)(客户端连接服务器)
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。
在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >; 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P >; 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1 .FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
2 .FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
3 .FTP服务器数据端口(>1023)接受客户端端口(>1023)(客户端初始化数据连接到服务器指定的任意端口)
4 .FTP服务器数据端口(>1023)到客户端端口(>1023)(服务器发送ACK响应和数据到客户端的数据端口)
在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令"PORT 2024",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。
被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。详细内容参看附录1。
第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。
随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置
※·VSFTP中用户分类
本地用户(系统用户):root及系统用户(0-999);
匿名用户(映射至某一固定的系统用户):ftp, vsftp, /var/ftp/
虚拟用户:(不是系统自身账户)
nsswitch: name service switch
PAM:Plugable Authentication Modules
※·VSFTP程序文件及其配置文件介绍
[
root@Centos7 ftp]#yum install vsftpd [root@Centos7 ftp]# rpm -ql vsftpd /etc/logrotate.d/vsftpd /etc/pam.d/vsftpd #关于vsftpd提供本地用于认证模块 /etc/vsftpd #vsftpd配置文件目录 /etc/vsftpd/ftpusers #禁止登陆FTP的账户列表 /etc/vsftpd/user_list #启用某个功能拒绝与运行的用户列表 /etc/vsftpd/vsftpd.conf #vsftpd主配置文件 /etc/vsftpd/vsftpd_conf_migrate.sh /usr/lib/systemd/system-generators/vsftpd-generator /usr/lib/systemd/system/vsftpd.service #systemd 控制vsftpd服务脚本文件 /usr/lib/systemd/system/vsftpd.target /usr/lib/systemd/system/vsftpd@.service /usr/sbin/vsftpd #vsftpd程序 /var/ftp #默认vsftp的下载目录 /var/ftp/pub #默认vsftp的下载目录
vsftpd:very secure ftp daemon
程序:/usr/sbin/vsftpd
配置文件:/etc/vsftpd/vsftpd.conf
CentOS 6:
/etc/rc.d/init.d/vsftpd
chkconfig vsftpd on
CentOS 7:
/usr/lib/systemd/system/vsftpd.service
systemctl enable vsftpd.service
vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES #是否允许匿名账户登录FTP服务器 local_enable=YES #是否允许本地账户登录FTP服务器 write_enable=YES #是否开启目录上次权限(控制所有账户) anonymous_enable=YES #是否允许匿名账户登录FTP服务器 anon_upload_enable=YES #匿名用户的上传操作;生效要依赖于write_enable=YES; anon_mkdir_write_enable=YES #匿名用户创建目录的权限; anon_other_write_enable=YES #匿名用户的删除及重命名操作权限; local_enable=YES #所有的非匿名的生效,都依赖于此指令; local_umask=022 #本地用户上传文件的权限掩码; 目录消息: dirmessage_enable=YES #用户第一次进入目录时,vsftpd会查看.message文件,并将其内容显示给用户; message_file #指定文件路径,而不使用默认的.message; 数据传输日志: xferlog_enable #是否开启日志功能 xferlog_std_format #日志的格式 xferlog_file=/var/log/xferlog #日志的存放路径 数据传输模式: connect_from_port_20 #是否启用PORT模式; 修改匿名用户上传的文件的属主: chown_uploads #是否修改; chown_username #启用chown_uploads指令时,将文件属主修改为此指令指定的用户;默认为root; chown_upload_mode #设定匿名用户上传的文件的权限;默认为600; 设定会话超时时长: idle_session_timeout #空闲会话超时时长; connect_timeout #PORT模式下,服务器连接客户端的超时时长; data_connection_timeout #数据传输的超时时长; 命令连接的监听端口: listen_port #默认为21; 设定连接及传输速率: local_max_rate #本地用户的最大传输速率,单位是字节;默认为0,表示无限制; anon_max_rate #匿名用户的最大传输速率; max_clients #最大并发连接数; max_per_ip #每个IP所允许发起的最大连接数; 禁锢本地用户: chroot_local_user=YES #禁锢所有本地用户;注意:要求用户不能对家目录有写权限; chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list #禁锢指定用户于家目录中; 用法访问控制 userlist_enable=YES 启用时,vsftpd将加载一个由userlist_file指令指定的用户列表文件;此文件中的用户是否能访问vsftpd服务取决于userlist_deny指令; userlist_deny=YES #表示此列表为黑名单; userlist_deny=NO #表示此列表为白名单;
pam_service_name=vsftpd #验证本地账户可以登录FTP服务器。
注意事项:
vsftpd文件为 /etc/pam.d/vsftp,查看cat /etc/pam.d/vsftp
[root@Centos7 ftp]# 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 #此处禁用 /etc/vsftpd/ftpusers的用户登录FTP系统 auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth [root@Centos7 ftp]#
§·Linux中 VSFTP基于mariadb用户名密码认证
※·设置vsftpd主配置文件中参数设置
~]#vim /etc/vsftpd/vsftpd.conf write_enable=YES #禁止匿名账户登录,所有的账户其实是映射到本地账户权限的 local_enable=YES #开启本地账户登录权限 write_enable=YES #开启上传总开关,实际的上次权限在独立文件中定义 pam_service_name=vsftpd.sql #设置pam认证的选项,通过/etc/pam.d/vsftpd.sql文件认证sql用户 guest_enable=YES #设置启用虚拟账户认证功能 (启用来宾账号功能) guest_username=vuser #设置映射的账户(把来宾账号映射的实际系统账户) user_config_dir=/etc/vsftpd/users_conf #在该目录下设置虚拟账户同名文件控制账户独立权限
※·设置vsftpd的虚拟账户的本地映射实际账户
该文件的名称根据 /etc/vsftpd/vsftpd.conf 设置
~]# mkdir /ftproot #创建映射账户的家目录 ~]# useradd -d /ftproot vuser #设置虚拟账户 vuser ~]# mkdir /ftproot/{pub,upload} #在家目录中新增两个FTP目录 ~]# setfacl -m u:vuser:rwx /ftproot/upload #设置vuser对upload有上传修改权限
该文件的名称根据 /etc/vsftpd/vsftpd.conf 设置
# mkdir /etc/vsftpd/vusers_conf #touch /etc/vsftpd/vusers_conf/{tom,jerry} #vim /etc/vsftpd/vusers_conf/tom
※·设置vsftpd的pam可以访问mysql数据库中的账户
pam配置文件:/etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so user=vsftpd passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
参数解释:
auth required:验证用户名和密码是否存储 pam_mysql.so :通过pam_mysql.so共享模块访问mysql数据库(模块文件路径为:/usr/lib64/securit/pam_mysql.so) user=vsftpd passwd=mageedu host=localhost :登录mysql服务器的用户名和密码,及其mysql服务器地址 db=vsftpd : mysql服务器上的数据库名称 table=users : mysql服务器上的表名称 usercolumn=name : mysql表中用户名字段 passwdcolumn=password : mysql表中密码字段 crypt=2 : mysql数据库中加密类型
◎·编译pam连接mariadb的共享库文件pam_mysql.so
准备编译环境,安装编译需要的头文件,库文件,下载连接程序 pam_mysql-0.7RC1
# yum -y groupinstall "Development Tools" "Server Platform Development" # yum -y install pam-devel openssl-devel mariadb-devel
下载下载连接程序 pam_mysql-0.7RC1,编译并安装
~]#get http://10.1.0.1/pub/pam/pam_mysql-0.7RC1 ~]#tar -xf pam_mysql-0.7RC1 ~]#cd pam_mysql-0.7RC1 ~]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security ~]# make && make install 生成的共享模块pam_mysql.so会自动安装到 :/usr/lib64/securit/pam_mysql.so
◎·安装mariadb,创建本地数据库,建立对应的用户名和密码
创建数据库,创建表,插入用户名和密码数据,添加访问账户
mysql> CREATE DATABASE vsftpd; mysql> CREATE TABLE vsftpd.users \ (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, \ name CHAR(30) NOT NULL UNIQUE KEY, \ password CHAR(48)); mysql> INSERT INTO vsftpd.users(name,password) \VALUES ('tom',PASSWORD('mageedu')),('jerry',PASSWORD('mageedu')); mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'mageedu'; mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'mageedu'; mysql> FLUSH PRIVILEGES;
※·小结:关于vsftpd 基于本地MySQL认证用户名和密码
1 . 配置vsftpd的主配置文件基于pam认证的功能;
2 . 配置pam认证的配置文件连接mysql可以读取mysql数据库中的用户名和密码;
3 . 登录到vsftp的虚拟用户需要映射到本地实际的存在的用户名和密码,这个需要自己手工配置。
4 . 对个每个mysql数据库中的用户名和密码的权限控制在 user_config_dir=/etc/vsftpd/users_conf 目录下,新 建同名的文件,在文件中指明权限,参数为vsftpd主配置文件中对于匿名用户的权限。
※·vsftpd基于本地用户文件认证
vsftpd虚拟账户的数据保存在berkeley DB格式的数据文件中,需要安装 db4-utils工具来创建这样的数据文件,具体的步骤如下:
1.创建虚拟用户的数据库文件
(通过db4-utils把文件转为berkeley DB格式文件)
注意:Centos 7 的安装包为:libdb-utils-5.3.21-19.el7.x86_64
[root@Centos7 vsftpd]# rpm -ql libdb-utils-5.3.21-19.el7.x86_64 /usr/bin/db_archive /usr/bin/db_checkpoint /usr/bin/db_deadlock /usr/bin/db_dump /usr/bin/db_dump185 /usr/bin/db_hotbackup /usr/bin/db_load /usr/bin/db_log_verify /usr/bin/db_printlog /usr/bin/db_recover /usr/bin/db_replicate /usr/bin/db_stat /usr/bin/db_tuner /usr/bin/db_upgrade /usr/bin/db_verify [root@Centos7 vsftpd]#
首先需要创建明文的密码文件,明文文件奇数行为用户名,偶数行为密码,然后使用db_load工具将其转换为数据库文件。
~]# cat vlogin sb 123456 sa 123456 sc 123456 sd 123456 ~]# db_load -T -t hash -f vlogin vlogin.db ~]# ll -rw-r--r--. 1 root root 40 Oct 14 12:32 vlogin -rw-r--r--. 1 root root 12288 Oct 14 12:33 vlogin.db ~]#
2.修改配置文件/etc/vsftpd/vsftpd.conf
pam_service_name=vlogin guest_enable=YES guest_username=vuser user_config_dir=/etc/vsftpd/users_conf
3.添加/etc/pam.d/vlogin文件内容
[root@Centos7 vsftpd]# cat /etc/pam.d/vlogin auth required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vlogin account required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vlogin
※·小结:关于VSFTP基于本地用户文件认证流程:
1 . 创建本地用户文件,并且把文件转换成二进制格式;
2 . 配置vsftpd的主配置文件,添加pam认证的功能;
3 . 配置pam的配置文件,可以读取本地二进制文件;
4 . 测试通过本地文件中的用户名和密码登陆
§·常见问题处理
原创文章,作者:linux_root,如若转载,请注明出处:http://www.178linux.com/51606