文件传输协议 (英文: File Transfer Protocol, 縮寫: FTP) 是用於在網絡上進行文件傳輸的一套標準協議. 它属于网络传输协议的应用层. FTP 是一个 8 位的客户端 - 服务器协议, 能操作任何类型的文件而不需要进一步处理, 就像 MIME 或 Unicode 一样. 但是, FTP 有着极高的延时, 这意味着, 从开始请求到第一次接收需求数据之间的时间, 会非常长; 并且不时的必須执行一些冗长的登陆进程.
FTP 是一个应用层协议, 明文传输, 使用 C/S 架构, 其服务端监听在 21/TCP 和 20/TCP,21 号端口为命令端口即控制端口, 20 号端口为数据传输端口. FTP 有两种工作模式:
主动: 由服务器创建连接
命令:
Client:50000 --> Server: 21
数据:
Server:20/tcp --> Client: 50000+1
被动: 由客户端创建连接
命令:
Client:50000 --> Server: 21
服务器告诉客户端数据端口: 121,23=121*256+23
数据:
Client: 50000+1 --> Server: 随机端口
现在使用被动模式居多, 因为主动模式下如果客户端有防火墙将会产生很多麻烦, 有些看官可能会说被动模式下服务器不也有防火墙吗? 现在的防火墙都有一种 connection track 功能, 叫连接追踪, 可以追踪同一服务开启的不同端口. FTP 的服务端有很多开源实现:
FtpServer:
wu-ftpd: 华盛顿大学 ftpd
proftpd: 专业 ftp
pureftp: 纯粹的 ftp
- vsftp:very secure
- ServU
响应码: 和 http 类似
1xx: 信息
2xx: 成功类的状态码
3xx: 提示需进一步提供补充类信息的状态码
4xx: 客户端错误
5xx: 服务端错误
大家发现他们起的名字都非常高调是吧, 哈哈. 我们今天要介绍的就是在 CentOS6.6 上的 vsftp, 号称非常安全的 ftp, 我们来看一下它怎么个用法.
FTP 的用户和系统用户几乎是没有什么关系的, 这就是所谓的虚拟用户, 这里的用户认证需要用到 nsswitch 和 pam 两个框架: 对于这两个我们以后有时间还会详细介绍
nsswitch:network server switch, 名称解析框架, 这个框架是调用各种 glibc 库, 完成系统上需要用到的名称解析功能, 如用户名和用户 ID 等
配置文件:/etc/nsswitch.conf
模块:/lib64/libnss*,/usr/lib64/libnss*
pam:pluggable authentication module, 用户认证框架
在 / lib64/security/
配置文件:/etc/pam.conf,/etc/pam.d/*
安装 ftp 很简单直接 yum install -y vsftpd 就可以了, 以下是其安装好后的几个主要文件:
- [root@www ~]# rpm -ql vsftpd
- /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/ #共享资源目录
- #vim /etc/vsftpd/vsftpd.conf #其内容必须顶格写, 不能有任何空白字符
- 12 anonymous_enable=YES #是否允许匿名用户
- 27 #anon_upload_enable=YES #是否运行匿名用户上传
这一行开启匿名用户也无法上传, 因为对目录没有写权限, 所以可以进行以下操作
- mkdir /var/ftp/upload
- setfacl -m u:ftp:rwx /var/ftp/upload
- 31 #anon_mkdir_write_enable=YES #是否允许匿名用户创建目录
- anon_other_write_enable=YES #是否运行匿名用户删除文件
- 15 local_enable=YES #是否运行系统用户, 登录后默认在其家目录下
- 18 write_enable=YES #系统用户的所有写权限
- 13 anon_umask=022 #这个是匿名用户上传文件的权限, 优先级高于 local_umask
- 22 local_umask=022 #系统用户上传文件后的权限
- 96 #chroot_local_user=YES #锁定系统用户到其家目录
- 97 #chroot_list_enable=YES #只锁定部分系统用户
- 98 # (default follows)
- 99 #chroot_list_file=/etc/vsftpd/chroot_list #锁定的用户的名称
- 35 dirmessage_enable=YES #在某文件目录下, 建立一个. message 文件, 访问此目录时会显示此文件中的内容
- 39 xferlog_enable=YES #是否开启 ftp 传输日志
- 56 xferlog_std_format=YES #是否使用标准日志格式
- 52 #xferlog_file=/var/log/xferlog #日志文件位置
- 47 #chown_uploads=YES #上传的文件是否改变其属主
- 48 #chown_username=whoever #属主变为谁
- 59 #idle_session_timeout=600 #空闲会话超时时长
- 62 #data_connection_timeout=120 #数据连接超时时长
- 81 #ascii_upload_enable=YES #强制文本格式上传
- 82 #ascii_download_enable=YES #强制文本格式下载
- 85 #ftpd_banner=Welcome to blah FTP service. #欢迎信息
- 117 pam_service_name=vsftpd #使用 pam 的那个模块, 对 vsftpd 用户进行认证,/etc/pam.d/vsftpd
- 118 userlist_enable=YES #在 / etc/vsftpd/ftpusers 此文件中的用户不可登录
- userlist_deny=YES|NO #在 / etc/vsftpd/user_list 文件中定义的用户用户是否被拒绝登录
- 119 tcp_wrappers=YES #tcp 封装
- max_clients: #最大并发连接数
- max_per_ip:# 每个 IP 可同时发起的并发请求数
- anno_max_rate:# 所有匿名用户的最大传输速率, 单位 byte/s
- local_max_rate:# 本地用户最大传输速率
根据以上的这些配置文件的设置已经可以当一个简单的 FTP 服务器来用了, 我就不再演示了, 我们上文提到虚拟用户, 各虚拟用户可被赋予不同的访问权限, 通过匿名用户的权限控制参数进行指定. 其实我们访问 ftp server 时使用的匿名用户都会映射为系统上的 ftp 用户, 我们存储虚拟用户有两种方式:
文件: 编辑文件
奇数行为用户名
偶数行为密码
此文件需要被编码为 hash 格式
关系型数据中的表中:
即查询数据库完成用户认证
文件的方式显然不安全, 虽然 ftp 就不安全... 那么我们就来看一下结合关系型数据认证虚拟用户, 这样管理性和安全性都有一定的提升. ftp 与 mysql 结合依赖于 pam-mysql, 需要安装 pam_mysql 在 epel 源中. 安装好后我们来看一下都有什么文件:
- [root@localhost ~]# 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/READM #查看这个文档, 里面有详细的解释
接下来我们就看看具体的操作步骤:
1, 设置 MariaDB,IP:192.168.1.107
这里解释一下, vsftp 是 FTPserver 上的系统用户为了映射虚拟用户的, tom,jerry 为虚拟用户, password('tom')这个是 MariaDB 上的一个加密函数, 将 tom 字符串加密存放.
2, 配置 FTP 服务器的 pam 认证, IP:192.168.1.108
3, 添加 ftp server 的系统用户
#这里纠正一点应该是 chmod go+rx /var/ftproot, 因为需要匿名用户的可读和可执行权限, 就是能够 cd 能够 ls
4, 配置 ftp server 配置文件
- [root@bogon vsftpd]# vim vsftpd.conf
- 22 anon_umask=022
- 23 local_umask=022
- 117 pam_service_name=vsftpd.mysql #验证配置文件
- 118 userlist_enable=YES
- 119 tcp_wrappers=YES
- 120
- 121 guest_enable=YES
- 122 guest_username=ftpuser #映射虚拟用户的系统账号
5, 配置不同用户的不同权限
- [root@bogon vsftpd]# vim vsftpd.conf
- 124 user_config_dir=/etc/vsftpd/vusers #定义虚拟用户目录
- [root@bogon vsftpd]# mkdir vusers
- [root@bogon vsftpd]# cd vusers/
- [root@bogon vusers]# vim tom #单个用户的配置文件, 与用户名相同即可
- 1 anon_upload_enable=YES
- 2 anon_mkdir_write_enable=YES
- 3 anon_other_write_enable=YES
- [root@bogon vusers]# vim jerry
- 1 anon_upload_enable=NO
- 2 anon_mkdir_write_enable=NO
- 3 anon_other_write_enable=NO
6, 验证结果
Tom 登录:
Jerry 登录:
我们看到 Tom 可以读写, 而 Jerry 只能读, 完全符合我们的设定. OK, 我们对 FTP 的介绍就到这里了, 还有更高级的应用大家就自行查看文档解决吧, 如有错误敬请指出.
来源: http://www.bubuko.com/infodetail-2713704.html