1 ftp ftp是应用层协议,可以跨平台。但也由于是应用层,很多功能无法实现。现在的存储模型有三种:DAS(直接附加存储,硬盘就是),NAS(网络附加存储,网络共享),SAN(块级别共享,更底层) ftp:文件传输协议,监听在21/tcp,只能通过tcp套接字,C/S架构。由于它比http协议更复杂,因此它有许多的文件管理类命令。需要在ftp连接上传输两类数据。第一类就是文件管理类命令,称为命令连接;第二类是数据本身传输,称为数据连接。 客户端第一次连接服务器端时,请求的是21端口,21号端口需要验证用户的身份。验证完成之后,用户需要使用ls查看,ls执行的结果就会通过命令连接进行响应,告诉客户端执行是否成功。当用户试图传输一个文件时,在命令连接上发起命令,如get,当这个命令发送给服务器端时,服务器端就会通过系统调用加载请求的文件,然后将其分割成包,另起一个数据连接,借助于此连接发送给客户端。命令连接是一直存在的,除非使用bye命令,而数据连接是按需建立的,传输完毕后拆除。 ftp服务器大都工作在单进程响应模型下,创建子进程响应用户请求,ftp允许并发连接。 ftp既支持文本格式的传输,也支持二进制格式的传输。文件基于什么编码,就通过什么方式传输。所以不能认为限制它的传输格式。ftp的传输有主动和被动两种模式,由服务器端创建的连接叫主动。数据连接的建立就是主动连接,但是服务器端请求客户端,怎么知道客户端的端口号是多少呢? 主动模式的工作机制是这样的:客户端选择一个随机端口比如50000对服务器端21端口发起命令连接,但是服务器端响应建立数据连接时,会使用20/tcp端口主动连接客户端50000+1这个端口,如果此端口被占用就使用50000+2,以此类推。注意:20端口只是负责建立联系,真正传输的还是随机端口。不然多个用户请求如何搞定啊。客户端请求时会告知服务器端的端口号的。 但是这样一来,服务器端是可以随意给客户端发数据的。为了安全,需要通过防火墙进行防御。防火墙通常是针对客户端的,因为作为客户端只会向服务器端发请求,而不会有其他客户端向它请求的。因此防火墙就是将端口号统统关闭,别人无法套接字和客户端建立联系。但是客户端是可以访问的,访问收到的请求也可以进来。但ftp服务器端发起的数据请求就进不来了,由于客户端端口号是随机的,也无法定位开放端口。所以这就是主动连接的弊端。这也催生了别动模式。 被动模式下,客户端还是选择一个随机端口比如50000对服务器端21端口发起命令连接,当客户端收到用户的get命令后,就会启动一个子进程监听在一个随机端口上,然后通过命令连接告诉客户端此端口号。这样一来,客户端就可以使用50000+1端口号去连接服务器端告知的端口号了。告诉的方式很独特121,23,就是告诉客户端端口号是121*256+23,客户端还需计算才知道。 服务器端的防火墙怎么搞呢?防火墙是工作在内核中的,只能控制网络层、传输层等。客户端可是使用随机端口的。防火墙会追踪命令的相关性,叫做连接追踪功能。 请求响应有响应码: 1XX:信息 2XX:成功 3XX:提示需进一步提供补充类信息的状态码 4XX:客户端错误 5XX:服务器端错误 1.1 用户认证vsftpd默认使用系统用户认证,ftp是明文的。认证过程也是如此。 vsftpd同时默认调用pam完成用户认证。 虚拟用户:仅用于访问某特定服务中的资源。ftp支持使用虚拟用户、系统用户、匿名用户的认证。为了想要使用所有的认证方式,需要在编译时,将功能全都编译进去,但是用户认证只会使用其中一种机制,其他认证机制就大大浪费了。不像httpd是模块化的,不想使用某种能就直接停止模块。但其他很多程序都需要用到用户认证,因此,一个统一的框架出现了。 nsswitch:名称解析框架。用户名转uid,服务转端口,主机名转ip等等。配置文件位置在/etc/nsswitch.conf。模块位置:/lib64/libnss*,/usr/lib64/libnss* pam:sun公司研发,插入式认证模块,模块在/lib64/security/目录下。用户认证框架。。配置文件位置/etc/pam.conf,/etc/pam.d/*,任何程序想要用到pam的功能,只需/etc/pam.d目录下建立配置文件即可。pam是有限制的,无法跨平台。因此httpd不会使用此模块。 1.2 服务器端程序wu-ftpd:非常古老,华盛顿大学研发 proftpd: pureftp: vsftpd:非常安全 ServU: 客户端: ftp: lftp,lftpget: wget,curl: filezilla:跨平台 gftp:linux 图形工具 Flashfxp:商业,windows cuteftp:windows 1.3 ftp安装centos 6自带vsftpd,使用时记得关闭防火墙 1.3.1 查看生成的文件及文件的意思1
2
3
4
5
6
7
8
9
10
11
12
| [root ~]# rpm -ql vsftpd|less
/etc/logrotate.d/vsftpd # 日志滚动脚本
/etc/pam.d/vsftpd # 用户认证配置文件
/etc/rc.d/init.d/vsftpd
/etc/vsftpd # 配置文件目录
/etc/vsftpd/ftpusers # 用来控制哪些用户可以登录,哪些不能登录
/etc/vsftpd/user_list # 用来控制哪些用户可以登录,哪些不能登录
/etc/vsftpd/vsftpd.conf # 主配置文件
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/sbin/vsftpd # 主程序
/var/ftp # 匿名用户共享资源存放位置,匿名用户被映射成ftp用户,ftp用户的家目录就是此目录。
/var/ftp/pub # 共享子目录,可以修改此目录的权限实现用户上传,而不能改/var/ftp根目录。
|
系统用户访问的资源路径是自己的家目录。虚拟用户访问的位置是给虚拟用户指定的映射成为的系统用户的家目录。 1.3.2 启动服务[root ~]# service vsftpd start [root ~]# ss -tunl # 21端口 1.3.3 查看连接的过程1
2
3
4
5
6
7
8
9
10
11
12
13
14
| [root ~]# ftp 172.16.45.10
Connected to 172.16.45.10 (172.16.45.10).
220 (vsFTPd 2.2.2) # 2XX状态码
Name (172.16.45.10:root): ftp
331 Please specify the password. # 3XX
Password: # 密码为空
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (172,16,45,10,174,169). # 被动模式,服务器端告知端口号174,169
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Aug 04 2014 pub
226 Directory send OK. # 目录显示成功
|
1.3.4 查看支持的命令1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| ftp> help
Commands may be abbreviated. Commands are:
!debugmdirsendportsite
$dirmgetputsize
accountdisconnectmkdirpwdstatus
appendexitmlsquitstruct
asciiformmodequotesystem
bellgetmodtimerecvsunique
binaryglobmputregettenex
byehashnewerrstatustick
casehelpnmaprhelptrace
cdidlenlistrenametype
cdupimagentransresetuser
chmodlcdopenrestartumask
closelspromptrmdirverbose
crmacdefpassiverunique?
deletemdeleteproxysend
|
1.4 配置文件#后接空格再接字符表示注释信息,而#直接跟字符表示可以启动的选项。需要启动的选项前面如果有空格,不会报错,但也不会生效。因此,需要顶格写。 用户对某资源的权限,取决于文件共享权限和系统权限的交集。即使开启用户上传权限,用户对此目录没有写权限也是无法上传的。 1
2
3
| [root ~]# cd /etc/vsftpd/
[root vsftpd]# cp vsftpd.conf vsftpd.conf.bak
[root vsftpd]# vim vsftpd.conf
|
匿名用户配置: anonymous_enable=YES # 启动匿名用户,允许任何人访问 anon_upload_enable=YES # 允许匿名用户上传,默认注释 anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_ohter_write_enable=YES # 允许匿名用户删除文件 允许匿名用户在上传后,修改上传文件的权限及属主属组信息,防止其他匿名用户进行修改或删除。 本地用户配置: local_enable=YES # 允许系统用户登陆 write_enable=YES # 系统用户有写权限 local_umask=022 # 系统用户上传后文件的权限 chroot_local_user=YES # 锁定系统所有用户只能活动在自己的家目录 chroot_list_enable=YES # 需要和下面的选项一起使用 chroot_list_file=/etc/vsftpd/chroot_list # 首先需要开启上面的选项,凡是写入此文件中的用户均锁定 日志: xferlog_enable=YES # 开启上传和下载日志 xferlog_std_format=YES # 使用标准格式 xferlog_file=/var/log/xferlog # 日志文件存放位置 连接限制: max_clients:最大连接并发数 max_per_ip:每个IP可同时发起的并发请求数 传输速率: anon_max_rate:匿名用户的最大传输速率,单位字节/秒 local_max_rate:本地用户 通用: chown_uploads=YES # 改变上传用户的属主 chown_username=whoever # whoever改为需要的属主 idle_session_timeout=600 # 会话的空闲时长 data_connection_timeout=120 # 数据连接时长 ascii_upload_enable=YES # 强制使用文本传输 ascii_download_enable=YES # 强制使用文本传输 ftpd_banner=Welcome to blah FTP service. # 欢迎信息 userlist_enable=YES # 开启vsftpd自带黑名单
dirmessage_enable=YES # 在ftp的任何一个目录下,建立一个.message的文件。里面输入的信息在任何用户切换至此目录时,予以显示。
pam_service_name=vsftpd # 指明使用/etc/pam.d/目录下的配置文件进行认证。一旦将用户名写入到/etc/vsftpd/ftpuser文件中,将不允许登陆。这个机制由/etc/pam.d/vsftpd控制。和vsftpd自带的黑名单效果一样。
userlist_deny=YES|NO # 为NO表示白名单,YES为黑名单。文件位置:/etc/vsftpd/user_list,只需写入用户名即可。 1.5 虚拟用户配置所有虚拟用户虽然不是系统用户,但是会映射为一个指定的系统账号,访问的共享位置即为此系统帐号的家目录。各虚拟用户可被赋予不同的访问权限,需要通过匿名用户的权限控制参数进行指定。 虚拟用户的存储方式:存储在文件中,奇数行为用户名,偶数行为密码。需要编码成哈希(二进制)格式。但改变起来极不方便;还可以存储在数据库的表中,即时查询数据库完成用户认证。但pam要依赖于pam_mysql模块,需要另外安装。 1
2
3
4
5
6
7
8
9
| [root vsftpd]# yum install pam_mysql
[root vsftpd]# rpm -ql pam_mysql # 生成的文件
/lib64/security/pam_mysql.so # 有用的就这个了
/usr/share/doc/pam_mysql-0.7
/usr/share/doc/pam_mysql-0.7/COPYING
/usr/share/doc/pam_mysql-0.7/CREDITS
/usr/share/doc/pam_mysql-0.7/ChangeLog
/usr/share/doc/pam_mysql-0.7/NEWS
/usr/share/doc/pam_mysql-0.7/README
|
pam_mysql这个模块已经有近10年没有更新了,因为功能已经完善。可以查看/usr/share/doc/pam_mysql-0.7/README,来获取所有的帮助信息,真的很详细。 当ftp服务器和mysql是独立的两台主机时,mysql必须允许ftp服务器上的用户过来查询。 1.5.1 配置ftp和mysql处于独立的主机时,ftp虚拟用户的认证环境:172.16.45.10为ftp服务器,vftpd版本为2.2.2;172.16.45.100为数据库服务器,版本为MariaDB 5.5.43 1、首先在数据库服务器上创建存储虚拟用户的数据库,这里将其创建成vsftpd数据库 1
2
3
4
5
| [root ~]# mysql
MariaDB [(none)]> CREATE DATABASE vsftpd;
MariaDB [(none)]> use vsftpd;
MariaDB [vsftpd]> GRANT SELECT ON * TO vsftp@'172.16.45.10' IDENTIFIED BY '123456';
MariaDB [vsftpd]> FLUSH PRIVILEGES;
|
用ftp主机远程登陆试试 1
| [root vsftpd]# mysql -uvsftp -h172.16.45.100 -p # 这里没问题
|
2、返回数据库主机,创建表,表中id name passwd三个字段 1
| MariaDB [vsftpd]> CREATE TABLE users (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,name VARCHAR(50) BINARY NOT NULL,passwd CHAR(48) BINARY NOT NULL);
|
添加测试的虚拟用户。根据需要添加所需要的用户,需要说明的是,为了安全起见,这里将其密码使用PASSWORD函数加密后存储 1
| MariaDB [vsftpd]> INSERT INTO users (name,passwd) VALUES ('tom',password('123456')),('jerry',password('123456')); # 添加tom和jerry
|
3、配置vsftpd 1) 建立pam认证所需文件 1
2
3
4
5
| [root vsftpd]# vim /etc/pam.d/vsftpd.mysql # 此文件名可自定义
auth required pam_mysql.so user=vsftp passwd=123456 host=172.16.45.100 db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=0 # 第一行为认证
account required pam_mysql.so user=vsftp passwd=123456 host=172.16.45.100 db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=0 # 第二行为验证账号是否在有效期内
pam_mysql.so模块的路径可以不用写,会在默认的模块目录/lib/security/下去找。
passwdcolumn=passwd,passwd一定是users表中passwd这个字段
|
注意:由于mysql的安装方式不同,pam_mysql.so基于unix sock连接mysql服务器时可能会出问题。此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。 2) 修改vsftpd的配置文件,使其适应mysql认证 建立虚拟用户映射的系统用户及对应的目录 1
2
| [root vsftpd]# useradd -s /sbin/nologin -d /var/ftproot vuser
[root vsftpd]# chmod go+rx /var/ftproot
|
请确保/etc/vsftpd.conf中已经启用了以下选项 1
2
3
4
5
| [root vsftpd]# vim vsftpd.conf
anonymous_enable=YES
guest_enable=YES # 允许来宾用户访问
guest_username=vuser # 将来宾用户映射为vuser
pam_service_name=vsftpd.mysql # 一旦改了以后,系统用户将无法访问
|
重新启动并查看日志 1
2
3
| [root vsftpd]# service vsftpd restart
[root vsftpd]# tail /var/log/messages
[root vsftpd]# tail /var/log/secure
|
可以使用tom或者jerry进行登录了。 4、配置虚拟用户具有不同的访问权限 此时虚拟用户都被映射成了匿名用户,因此权限都相同。如果想要配置不同用户具有不同的访问权限,就需要在配置文件中定义一个目录,并在目录下面建立一个和用户名同名的文件,在此文件定义用户的基本权限。 1) 配置vsftpd为虚拟用户使用配置文件目录 1
2
| [root vsftpd]# vim vsftpd.conf
user_config_dir=/etc/vsftpd/vusers/
|
2) 创建所需要目录,并为虚拟用户提供配置文件 1
| [root vsftpd]# mkdir vusers
|
3) 配置虚拟用户的访问权限 1
2
3
4
5
6
| [root vsftpd]# cd vusers
[root vusers]# vim tom # 给此用户三项权限
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root vusers]# service vsftpd restart
|
接下来就可以使用tom进行测试了。
|