原文地址:http://www.178linux.com/4450
一、 ftp服务,File Transfer Protocal 文件传输协议
1. ftp基于tcp协议,C/S架构
Server: wu-ftpd, proftpd ,pureftp,vsftpd:(Very Secure ftpd),IIS,ServU
Client:
GUI: flashfxp,cuteftp,filezilla(开源), gftp(Linux)
CLI:ftp, lftp,wget, lftpget
2. ftp的传输机制
1) 命令连接和数据传输连接
最开始,只建立命令连接,当执行get命令时,开启另一端口建立文件传输连接,如果get多个文件,则建立多个连接。文件传输结束时,拆除相应的文件连接。
2) 数据连接的主动模式和被动模式
主动连接:通常客户端会装有防火墙,不允许别人主动对客户端发起连接
被动连接:可以通过服务器端连接追踪机制来解决防火墙问题,无论访问哪个端口,端口必须和已经建立的链接产生关系。
主动模式下: 服务器工作在20号端口
被动模式下: 服务器工作在随机端口
3. 传输数据:
流式话数据: 可以存入硬盘
文本文件, 二进制文件 等
4. 用户认证机制:
1) 系统用户
2) 虚拟用户。通常存放在文件或者数据库中
hash file
mysql
3) 匿名用户
5. 数据传输安全机制:
sftp :ssh提供基于ssh协议的ftp服务
ftps :基于ssl的ftp
7. 响应码
1xx:信息码
2xx:成功状态吗
3xx:进一步提示补全信息的状态
4xx:客户端错误
5xx:服务器端错误
二、 vsftpd 安装和配置
1. 安装vsftpd
# yum -y install vsftpd
/etc/pam.d/vsftpd 认证文件存放目录
/etc/rc.d/init.d/vsftpd 服务脚本
/usr/sbin/vsftpd 主程序文件
/etc/vsftpd/vsftpd.conf 主配置文件
/etc/vsftpd/ftpusers 用户黑名单
/etc/vsftpd/user_list 用户限制名单 userlist_deny=NO 仅允许此名单用户登录,userlist_deny=YES
不允许用户名单的用户登录
/var/ftp/pub 共享文件所在位置
3. 关于pam的认证文件
## 文件所在位置/etc/pam.d/vsftpd 关于认证文件
pam: Plugable Authentication Module: 插件式认证模块
1) nsswitch: 名称解析框架
模块: /lib64/libnss* , /usr/lib64/libnss*
配置文件: /etc/nsswitch.conf
2) 用户认证框架
模块化:/lib64/security/pam*.so
配置文件:/etc/pam.conf 和 /etc/pam.d/*
4. chroot选项
## 对于ftp用户访问ftp服务时使用chroot禁锢用户
## 在主配置文件/etc/vsftpd/vsftpd.conf中配置启动
chroot_local_user=YES 对于本地用户使用chroot, 将会把其家目录作为其root目录
chroot_list_enable=YES chroot_list里面的用户不受chroot影响
chroot_list_file=/etc/vsftpd/chroot_list 不受chroot指令的例外用户列表,需要手动添加,每行一个用户名。如果没有这个文件链接会失败
chroot开启前效果
ftp登录用户可以进入系统根目录
chroot开启后效果
开启后,用户的家目录被当做root了
5. 关于匿名用户的配置
anonymous_enable=YES 允许匿名用户登录
anon_upload_enable=YES 允许匿名用户上传文件
anon_other_write_enable=YES 允许匿名用户执行其他写权限
anon_mkdir_write_enable=YES 允许匿名用户创建文件夹
## 此时的权限为ftp用户配置的权限叠加文件本身权限总和的效果
## 如果文件本身权限不允许其他用户修改,基本vsftpd.conf配置了匿名用户可修改,结果依然不能修改
## 文件夹也一样,如果想要允许匿名用于在pub上传文件,需要将其other权限添加+w
6. vsftp 控制登录用户的机制
## /etc/vsftpd/ftpusers中的用户都不允许使用ftp服务, 这是在/etc/pam.d/vsftpd中定义;/etc/pam.d/vsftpd 中应该有如下一行
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
## /etc/vsftpd/user_list文件两种配置方法
## 黑名单:
userlist_enable=YES
userlist_deny=YES
## 白名单
userlist_enable=YES
userlist_deny=NO
7. 链接限制
max_clients: 最大并发连接数
max_per_ip: 每IP可同时发起并发请求
8. 传输速率
anon_max_rate: 匿名用户的最大传输速率,单位是“字节/秒”
local_max_rate: 本地用户最大传输速率, 单位是“字节/秒”
9. 匿名用户上传的文件自动转换属主和属组
chown_uploads=YES
chown_username=someuser ## 使用特定用户作为上传的文件的属主,并使用其所在的组当做属组
10. 上传文件的umask
anno_umask: 匿名用户上传文件的umask;
local_umask:
11. 欢迎信息
banner_file=/path/to/some_banner_file
ftp_banner=some string
dirmessage_enable=yes ## 需要在某ftp可访问的目录下创建.messages文件
12. 虚拟用户: 所有虚拟用户都会被映射为一个系统用户, 访问时文件目录为此系统用户的家目录
虚拟用户认证机制: hash编码的文件,奇数行为用户名,偶数行尾秘密
关系型数据库: pam-mysql第三方模块认证
三、 详解配置虚拟用户
1. 安装mysql和pam_mysql(epel源提供)
# yum -y install vsftpd mysql-server mysql-devel pam_mysql
2. 创建虚拟用户账号所映射的系统用户
# useradd -s /sbin/nologin -d /var/ftproot vuser
# chmod go+rx /var/ftproot
3. 在数据库中添加虚拟用户
mysql> create database vsftpd;
mysql> grant select on vsftpd.* to [email protected] identified by 'vsftpd';
mysql> flush privileges;
mysql> insert into users(name,password) values('tom',password('tom'));
mysql> insert into users(name,password) values('jerry',password('jerry'));
auth required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=192.168.98.128 db=vsftpd
table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=192.168.98.128
db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
## 这里说明一下,host是vsftpd所在主机的主机地址,同时也是在mysql中被授权访问的主机地址。vsftpd会通过借助pam访问数据库获取数据。
## 而vsftpd所在的主机为192.168.98.128,这里的host也是这个。 如果把vsftpd放在其他主机上与数据库分开管理也是可以的。
## crypt 加密方式
## 0 明文
## 1 Y
## 2 为mysql中的password()函数加密
## 3 md5
## 4 sha1
5. 配置vsftpd配置文件
## 主要添加下面三行
# vim /etc/vsftpd/vsfptd.conf
guest_enable=YES ## 允许使用虚拟用户
guest_username=vuser ## 虚拟用户映射为vuser系统用户
pam_service_name=vsftpd.mysql ## pam配置文件位置为/etc/pam.d/vsftpd.mysql
## 下面是一些vsftpd的基本选项
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES
## 另外每个虚拟用户的单独权限可以在 /etc/vsftpd/vuser/ 配置
例如:
# vim /etc/vsftpd/vuser/tom 写下一下几行
anon_upload_enable=YES
anon_mkdir_write_enable=YES
6. 重启vsftpd服务,测试效果
# service vsftpd restart
在另一个台主机上
# ftp 192.168.98.128
Connected to 192.168.98.128 (192.168.98.128).
220 (vsFTPd 2.2.2)
Name (192.168.98.128:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
测试成功。
7. 常见的不能正常认证的错误
1) iptables 忘记关,selinux没有disable :此时通常的错误是数据库无法访问
2) 虚拟用户无法认证: 有可能是加密方式没有设置统一
3) 数据库没法连接, 数据库访问的用户和主机要和pam文件的用户主机统一,一定要明确,是vsftpd借助pam访问数据库,而不是ftp客户端访问数据库。我在这里被坑了好几天。