10.1、FTP服务简介
FTP是Internet上使用非常广泛的一种通信协议,用于在不同的主机之间进行文件传输。Linux系统下常用的FTP服务器软件包括有wu-ftpd;vsftpd(Very Secure ftp Daemon);proftpd;pureftpd等。客户端软件有
CLI:ftp;lftp;(wget ,lftpget)下载工具,非交互式 GUI: gftpd ;FlashFXP;Cuteftp;Filezilla |
FTP采用C/S的工作模式,通过TCP协议建立客户端和服务器之间的连接。但与其他大多数的应用协议不同,FTP协议在客户端和服务器之间建立了两套通信链路,分别是控制链路和数据链路。其中,控制链路负责FTP会话过程中FTP命令的发送和接收,数据链路则负责数据的传输。FTP客户端与服务器之间的通信过程如下所示:
1、用户使用FTP协议的客户机程序,连接到远程的FTP服务器程序上 2、用户使用客户端程序进行FTP文件的上传或下载,FTP客户端程序通过控制链路向FTP发送相应的控制命令 3、服务器程序接收并执行用户所发出的命令 4、FTP服务器将执行结果返回到客户端 |
默认情况下,FTP服务器程序使用两个预分配端口号20和21,分别用于传输数据链路和控制链路。但是传输数据又可以分为主动模式与被动模式,其数据传输端口有所不同。
主动模式工作的原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送PORT命令到FTP服务器 ,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:
被动模式工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上 ),然后把开放的端口告诉客户端,客户端再连接到服务器开放的端口进行数据传输,原理如下图:
参考:https://my.oschina.net/binny/blog/17469
10.2、vsftpd服务器的安装与配置
vsftpd可以通过rpm包或者源码安装,通过rpm安装只需使用yum命令即可,这里介绍源码安装。其官方地址为http://vsftpd.beasts.org/,这里以3.0.2版本介绍vsftpd的安装与配置。
文件的组成:
/etc/vsftpd: 配置文件目录 /etc/rc.d/init.d/vsftpd: 服务脚本 /usr/sbin/vsftpd: 主程序 /var/ftp:数据文件目录(匿名用户访问目录) /etc/pam.d/vsftpd: 认证文件 pam(Plugable Authentication Module)插件式认证模块 模块化库文件:/lib64/security/pam*.so 认证配置文件:/etc/pam.conf和/etc/pam.d/* 基本配置:/etc/vsftpd/vsftpd.conf |
[[email protected] vsftpd-3.0.2]# useradd nobody #默认配置需要使用的用户 [[email protected] vsftpd-3.0.2]# mkdir /usr/share/empty #默认配置需要使用的目录 [[email protected] vsftpd-3.0.2]# mkdir /var/ftp #匿名用户需要使用的目录 [[email protected] vsftpd-3.0.2]# useradd -d /var/ftp/ ftp [[email protected] vsftpd-3.0.2]# chown root.root /var/ftp/ [[email protected] vsftpd-3.0.2]# chmod og-w /var/ftp/ [[email protected] app]# tar xf vsftpd-3.0.2.tar.gz [[email protected] app]# cd vsftpd-3.0.2 [[email protected] vsftpd-3.0.2]# make && make install [[email protected] vsftpd-3.0.2]# cp vsftpd.conf /etc/ #复制配置文件到
- 启动和关闭vsftpd
vsftpd支持两种启动方式:xinetd和standalone。其中,xinetd是通过xinetd进程来启动和关闭vsftpd服务,这是vsftpd默认启动方式。standalone方式则是采用独立进程启动和关闭,与普通程序的启动方式一样。
xinetd方式:
采用这种方式时,vsftpd不能单独管理,当vsftpd需要重启时,也必须重启整个xinetd服务器。
standalone方式:
使用这种方式时,vsftpd服务将作为单独的进程来启动和关闭,配置standalone启动方式步骤为:
[[email protected] vsftpd-3.0.2]# vim /etc/xinetd.d/vsftpd #将diabale选项改为yes service ftp { socket_type = stream wait = no user = root server = /usr/local/sbin/vsftpd # server_args = # log_on_success += DURATION USERID # log_on_failure += USERID nice = 10 disable = yes } [[email protected] vsftpd-3.0.2]# vim /etc/vsftpd.conf #指定standalone启动方式 listen=YES [[email protected] vsftpd-3.0.2]# chkconfig vsftpd --level 3 off #关闭自启动服务 [[email protected] vsftpd-3.0.2]# /usr/local/sbin/vsftpd & #启动 [1] 1926
登录ftp:
[[email protected] vsftpd-3.0.2]# ftp localhost #登录本机 Trying ::1... ftp: connect to address ::1Connection refused Trying 127.0.0.1... Connected to localhost (127.0.0.1). 220 (vsFTPd 3.0.2) Name (localhost:root): anonymous #匿名用户登录 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 (127,0,0,1,143,37). 150 Here comes the directory listing. 226 Directory send OK. ftp> quit #退出 221 Goodbye. [[email protected] vsftpd-3.0.2]#
- vsftpd.conf配置文件
vsftpd服务器的配置主要通过其主配置文件/etc/vsftpd.conf来完成。该文件以‘#‘作为注释,每个选项一行,格式为‘选项=值‘。
常用选项:
匿名用户的配置: anonymous_enable=YES登陆权限 anon_upload_enable=YES上传权限 anon_other_write_enable=YES删除权限 anon_mkdir_write_enable=YES创建目录 启用写入功能时,ftp用户对相应的本地文件系统也有相应的写入权限;生效的权限取决于文件系统权限和服务权限的交集。 禁锢用户于其家目录中: chroot_local_user={Yes|No} chroot_list_enable={YES|NO} 只禁锢列表中的用户在家目录 chroot_list_file=/etc/vsftpd/chroot_list 禁锢用户列表 欢迎信息的定义: ftp_banner=some string 或者banner_file=/path/to/some_banner_file(文件中写欢迎信息) dirmessage_enable=yes(切换目录时,目录下的欢迎信息) 在ftp可访问的目录下创建.messages文件 控制登录用户的机制: /etc/vsftpd/ftpusers中的用户都不允许使用ftp服务, 这是在/etc/pam.d/vsftpd中定义。 user_list配置文件有两种用法: 黑名单: userlist_enable=YES userlist_deny=YES 白名单: userlist_enable=YES userlist_deny=NO 连接限制: max_clients: 最大并发连接数 max_per_ip: 每IP可同时发起并发请求 传输速率: anon_max_rate: 匿名用户的最大传输速率,单位是“字节/秒”; local_max_rate: 本地用户的最大传输速率,单位是“字节/秒” 上传文件的umask: anno_umask: 匿名用户上传文件的umask; local_umask: 本地用户上传文件的umask; 修改匿名用户上传文件的属主和属组: chown_uploads=YES chown_username=someuser |
ftp的系统用户:
匿名用户 --> 系统用户: anonymous_enable
系统用户:local_enable
虚拟用户:所有的虚拟用户会映射会一个系统用户,访问时的文件目录是为此系统用户的家目录。
用户的存放位置:
hash编码的文件:奇数行为用户名,偶数行为密码
关系型数据库:pam-mysql实现认证
10.2、vsftpd基于pam-mysql的认证方式
1、安装mysql和pam_mysql
[[email protected] home]# yum -y install vsftpd mysql-server mysql-devel pam_mysql
2、准备数据库及相关表
mysql> create database vsftpd; mysql> grant select on vsftpd.* to [email protected] identified by ‘mylinux‘; mysql> grant select on vsftpd.* to [email protected] identified by ‘mylinux‘; mysql> flush privileges; mysql> use vsftpd; mysql> create table users ( -> id int AUTO_INCREMENT NOT NULL, -> name char(20) binary NOT NULL, -> password char(48) binary NOT NULL, -> primary key(id) -> );
3、添加测试的虚拟用户,为了安全起见应该使用PASSWORD函数加密后存储。
mysql> insert into users(name,password) values(‘tom‘,password(‘123456‘)); mysql> insert into users(name,password) values(‘jerry‘,password(‘123456‘));
4、建立pam认证所需文件#vi /etc/pam.d/vsftpd.mysql
auth required /lib/security/pam_mysql.so user=vsftpd passwd=mylinux host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required /lib/security/pam_mysql.so user=vsftpd passwd=mylinux host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。
5、修改vsftpd的配置文件,使其适应mysql认证,建立虚拟用户映射的系统用户及对应的目录
[[email protected]ost home]# useradd -s /sbin/nologin -d /var/ftproot vuser [[email protected] home]# chmod go+rx /var/ftproot
确保/etc/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES
而后添加以下选项
guest_enable=YES guest_username=vuser
并确保pam_service_name选项的值如下所示
pam_service_name=vsftpd.mysql
6、启动vsftpd服务
[[email protected] home]# service vsftpd start Starting vsftpd for vsftpd: [ OK ] [[email protected] home]# chkconfig vsftpd on
7、配置虚拟用户具有不同的访问权限
配置vsftpd为虚拟用户使用配置文件目录
# vim vsftpd.conf
添加
user_config_dir=/etc/vsftpd/vusers_config
创建所需要目录,并为虚拟用户提供配置文件
# mkdir /etc/vsftpd/vusers_config/ # cd /etc/vsftpd/vusers_config/ # touch tom jerry
配置虚拟用户的访问权限,虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如果需要让tom用户具有上传文件的权限,可以修改/etc/vsftpd/vusers/tom文件,在里面添加如下选项即可。
anon_upload_enable={YES|NO} anon_mkdir_write_enable={YES|NO} anon_other_write_enable={YES|NO}