FTP

post thumb
Internet
作者 Louis 发表于 2018年6月24日

摘要:FTP的简介;vsftpd的相关应用;实现基于文件验证的vsftpd虚拟用户

img

FTP介绍

  • File Transfer Protocol 早期的三个应用级协议之一

应用级协议:http smtp ftp

  • 基于C/S结构

  • 双通道协议:数据和命令连接

  • 数据传输格式:二进制(默认)和文本

  • 两种模式:服务器角度

  1. 主动(PORT style):服务器主动连接,通过command告诉服务器数据端口
命令(command):客户端:随机port --- 服务器:tcp21
数据:客户端:随机port ---服务器:tcp20
  1. 被动(PASV style):客户端主动连接,通过command告诉客户端数据端口
命令(控制):客户端:随机port --- 服务器:tcp21
数据:客户端:随机port ---服务器:随机port
  • 服务器被动模式数据端口示例:
ftp> ls
227 Entering Passive Mode (172,20,0,1,44,250).
150 Here comes the directory listing.
drwxr-xr-x   21 0        0            4096 Apr 09 10:44 pub
服务器数据端口为:44*256+250
  • 状态码
1XX:信息 125:数据连接打开
2XX:成功类状态 200:命令OK 230:登录成功
3XX:补充类 331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录
  • 用户认证:
匿名用户:ftp,anonymous,对应Linux用户ftp
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件
	nsswitch:network service switch  名称解析框架
	pam:pluggable authentication module 用户认证
	/lib64/security /etc/pam.d/ /etc/pam.conf

vsftpd

由vsftpd包提供 不再由xinetd管理 用户认证配置文件:/etc/pam.d/vsftpd 服务脚本: /usr/lib/systemd/system/vsftpd.service /etc/rc.d/init.d/vsftpd 配置文件:/etc/vsftpd/vsftpd.conf man 5 vsftpd.conf 格式:option=value 注意:= 前后不要有空格 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp 系统用户共享文件位置:用户家目录 虚拟用户共享文件位置:为其映射的系统用户的家目录

  • 被动模式端口范围,只允许10个端口打开。
ftp_data_port=2020
pasv_min_port=6000 0为随机分配
pasv_max_port=6010
use_local_time
  • 匿名用户
anonymous_enable=YES 支持匿名用户  
no_anon_password=YES
anon_world_readable_only 只能下载全部读的文件
#给ftp上传修改权限
anon_upload_enable=YES 匿名上传,注意:文件系统权限setfacl -m u:ftp:rwx /vat/ftp/pup
anon_mkdir_write_enable=YES
anon_umask=077 指定匿名上传文件的umask
anon_other_write_enable=YES 可删除和修改上传的文件
#指定上传文件的默认的所有者和权限
chown_uploads=YES(默认NO)
chown_username=wang
chown_upload_mode=0644
  • 系统用户的设置
guest_enable=YES #所有系统用户都映射成guest用户
guest_username=ftp #配合上面选项才生效,指定guest用户,
local_enable=YES #是否允许linux用户登录
write_enable-YES #允许linux用户上传文件
local_umask=022 #指定系统用户上传文件的默认权限
local_root=/ftproot #非匿名用户登录所在目录。
##禁锢所有系统用户在家目录中
chroot_local_user=YES #(默认NO,不禁锢)禁锢系统用户
##禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反
chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list
#当chroot_local_user=YES时,则chroot_list中用户不禁锢
#当chroot_local_user=NO时,则chroot_list中用户禁锢
  • wu-ftp日志:默认启用
xferlog_enable=YES (默认)启用记录上传下载日志
xferlog_std_format=YES (默认)使用wu-ftp日志格式
xferlog_file=/var/log/xferlog (默认)可自动生成
  • vsftpd日志:默认不启用
dual_log_enable=YES 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log(默认)可自动生成
  • 登录提示信息
ftpd_banner="welcome to mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt 优先上面项生效
^[[1;5;32mwelcome to my ftp server^[[0m
  • 目录访问提示信息
dirmessage_enable=YES (默认)
message_file=.message(默认)信息存放在指定目录下.message
  • pam模块
使用pam(Pluggable Authentication Modules)完成用户认证
pam_service_name=vsftpd
pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers 默认文件中用户拒绝登录
是否启用控制用户登录的列表文件
userlist_enable=YES 默认有此设置
userlist_deny=YES(默认值)黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/users_list 此为默认值
连接限制
max_clients=0 最大并发连接数
max_per_ip=0 每个IP同时发起的最大连接数
vsftpd服务指定用户身份运行
nopriv_user=nobody

实现基于文件验证的vsftpd虚拟用户

  • 创建虚拟用户文件,以后远程登录ftp服务器的用户及密码保存文件点。
$ cd /etc/vsftpd/
$ cp vsftpd.conf vsftpd.conf.bak
$ vim vsftpusers
ftpuser1
centos
ftpuser2
hong
ftpuser3
rhel
$ db_load -T -t hash -f vsftpusers vsftpusers.db
$ file vsftpusers.db 
$ chmod 600 vsftpusers
  • 创建系统的虚拟用户,远程登录用户映射成为系统虚拟用户。
$ useradd -r -d /data/ftp -s /sbin/nologin vuser
$ mkdir  /data/ftp/upload
$ chown  -R vuser.vuser /data/ftp
$ setfacl -m u:vuser:rwx upload/
$ chmod -w /data/ftp
  • 配置vsftpd服务器,有pam模块认证,有授权映射虚拟用户。设置不同虚拟用户对应的相应配置文件不同,ftpuser1实现能上传文件,ftpuser2实现家目录为/ftproot
$ vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vsftpusers
account required pam_userdb.so db=/etc/vsftpd/vsftpusers
$ vim /etc/vsftpd/vsftp.conf
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.db
user_config_dir=/etc/vsftpd/vusers.d/                                           
$ mkdir vusers.d
$ vim vusers.d/ftpuser1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
$ vim vusers.d/ftp2
local_root=/ftproot
$ mkdir /ftproot
$ touch /ftproot/test
$ systemctl restart vsftpd
  • 进行试验,远程链接ftp服务器,以ftpuser1登录,能上传文件,以ftpuser2登录,家目录为/ftproot
$ftp 192.168.1.18
Connected to 192.168.1.18 (192.168.1.18).
220 (vsFTPd 3.0.2)
Name (192.168.1.18:root): ftpuser1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> cd upload
250 Directory successfully changed.
ftp> pwd
257 "/upload"
ftp> !ls
ca-bundle.crt  ca-bundle.trust.crt  make-dummy-cert  Makefile  renew-dummy-cert
ftp> put Makefile
local: Makefile remote: Makefile
227 Entering Passive Mode (192,168,1,18,101,13).
150 Ok to send data.
226 Transfer complete.
$ftp 192.168.1.18
Connected to 192.168.1.18 (192.168.1.18).
220 (vsFTPd 3.0.2)
Name (192.168.1.18:root): ftpuser2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> cd upload
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,1,18,66,111).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jun 25 06:31 test
226 Directory send OK.