ftp&vsftpd详解
1. ftp简介
1.1 文件传输协议
- File Transfer Protocol,文件传输协议
- C/S架构
- ftp是明文传输
1.2 两路ftp连接
- 当传输数据时,会新建立一个连接,而非使用此前建立的命令连接。
- 命令连接:传输命令
- 数据连接:传输数据
1.3 文本模式&二进制模式
- 文本模式:
- 文本传输是使用ASCII字符,并由回车键和换行符分开,二进制不用转换或格式化就可以传输字符
- 二进制模式比文本模式更快,并且可以传输所有ASCII值,所以一般将FTP设置成二进制模式
- 二进制模式:
- 二进制模式用来传输可执行文件、压缩文件、图片文件
- 如果用ASCII模式传送,会显示一堆乱码,必须重新用BINARY模式传
- 注意:用HTML和文本编写的文件必须用ASCII模式上传,用BINARY模式上传会破坏文件,导致文件执行出错
2. ftp的两种工作模式
2.1 主动模式(PORT)
1)工作图示&分析
- FTP客户端通过向FTP服务器端发送PORT命令,告诉服务器该客户端传输数据的临时端口
- 当需要传送数据时,服务器通过TCP的20端口与客户端的临时端口建立数据传输通道,完成数据传输
- 在建立连接的过程中,由服务器主动发起连接,因此被称为主动方式
2)工作原理
- Server:20/tcp端口连接客户端命令连接使用的向后的第一个可用端口
- 客户端在一个随机端口上向服务端的21/tcp端口发起请求,服务端响应后,连接成功
- 客户端向服务端发起一个GET请求后,服务端便会通过自己的20/tcp端口,向客户端之前的那个随机端口+1的端口传输数据,如果随机端口+1的端口被其他程序占用,那么会使用再次+1的端口,以此类推,直到找到一个合适的端口
- 传输完毕后发送数据的一方主动关闭数据连接
2.2 被动模式(PASV)
1)工作图示&分析
- FTP客户端通过向FTP服务器端发送PASV命令,告诉服务器进入被动模式,服务器选择临时端口并告知客户端
- 当需要传送数据时,客户端主动与服务器的临时端口号建立数据传输通道,完成数据传输
- 在整个过程中,由于服务器总是被动接收客户端的数据连接,因此被称为被动方式
2)工作原理
- Server:打开一个随机端口,并等待客户端连接
- 客户端在一个随机端口上向服务端的21/tcp端口发起请求后,服务端会进行响应
- 告诉客户端这里已经开放了某个端口,可以连接了
- 服务端响应时不会直接发送端口号,而是会发送两个数字,如173,26,(表示打开的端口除以256所得到的商和余数,这里表示44314)
- 客户端收到服务端的端口后,就连接服务端的端口进行数据传输
3. vsftp详解
3.1 vsftp概述
1)概述
- vsftp是安全的FTP程序
- URL的格式
- SCHEME://username:password@HOST:PORT/path/to/file
- 路径映射
- 用户家目录:每个用户的URL的 / 映射到当前用户的家目录
- vsftp以ftp用户的身份运行进程
- 默认用户即为ftp用户,匿名用户的默认路径即为ftp用户的家目录 /var/ftp
- 匿名用户:ftp、anonymous
2)程序结构
- 主程序:/usr/sbin/vsftpd
- Unit File:/usr/lib/systemd/system/vsftpd.service
- 主配置文件:/etc/vsftpd/vsftpd.conf
- 数据根目录:/var/ftp
3.2 vsftp的用户类别
- 匿名用户
- anonymous --> ftp : /var/ftp
- 匿名用户其实也是系统用户,只不过这个系统用户叫ftp,而这个用户的家目录为/var/ftp
- 系统用户
- 若系统用户可以访问,则此用户可以通过ftp访问该系统上任何可以被该用户访问的资源,家目录就是用户的家目录
- /etc/pam.d/vsftp文件中include了passwd-auth.so,而这个文件中又包含了pam_unix.so,这个文件就定义了可以通过系统用户来访问
- 注意:至少禁止系统用户访问ftp服务
- /etc/vsftpd/ftpusers
- PAM(/etc/pam.d/vsftpd)
- 虚拟用户
- 非系统用户,用户账号不是可登陆操作系统的用户账号(非/etc/passwd)
注意:
- 用户通过vsftpd服务访问到的默认路径,是用户自己的家目录,默认可以在自己有权限访问的所有路径间切换
- 要禁锢用户于其家目录中
3.3 配置vsftpd
注意事项:
- 如果开启了chroot_list_enable功能,需要自行创建chroot_list_file指定的文件,否则vsftpd服务无法正常提供服务
4. vsftpd认证虚拟用户
4.1 先创建一个系统用户
- 因为虚拟用户要使用这个系统用户访问文件,所以需要先创建一个系统用户
# 设置该用户的主目录为/home/vsftpd, 且禁止ssh登录 useradd vsftpd -d /home/vsftpd -s /sbin/nologin
4.2 创建虚拟用户
1)创建虚拟用户主目录
mkdir -p /home/vsftpd/{ftp1, ftp2}
2)创建虚拟用户
vim /etc/vsftpd/loginuser # 添加: ftp1 123 ftp2 456 # 创建了ftp1和ftp2这两个虚拟用户,密码分别为123和456
4.3 创建数据库文件
1)使用db_load命令生成db
- 因为保存虚拟账号和密码的文本文件无法被系统账号直接调用,所以需要使用db_load命令来生成db
db_load -T -t hash -f /etc/vsftpd/loginuser /etc/vsftpd/loginuser.db # 参数说明: # -T:允许应用程序能够将文本文件转译载入进数据库 # -t hash :使用hash加密 # -f:指定包含用户名和密码的文本文件(此文件的格式为:奇数行为用户名,偶数行为密码)
2)修改数据库文件的权限
chmod 600 /etc/vsftpd/{loginuser,loginuser.db}
4.4 pam认证中加入数据库文件认证
- 在vsftpd对应的pam认证模块中加入数据库文件认证
vim /etc/pam.d/vsftpd # 清空后加入: auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/loginuser account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/loginuser # 注意,这里的就是上面创建的文件数据库, 这里的loginuser不需要加db的后缀
4.5 创建虚拟用户配置文件
- 将所有的虚拟用户的配置文件统统放入这个目录,且目录中配置文件的名称必须与虚拟用户名一致
- mkdir /etc/vsftpd/userconf/
- 创建各个虚拟用户的配置文件
vim /etc/vsftpd/userconf/ftp1
local_root=/home/vsftpd/ftp1/ # 设定主目录为/home/vsftpd/ftp1 write_enable=YES
anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
4.6 修改主配置文件
- 修改/etc/vsftpd/vsftpd.conf
anonymous_enable=NO # 禁止匿名用户登录 chroot_local_user=YES # 禁止用户访问除主目录以外的目录 ascii_upload_enable=YES # 设定支持ASCII模式的上传和下载功能 ascII_download_enable=YES chown_uploads=YES # 允许虚拟用户上传文件 chown_username=vsftpd # 注意:这里是创建的Linux本地用户vsftpd, 不改这里虚拟用户将不能下载文件 guest_enable=YES # 启动虚拟用户 guest_username=vsftpd # 虚拟用户使用的系统用户名 user_config_dir=/etc/vsftpd/userconf # 虚拟用户使用的配置文件目录 allow_writeable_chroot=YES # 最新版的vsftpd为了安全必须用户主目录(也就是/home/vsftpd/ftp1)没有写权限,才能登陆, # 或者使用allow_writeable_chroot=YES
4.7 vsftpd创建虚拟用户的资料
- https://blog.csdn.net/make_zhf/article/details/81099184
- https://www.cnblogs.com/tssc/p/9582780.html
- http://www.myjishu.com/?p=369
5. pam_mysql认证ftp虚拟用户